显式定义变量数据类型,而不是使用关键字“ var”?[关闭]


35

在C#中,我是否鼓励为每个变量声明使用通用var关键字?如果是,我是否必须在变量声明中提及那些用于字面值的特殊字符,例如以下语句中的M代表小数:

var myDecimal = 14.5M;

如果有什么不同,我正在尝试使用C#进行一些Web开发。


7
在SO(IMHO所属的地方)有12个骗子。

1
随着C ++ 0x的重新定位,C ++也面临着同样的问题auto
David Thornley,

5
:C#编译器团队的埃里克利珀最近在博客这个blogs.msdn.com/b/ericlippert/archive/2011/04/20/...
蒂姆·古德曼

这个问题有60亿重复。
DeadMG

@DeadMG赚了60亿。
wassimans 2011年

Answers:


53

关于var的使用存在很多争议。我的一般规则如下。

  • 当类型很明显(例如,赋值的右手是构造函数)时,请使用var。
  • 当类型复杂时,例如LINQ查询(首先使用var的原因),请使用var。
  • 对于要确保正确键入变量的矛盾类型(以“十进制”为例),请将其拼写出来。
  • 匿名类型必须使用var。
  • 在所有其他情况下,请说明类型。

基本上,目标是使阅读代码更容易。如果您认为var足够了,因为分配很明显,请使用var。当您认为有必要时,请使用完整的类型名称作为提示给读者。


9
我在foreach语句中只使用枚举集合,而不必关心每个项目的类型,因此也使用了'var' 。
亚当李尔

1
而且正如杰西(Jesse)指出的匿名类型一样;)
迈克尔·布朗

4
@AnnaLear有时,您还是必须在意。在这种情况下,foreach(datatable.Rows中的var行)在这种情况下var是一个对象,而不是人们期望的DataRow。
Thanos Papathanasiou

@ThanosPapathanasiou好的,是的。Windows窗体中的Controls集合以及其他情况也一样。
亚当李尔

我通常使用var,除非要确定变量的类型(例如,当我希望确定值是双
精度

14

什么时候使用var是编程“圣战”。恰好有一个地方需要它:操作的结果创建匿名类型时,例如:

var result = new { Name = "John", Age = 35 };

在其他任何地方,它是可选的,并且在其他情况下是否使用它实际上取决于您的编码标准。

是的,您将需要特殊的文字字符,以使编译器知道它在右侧的含义。在您的示例中,如果不使用M,则默认值为double而不是decimal


1
忘记了所有有关匿名类型的信息!
迈克尔·布朗

在我的上一份工作中,我被告知如果我继续使用“ var”关键字会被解雇……
hanzolo 2013年

太极端了,但这是您公司的主动权。不过,很高兴这是您的“最后”工作!:)
Jesse C. Slicer

7

从MSDN

但是,使用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大部分时间都会使用(接口类型变量之类的东西除外)。它使代码保持简洁,从而提高了可读性。不过,尽管如此-请注意解析类型的真正含义。


想知道是什么改变了您的想法,@ 3Dave。我仍然100%同意您的原始观点:“ var懒惰,没有任何实际好处,并且在已经很复杂的过程中又引入了另一个潜在的失败点”。

@Dan确实归结为可读性。有能力的开发人员可以快速确定声明的初始化方面没有问题。就像不使用this.任何地方,或者说System.Blah.SomeType而不是使用using,我仍然觉得这很烦人一样,更简洁的代码(至少对我来说)通常更易于视觉解析。在许多情况下,显式键入是正确的选择。但是,如今,我比只是试图将干净的代码发布出去的人要少一些语言律师。
3Dave

@丹(当然,我也是人使用using namespace std;在.cpp文件(不是头,我宁愿避免被柏油和羽毛)。
3Dave

3

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);
    }

0

var关键字仅请求编译器自动推断var type变量的类型。因此,如果要将十进制类型的变量存储在var变量中,则需要使用m。同样,如果要存储字符串,则需要将其用引号引起来。


0

对我来说,在以下情况下我不使用var:

  • 当我想确定变量的类型时(例如,确保使用的类型是double而不是小数,这是一件大事,请相信我!)
  • 多态代码,例如Fruit foo = new Apple();。在这种情况下,我认为var是为了避免和使用父类(这里是Fruit),因为它可以更好地理解代码逻辑和限制可能的错误(使用var,无需检查多态概念!)

对于其余部分,我认为这取决于情况和开发人员的背景。来自PHP世界的某些人可能不喜欢处理变量类型,而来自Java世界的一些人只会认为var是一个异端,越冗长越好。

您将必须发表您的个人意见:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.