代码之家  ›  专栏  ›  技术社区  ›  Beska

我应该始终/永远/从不将对象字段初始化为默认值吗?

  •  33
  • Beska  · 技术社区  · 16 年前

    this 但我突然想到,我不确定让它这样做是否总是个好主意。我的想法是,如果我看到这样的声明:

    int myBlorgleCount = 0;
    

    我有一个很好的想法,程序员希望计数从零开始,至少在不久的将来是可以的。另一方面,如果我只是看到:

    int myBlorgleCount;
    

    :虽然我确实说过这个问题与语言无关,但它显然不适用于C等不进行值初始化的语言。

    编辑

    17 回复  |  直到 8 年前
        1
  •  24
  •   Anders Hansson    16 年前

    考虑长期维护。

    • 尽可能保持代码的明确性。
    • 如果不需要的话,不要依赖于特定语言的初始化方式。也许新版本的语言会有不同的工作方式?
    • 管理层会感谢你的。

    未来的维护者可能来自不同的背景。这真的不是关于什么是“正确的”,而是从长远来看什么是最容易的。

        2
  •  13
  •   John Saunders    16 年前

    你总是可以安全地假设平台以平台的方式工作。这个。NET平台将所有字段初始化为默认值。如果您看到一个字段未被代码初始化,则表示该字段已被CLR初始化,而不是未初始化。

    这种担忧适用于不保证初始化的平台,但在这里则不然。在。NET,更常表示开发人员的无知,认为初始化是必要的。


    string foo = null;
    foo = MethodCall();
    

    我从那些应该更了解的人身上看到了这一点。

        3
  •  4
  •   Ryan Emerle    16 年前

    在C#中,没有开销,因为值无论如何都是初始化的。在C/C++中,未初始化的值将包含垃圾/未知值(内存位置中的任何值),因此初始化更重要。

        4
  •  4
  •   Daniel Rikowski    13 年前

    我认为,如果这真的有助于使代码更易于理解,那么就应该这样做。

    但我认为这是所有语言功能的一个普遍问题。我对此的看法是: 如果这是该语言的官方特征,你可以使用它。 (当然,有些反功能应该谨慎使用或完全避免,比如缺失 option explicit 在Visual Basic中或C++中的菱形继承)

    有一段时间,我非常多疑,添加了各种不必要的初始化、显式强制转换、偏执狂的try finally块。..我甚至想过忽略自动装箱,用显式类型转换替换所有出现的情况,只是“为了安全起见”。

    问题是:没有尽头。 你可以避免几乎所有的语言功能,因为你不想信任它们。

        5
  •  2
  •   Richard Morgan    16 年前

    我同意你的看法;它可能很冗长,但我喜欢看:

    int myBlorgleCount = 0;
    

    现在,我总是初始化字符串:

    string myString = string.Empty;
    

        6
  •  1
  •   Ross Goddard    16 年前

    如果我不能立即将其设置为有用的东西

    int myValue = SomeMethod();
    

    我将把它设置为0。这更多的是为了避免考虑否则的价值。对我来说,整数总是设置为0的事实并不在我的指尖,所以当我看到

    int myValue;
    

    对于那些拥有现成知识的人来说,他们会遇到

    int myValue = 0;
    

    并想知道为什么那个人会把它设置为零,而编译器只会为他们做这件事。这种想法会打断他们的思考过程。

        7
  •  1
  •   JonnyD    16 年前

    另一方面,类范围的变量应该始终初始化。过去,我们为常见变量类型定义了系统范围内的自定义“null”值。这样,我们总是可以知道哪些是错误未初始化的,哪些是故意初始化的。

        8
  •  1
  •   bloparod    15 年前

    我总是在构造函数中显式初始化字段。对我来说,这是做这件事的地方。

        9
  •  0
  •   Robert P    16 年前

    在较旧且未更改的语言中,期望值是未知的。来自这些语言的程序员保留了这种期望。

    几乎所有现代或托管语言都为最近创建的变量定义了值,无论是来自类构造函数还是语言特性。

        10
  •  0
  •   Sebastian Oliva    16 年前

    你应该这样做,没有必要,但最好这样做,因为你永远不知道你使用的语言是否初始化了值。通过自己做,您可以确保您的值已初始化并设置了标准的预定义值。 做这件事没有什么错,也许只是浪费了一点时间。我强烈推荐它。虽然约翰的赞扬很有启发性,但就一般用途而言,最好走安全的道路。

        11
  •  0
  •   SharePoint Newbie    16 年前

    我通常对字符串这样做,在某些情况下,我不想让null四处浮动。 我工作的普遍共识是“不要对值类型明确地这样做。”

        12
  •  0
  •   James Orr    16 年前

        13
  •  0
  •   Dan Olson    16 年前

    在C和C++中,最佳实践是 初始化您的值。在某些情况下,这将为您完成,例如静态全局变量,但使用大多数编译器冗余初始化这些值不应该对性能产生任何影响。

        14
  •  0
  •   Ray    16 年前

    我不会初始化它们。如果你把声明尽可能靠近第一次使用,那么就不应该有任何混淆。

        15
  •  0
  •   Joan Venge    16 年前

    另一件要记住的事情是,如果你要使用自动属性,你必须依赖隐式值,比如:

    public int Count { get; set; }
    
        17
  •  0
  •   supercat    10 年前

    如果一个字段经常有新的值存储在其中,而不考虑以前的值,并且如果它应该表现得好像一个零最初存储在那里,但零没有什么“特殊”之处,那么该值应该显式存储。

    如果该字段表示一个计数或总计,它永远不会直接写入非零值,而是总是添加或减去其他金额,那么零应该被视为“空”值,因此不需要明确说明。

    要使用粗略的类比,请考虑以下两个条件:

    1. `if(exposition!=0)。..

    在前一种情况下,与文字零进行比较是有意义的,因为它检查的是一个在语义上与其他任何位置都没有区别的位置。然而,在第二种情况下,我建议与文字零的比较不会增加可读性,因为代码并不真正关心表达式的值是否 (flags & WoozleModes.deluxe) 恰好是一个不是零的数字,而是它是否“非空”。

    我不知道有哪种编程语言提供了区分“零”和“空”数值的单独方法,除了在表示空时不要求使用文字零。

    推荐文章