在C#中,我是否鼓励为每个变量声明使用通用var关键字?如果是,我是否必须在变量声明中提及那些用于字面值的特殊字符,例如以下语句中的M代表小数:
var myDecimal = 14.5M;
如果有什么不同,我正在尝试使用C#进行一些Web开发。
auto
。
在C#中,我是否鼓励为每个变量声明使用通用var关键字?如果是,我是否必须在变量声明中提及那些用于字面值的特殊字符,例如以下语句中的M代表小数:
var myDecimal = 14.5M;
如果有什么不同,我正在尝试使用C#进行一些Web开发。
auto
。
Answers:
关于var的使用存在很多争议。我的一般规则如下。
基本上,目标是使阅读代码更容易。如果您认为var足够了,因为分配很明显,请使用var。当您认为有必要时,请使用完整的类型名称作为提示给读者。
foreach
语句中只使用枚举集合,而不必关心每个项目的类型,因此也使用了'var' 。
什么时候使用var
是编程“圣战”。恰好有一个地方需要它:操作的结果创建匿名类型时,例如:
var result = new { Name = "John", Age = 35 };
在其他任何地方,它是可选的,并且在其他情况下是否使用它实际上取决于您的编码标准。
是的,您将需要特殊的文字字符,以使编译器知道它在右侧的含义。在您的示例中,如果不使用M
,则默认值为double
而不是decimal
。
但是,使用var确实至少有潜力使您的代码更难以为其他开发人员所理解。因此,C#文档通常仅在需要时才使用var。
我真的非常不喜欢隐式键入。从表面上看,它倾向于使代码更具可读性,但可能会导致很多问题。如果开发人员更改了变量初始值设定项,例如
var myFloat=100f;
至
var myFloat=100;
要么
var myFloat=100.0;
类型将改变,从而导致整个编译器错误,或者,如果它在Web视图中并且您没有使用构建后步骤来预编译视图,则将导致整个运行时错误,如果不有效,这些错误将无法捕获。部署前测试。
隐式键入也不是在所有地方都有效(来自同一MSDN链接)
var只能在同一语句中声明和初始化局部变量时使用;该变量不能初始化为null,方法组或匿名函数。
var不能在类范围内的字段上使用。
使用var声明的变量不能在初始化表达式中使用。换句话说,此表达式是合法的:int i =(i = 20); 但是此表达式会产生编译时错误:var i =(i = 20);
多个隐式类型的变量不能在同一条语句中初始化。
如果范围内名为var的类型,则var关键字将解析为该类型名称,并且不会被视为隐式类型的局部变量声明的一部分。
使您的代码保持一致(在这种情况下,请在各处使用显式键入)是一件非常非常好的事情。我认为,这var
是懒惰的,没有任何实际好处,并且在已经很复杂的过程中又引入了另一个潜在的失败点。
2017更新
我彻底改变了主意。在C#中工作时,我var
大部分时间都会使用(接口类型变量之类的东西除外)。它使代码保持简洁,从而提高了可读性。不过,尽管如此-请注意解析类型的真正含义。
this.
任何地方,或者说System.Blah.SomeType
而不是使用using
,我仍然觉得这很烦人一样,更简洁的代码(至少对我来说)通常更易于视觉解析。在许多情况下,显式键入是正确的选择。但是,如今,我比只是试图将干净的代码发布出去的人要少一些语言律师。
using namespace std;
在.cpp文件(不是头,我宁愿避免被柏油和羽毛)。
C#参考显示以下内容,以说明此构造的优缺点:
以下示例显示了两个查询表达式。在第一个表达式中,允许但不要求使用var,因为可以将查询结果的类型显式声明为IEnumerable。但是,在第二个表达式中,必须使用var,因为结果是匿名类型的集合,并且该类型的名称只能由编译器本身访问。请注意,在示例2中,还必须隐式键入foreach迭代变量项。
// Example #1: var is optional because
// the select clause specifies a string
string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
var wordQuery = from word in words
where word[0] == 'g'
select word;
// Because each element in the sequence is a string,
// not an anonymous type, var is optional here also.
foreach (string s in wordQuery)
{
Console.WriteLine(s);
}
// Example #2: var is required because
// the select clause specifies an anonymous type
var custQuery = from cust in customers
where cust.City == "Phoenix"
select new { cust.Name, cust.Phone };
// var must be used because each item
// in the sequence is an anonymous type
foreach (var item in custQuery)
{
Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
}