用C#初始化POD - 最佳实践

时间:2009-04-05 15:41:27

标签: c# types initialization

据我所知[*],C#将普通旧数据类型(intfloatbool等)默认为合理的值。 int afloat bbool c分别采用值00.0ffalse

假设是这样:

为了清楚起见,我应该明确地给出00.0ffalse的变量值,还是应该隐含值,从而减少我写的代码量,(可以说)减少我可以引入程序的错误数量?

[*]老实说,经过10分钟的谷歌搜索,我很难找到确认这一点的相关文档!如果有人向我指出,我会修改这个问题!

7 个答案:

答案 0 :(得分:4)

C#将任何默认值分配给本地变量。这些默认值仅适用于字段(类成员)。

如果在首次使用之前没有为本地变量赋值,则会出现编译时错误

static void Test() {
   int x;
   Console.WriteLine(x); // compile time error.
}

答案 1 :(得分:4)

我想说不要初始化它们(字段)。如果没有它们会发生什么事情将会非常清楚。

我还要说,在你为它们设置一个有意义的值之前不要初始化局部变量,例如:我经常看到类似于以下示例的代码:

private void SomeMethod()
{
    SomeObject myObj = null;

    if (SomeCondition)
    {
        myObj = someValue;
    }
    else if (SomeOtherCondition)
    {
        myObj = someValue;
    }
    else
    {
        myObj = someOtherValue;
    }
}

空赋值是多余的,但我实际上觉得它是有害的,好像我们忘记在其中一个代码路径中分配给myObj,例如如果我们在else中分配给yourObj而不是myObj,那么我们最终会将myObj设置为null,这最终会在运行时的某个稍后点显示为空引用异常。如果没有inital null赋值,那么这将是一个编译错误 - 更容易处理。

答案 2 :(得分:2)

对于静态/实例变量和数组元素,是的,默认它们是合适的。请参阅C#3.0规范的第5.2节:


以下类别的变量会自动初始化为默认值:

  • 静态变量。
  • 类实例的实例变量。
  • 数组元素。

变量的默认值取决于变量的类型,并确定如下:

  • 对于value-type的变量,默认值与value-type的默认构造函数(第4.1.2节)计算的值相同。
  • 对于reference-type的变量,默认值为null。

初始化为默认值通常通过让内存管理器或垃圾收集器在分配使用之前将内存初始化为所有位为零来完成。因此,使用all-bits-zero表示空引用很方便。


局部变量无关紧要,因为无论如何都无法使用它们。

至于你是否应该明确地初始化它们,这主要取决于个人偏好。例如,如果它将在构造函数中重新分配,我通常不会在声明中赋值。

说实话,这真的不是我在可读性方面感到兴奋的话题。

答案 3 :(得分:1)

成员变量初始化为其默认值(即零或空)。

如果您将默认值分配给成员变量并进行代码分析,它会捕获此信息并为您提供DoNotInitializeUnnecessarily警告。

答案 4 :(得分:0)

下面的主观答案:)

我觉得不应该将成员变量初始化为默认值。它是冗余的,不会为代码添加太多/任何值。

我发现大多数这样做的人都有很强的C ++背景,因此他们已经根深蒂固,你必须初始化成员变量才能编写正确的代码(我在这里感到内疚)。因此,这种做法只是转换为C#,而实际上并不是必需的。

但这不是我失去了很多睡眠的东西。如果人们默认初始化他们的变量,我可能会在代码审查中添加一个挑剔评论,但我并没有真正对它采取强硬立场。

答案 5 :(得分:0)

当CLR初始化基本类型时,它通过将该类型的所有位清零来实现。因此,就 CLR 而言,以下是:

int i;
bool b;

等同于:

int i = 0;
bool b = false;

然而,C#编译器会在您在表达式中使用它之前初始化变量。我总觉得这有点奇怪,但这些都是规则。

答案 6 :(得分:0)

不断接触许多不同的编程语言,我永远不会相信编译器/解释器为我赋予变量默认值。自己做这件事是微不足道的,并确保变量没有初始化:

  • random data在记忆中闲逛
  • by user input fields,这是一种潜在的安全风险,尤其是在与数据库交互时使用该数据时,或者更糟糕的是,与操作系统交互时使用