如果问题是基于意见的,请提前道歉。为什么要在C#中声明局部变量时选择以下三个中的第一个变体?
var list1 = new List();
List list2 = null;
var list1 = new List();
var list2 = (List)null;
// this variant would allow easy refactoring from class to struct
var list1 = new List();
var list2 = default(List);
虽然这是不可能的:
var list1 = new List(), list2 = null;
EDITED提供上下文:
void DoSomething(Action action) { /* ... */ }
// ..
var list1 = new List();
List list2 = null;
// ...
DoSomething(() => { list2 = new List(); list2.Add(1); });
答案 0 :(得分:4)
var
更短,有些人更喜欢明确指定类型。在匿名类型的上下文中,除了使用var
之外,您没有其他选项,例如在
var point = new { X = 1, Y = 2 }
var
只是语法糖。不指定类型并不意味着它是动态的。它只表示编译器会根据用法推断出类型。最后,编译的代码是相同的。
在我们的团队中,当右侧是以下之一时,我们在左侧使用var
标准:
在所有其他情况下,我们的内部标准不允许var
,因为在其他情况下,可能无法明确清楚变量类型对读者的影响(即使编译器知道)。例如,如果您有这样的声明:
var x = SomeMethod();
x
的类型是什么?编译器知道,因为它知道SomeMethod()
返回什么。你还记得吗?你还记得申请中的每一种方法吗?我们发现在这些情况下不使用var
更具表现力。
对于null
值,我总是指定类型。演员等似乎只是一个奇怪的机制,允许你使用var
,而它什么都没有给你带来任何好处。
List list = null;
答案 1 :(得分:1)
在第2种情况下,您所做的就是告诉编译器该列表将成为List类型对象,并且它将被初始化为null。你可以做到这一点,但这是一种将变量声明为List类型的迂回方式。
如果您正在处理泛型,那么您只想使用案例3。关键是你可能不知道类型是引用类型还是值类型,var list = null不是值类型的有效语句。 default关键字将确保为引用类型设置null,为值类型设置0。
答案:
根据MSDN Reference: Implicitly Typed Local Variables
var只能在同一语句中声明和初始化局部变量时使用;该变量不能初始化为null,也不能初始化为方法组或匿名函数。