可能重复:
Use of var keyword in C#
在C#中,关键字var
如何运作?
答案 0 :(得分:154)
这意味着声明的本地类型将由编译器推断:
// 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
只有两种用途:
var foo = new { Bar = "bar" };
您不能将var
用作除本地人之外的任何类型。因此,您无法使用关键字var
来声明字段/属性/参数/返回类型。
答案 1 :(得分:14)
这意味着数据类型是从上下文派生(隐含)的。
来自http://msdn.microsoft.com/en-us/library/bb383973.aspx
从Visual C#3.0开始,变量 在方法范围声明的可以 有一个隐式类型var。一个 隐式键入的局部变量是 强烈打字,就像你有 自己宣布了类型,但是 编译器确定类型。该 以下是我的两个声明 在功能上等同于:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
var
对于消除键盘输入和视觉噪音非常有用,例如,
MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();
变为
var x = new MyReallyReallyLongClassName();
但可能会被滥用到牺牲可读性的程度。
答案 2 :(得分:7)
“var”表示编译器将根据用法确定变量的显式类型。例如,
var myVar = new Connection();
会给你一个Connection类型的变量。
答案 3 :(得分:6)
它根据初始化中分配给它的内容声明一个类型。
一个简单的例子就是代码:
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);
除了使用i
之外,没有其他方法可以定义j
和var
,因为它们所拥有的类型没有名称。
答案 4 :(得分:5)
您是否曾经讨厌编写此类变量初始值设定项?
XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))
因此,从C#3.0开始,您可以用
替换它var xmlSerializer = new XmlSerialzer(typeof(int))
一个通知:在编译期间解析了类型,因此没有性能问题。但是编译器应该能够在构建步骤中检测类型,因此像var xmlSerializer;
这样的代码根本不会编译。
答案 5 :(得分:0)
int i = 100;// explicitly typed
var j = 100; // implicitly typed
答案 6 :(得分:0)
var是C#中的“上下文关键字”,意味着您只能在与使用变量的同一类的上下文中隐式地将其用作局部变量。如果尝试在从“ Main”或其他外部类或某个接口调用的类中使用它,则会出现错误CS0825 <{https://docs.microsoft.com/en-us/dotnet/csharp/misc/cs0825>
在此处的文档中查看有关何时可以使用和不可以使用它的说明:<{https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed-local-variables#remarks>
基本上,仅当声明带有隐式值的变量时才应使用此变量,例如“ var myValue =“ This is the value”;例如,与说“ string”相比,这节省了一些时间,但是恕我直言节省了大量时间,并限制了项目的可伸缩性。