What does "var" mean in C#? [duplicate]
In C#, how does keyword var
work?
It means that the type of the local being declared will be inferred by the compiler based upon its first assignment:
// This statement:
var foo = "bar";
// Is equivalent to this statement:
string foo = "bar";
Notably, var
does not define a variable to be of a dynamic type. So this is NOT legal:
var foo = "bar";
foo = 1; // Compiler error, the foo variable holds strings, not ints
var
has only two uses:
- It requires less typing to declare variables, especially when declaring a variable as a nested generic type.
- It must be used when storing a reference to an object of an anonymous type, because the type name cannot be known in advance:
var foo = new { Bar = "bar" };
You cannot use var
as the type of anything but locals. So you cannot use the keyword var
to declare field/property/parameter/return types.
It means the data type is derived (implied) from the context.
From http://msdn.microsoft.com/en-us/library/bb383973.aspx
Beginning in Visual C# 3.0, variables that are declared at method scope can have an implicit type var. An implicitly typed local variable is strongly typed just as if you had declared the type yourself, but the compiler determines the type. The following two declarations of i are functionally equivalent:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
var
is useful for eliminating keyboard typing and visual noise, e.g.,
MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();
becomes
var x = new MyReallyReallyLongClassName();
but can be overused to the point where readability is sacrificed.
"var" means the compiler will determine the explicit type of the variable, based on usage. For example,
var myVar = new Connection();
would give you a variable of type Connection.
It declares a type based on what is assigned to it in the initialisation.
A simple example is that the code:
var i = 53;
Will examine the type of 53, and essentially rewrite this as:
int i = 53;
Note that while we can have:
long i = 53;
This won't happen with var. Though it can with:
var i = 53l; // i is now a long
Similarly:
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.
This can be a minor convenience with complicated types. It is more important with anonymous types:
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);
Here there is no other way of defining i
and j
than using var
as there is no name for the types that they hold.
Did you ever hated to write such variable initializers?
XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))
So, starting with C# 3.0, you can replace it with
var xmlSerializer = new XmlSerialzer(typeof(int))
One notice: Type is resolved during compilation, so no problems with performance. But Compiler should be able to detect type during build step, so code like var xmlSerializer;
won't compile at all.
- As the name suggested, var is variable without any data type.
- If you don't know which type of data will be returned by any method, such cases are good for using var.
- var is Implicit type which means system will define the data type itself. The compiler will infer its type based on the value to the right of the "=" operator.
- int/string etc. are the explicit types as it is defined by you explicitly.
- Var can only be defined in a method as a local variable
- Multiple vars cannot be declared and initialized in a single statement. For example, var i=1, j=2; is invalid.
int i = 100;// explicitly typed
var j = 100; // implicitly typed
var is a "contextual keyword" in C# meaning you can only use it as a local variable implicitly in the context of the same class that you are using the variable. If you try to use it in a class that you call from "Main" or some other exterior class, or an interface for example you will get the error CS0825 < https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0825 >
See the remarks about when you can and can't use it in the documentation here: < https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed-local-variables#remarks >
Basically, you should only use this when you are declaring a variable with an implicit value such as "var myValue = "This is the value"; This saves a little time in comparison to saying "string" for example but IMHO not much time is saved and places a constraint on the scalability of your project.
精彩评论