最近我看到一个人大量使用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 declaration和https://stackoverflow.com/questions/633474/c-do-you-use-var,但是,认为这个问题虽然相关但略有不同,因为它仅仅是在声明/初始化周围,而不是在作业周围。
- 我理解snipped 2和snippet 3之间的区别。但是,问题更多的是片段1
- 如果你强烈认为这个问题属于程序员,那么stackexchange随意移动。
答案 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