it-swarm.cn

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

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

var myDecimal = 14.5M;

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

35
wassimans

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

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

基本上,目标是使阅读代码更容易。如果您认为var足以满足要求,则请使用var。当您认为有必要时,请使用完整的类型名称作为提示给读者。

54
Michael Brown

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

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

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

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

14
Jesse C. Slicer

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

7
3Dave

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);
    }
3
Thulani Chivandikwa

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

0
ComputerProgrammer

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

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

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

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

0
eka808