C#中的“ var”是什么意思?[重复]


Answers:


160

这意味着要声明的本地类型将由编译器推断:

// This statement:
var foo = "bar";
// Is equivalent to this statement:
string foo = "bar";

值得注意的是,var并未将变量定义为动态类型。因此,这是不合法的:

var foo = "bar";
foo = 1; // Compiler error, the foo variable holds strings, not ints

var 只有两个用途:

  1. 它需要较少的类型来声明变量,尤其是在将变量声明为嵌套泛型类型时。
  2. 在存储对匿名类型的对象的引用时必须使用它,因为类型名称无法事先知道: var foo = new { Bar = "bar" };

var除了本地语言,您不能将其用作任何其他类型。因此,您不能使用关键字var来声明字段/属性/参数/返回类型。


@cdhowie如果一边说,什么var foo = new Foo()foo可能是类型Foo或任何其超类。这怎么可能是合法的?
约翰·斯特罗德

3
@Djack这是非法的,事实并非如此。 var foo = new Foo();是同样的事情Foo foo = new Foo();,这该装置foo可以包含一个Foo参考,或参考一个对象中的任何Foo 的子类型,不是一个Foo 超级类型。
cdhowie

15

这意味着数据类型是从上下文派生(暗示)的。

http://msdn.microsoft.com/zh-cn/library/bb383973.aspx

从Visual C#3.0开始,在方法范围内声明的变量可以具有隐式类型var。隐式类型化的局部变量是强类型的,就像您自己声明了类型一样,但是编译器会确定类型。i的以下两个声明在功能上等效:

var i = 10; // implicitly typed
int i = 10; //explicitly typed

var 对于消除键盘打字和视觉噪音很有用,例如,

MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();

变成

var x = new MyReallyReallyLongClassName();

但可能会过度使用,以至于牺牲了可读性。


9

“ var”表示编译器将根据用法确定变量的显式类型。例如,

var myVar = new Connection();

会给您一个Connection类型的变量。


7

它根据初始化中分配给它的内容声明一个类型。

一个简单的例子是代码:

var i = 53;

将检查53的类型,并将其基本上重写为:

int i = 53;

请注意,虽然我们可以拥有:

long i = 53;

var不会发生这种情况。虽然可以:

var i = 53l; // i is now a long

类似地:

var i = null; // not allowed as type can't be inferred.
var j = (string) null; // allowed as the expression (string) null has both type and value.

对于复杂的类型,这可能是次要的便利。对于匿名类型更重要:

var i = from x in SomeSource where x.Name.Length > 3 select new {x.ID, x.Name};
foreach(var j in i)
  Console.WriteLine(j.ID.ToString() + ":" + j.Name);

这里没有其他定义ij使用的方法,var因为它们所拥有的类型没有名称。


5

您是否曾经讨厌编写这样的变量初始值设定项?

XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))

因此,从C#3.0开始,您可以将其替换为

var xmlSerializer = new XmlSerialzer(typeof(int))

注意:类型在编译过程中已解决,因此性能没有问题。但是Compiler应该能够在构建步骤中检测类型,因此类似的代码var xmlSerializer;根本不会编译。


0
  • 顾名思义,var是没有任何数据类型的变量。
  • 如果您不知道任何方法将返回哪种类型的数据,则这种情况适合使用var。
  • var是隐式类型,这意味着系统将自行定义数据类型。编译器将根据“ =”运算符右侧的值来推断其类型。
  • int / string等是您明确定义的显式类型。
  • Var只能在方法中定义为局部变量
  • 不能在单个语句中声明和初始化多个var。例如,var i = 1,j = 2;是无效的。
int i = 100;// explicitly typed 
var j = 100; // implicitly typed

0

var是C#中的“上下文关键字”,这意味着您只能在与使用变量的同一类的上下文中隐式地将其用作局部变量。如果尝试在从“ Main”或其他外部类或某个接口调用的类中使用它,则将收到错误CS0825 < https://docs.microsoft.com/zh-cn/dotnet/ csharp / misc / cs0825 >

请参阅以下文档中有关何时可以使用和不可以使用它的说明:< https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed -local-variables#备注 >

基本上,仅当声明带有隐式值的变量时才应使用此变量,例如“ var myValue =“ This is the value”;例如,与说“ string”相比,这节省了一些时间,但是恕我直言,这不是很多时间保存并限制了项目的可伸缩性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.