在C#中使用var和default进行声明

时间:2011-09-06 11:20:33

标签: c# default var

最近我看到一个人大量使用var和default关键字来声明变量(以及每个声明),如下所示:

var employee = default(Employee);   //Employee is a class
var errorInfo = default(ErrorInfo); //ErrorInfo is struct; Blank is default value
var salary = default(Double);
var isManager = default(Boolean?); 

而不是使用:

Employee employee = null;           //Employee is a class
ErrorInfo errorInfo = Blank;        //ErrorInfo is struct; Blank is default value
Double salary = 0.0;
Boolean? isManager = null;

或者,而不是使用偶数:

Employee employee;                  //Employee is a class
ErrorInfo errorInfo;                //ErrorInfo is struct; Blank is default value
Double salary;
Boolean? isManager;

现在使用var和default来声明每个变量是我不习惯的。

想知道:
- 如果这是推荐的做法?
- 您的观点和偏好?

PS:
- 已经完成Use of var keyword in C#Use of "var" type in variable declarationhttps://stackoverflow.com/questions/633474/c-do-you-use-var,但是,认为这个问题虽然相关但略有不同,因为它仅仅是在声明/初始化周围,而不是在作业周围。 - 我理解snipped 2和snippet 3之间的区别。但是,问题更多的是片段1 - 如果你强烈认为这个问题属于程序员,那么stackexchange随意移动。

5 个答案:

答案 0 :(得分:8)

我不会对“var”发表任何意见,过去曾有过关于此事的评论和讨论(足够如此; - )

关于“default()”我不会用它来初始化已知的类型,而只是用于泛型。通过允许您提供默认(返回)值或可用于比较,它有助于透明地处理值类型或引用类型。

答案 1 :(得分:4)

好吧,default关键字不是我认为最常用的关键字,在我看来,它在泛型方面最有效,例如:

public class Foo<T>{

    private T _instance;
    public Foo<T>(){
        _instance = default(T);
    }
}

以获取T的新默认实例 实际上没有理由像你的帖子那样使用它。

然而,使用var是一个不同的问题,许多人认为这是一个可读性问题。当我编写代码时,我默认为var因为我觉得它更容易阅读:

var me = new Person();

在可读性方面似乎有点多余

Person me = new Person();

我建议var的另一个案例是,如果有什么变化。请考虑以下示例:

public decimal Calculate(decimal one, decimal two){
    return one + two;
}

代码中的其他地方:

decimal d = Calculate(1M, 2M);

如果由于某种原因将Calculate的返回类型更改为double,则需要更改强烈定义变量的所有位置。

如果您改为

var d = Calculate(1M, 2M)
你不必担心这个。 Double / Decimal示例有点简单,但就重构和接口类而言,我发现它非常有用。

答案 2 :(得分:2)

我认为这是一种不好的做法,它会阻止编译器(和第三方工具)捕获与初始化变量失败相关的错误。一般来说,我尽量保持声明和作业彼此接近。分配不打算用于变量的值可能会引入难以捕获的细微错误。通常我要么:

SomeType variable1; //want to store something that will be out of scope later
using(blah)
{
    //...
    variable1=blah;
}
//use variable1 here

或立即指定所需的值:

SomeType variable2 = new SomeType();
//use variable2 immediately

或(对我而言,现在更频繁)

var variable2 = new SomeType();

指定null /占位符值主要是没有意义的。

答案 3 :(得分:0)

我使用var进行分配。但是我总是使用该类声明实例。我通常也会在当时实例化它们以避免意外的NullReferenceExceptions

答案 4 :(得分:0)

代码没问题。

请确保您不复制此技术以初始化0不是默认值或flagged枚举的枚举。

[Flags]
public enum MyFlags
{
    Test = 1,
    Test2 = 2
}

MyFlags flags = default(MyFlags);
Console.WriteLine(flags); // oops