【问题标题】:Use of var and default for declaration in C#在 C# 中使用 var 和 default 进行声明
【发布时间】:2011-09-06 11:20:32
【问题描述】:

最近我看到一个人大量使用 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 和 sn-p 3 之间的区别。但是,问题更多的是关于 sn-p 1。
- 如果您强烈认为这个问题属于程序员 stackexchange,请随意移动。

【问题讨论】:

  • 我同意,任何让您认为“我想知道 errorInfo 的默认值是什么”的东西都会降低可读性。尤其是如果您必须深入挖掘源头才能找到答案。
  • @Ben:我不明白你的评论。为什么需要挖?引用类型的默认值始终为 null
  • @Daniel 是的,但是这个例子中的 errorInfo 是一个你从未听说过的任何随机类型乍一看都可能是的结构。
  • 是的,我想这与仅使用 = new ErrorInfo() 没有什么不同

标签: c# default var


【解决方案1】:

我不会说任何关于“var”的事情,过去已经有 cmets 和讨论过(足够了 ;-)

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

【讨论】:

    【解决方案2】:

    嗯,default 关键字不是我认为最常用的关键字,我认为它在泛型方面最能发挥其作用,如下所示:

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

    为了获得 T 的一个新的默认实例。 确实没有理由像您帖子中的场景 1 那样使用它。

    然而,使用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 示例有点简单,但在重构和接口类方面,我发现这非常有用。

    【讨论】:

      【解决方案3】:

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

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

      分配空值/占位符值主要是没有意义的。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          代码没问题。

          只要确保不要复制此技术来初始化 0 不是默认值或 flagged 枚举的枚举。

          [Flags]
          public enum MyFlags
          {
              Test = 1,
              Test2 = 2
          }
          
          MyFlags flags = default(MyFlags);
          Console.WriteLine(flags); // oops
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-12
            • 2012-04-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-13
            相关资源
            最近更新 更多