声明局部变量

时间:2014-04-02 00:46:39

标签: c# syntax

如果问题是基于意见的,请提前道歉。为什么要在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); });

2 个答案:

答案 0 :(得分:4)

var更短,有些人更喜欢明确指定类型。在匿名类型的上下文中,除了使用var之外,您没有其他选项,例如在

var point = new { X = 1, Y = 2 }

var只是语法糖。不指定类型并不意味着它是动态的。它只表示编译器会根据用法推断出类型。最后,编译的代码是相同的。

在我们的团队中,当右侧是以下之一时,我们在左侧使用var标准:

  1. 新对象构建
  2. 角色
  3. 匿名
  4. 在所有其他情况下,我们的内部标准不允许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,也不能初始化为方法组或匿名函数。