据我所知 [*],C# 将普通旧数据类型(int
、float
、bool
等)默认为合理值。 int a
、float b
和分别bool c
取值0
、0.0f
和。false
假设是这样:
为了清楚起见,我应该明确地给我的变量值0
、0.0f
和false
,还是应该隐含这些值,从而减少我编写的代码量,(可以说)减少我可以引入程序的错误数量?
[*] 老实说,经过 10 分钟的谷歌搜索,我很难找到证实这一点的相关文档!如果有人向我指出,我会修改问题!
据我所知 [*],C# 将普通旧数据类型(int
、float
、bool
等)默认为合理值。 int a
、float b
和分别bool c
取值0
、0.0f
和。false
假设是这样:
为了清楚起见,我应该明确地给我的变量值0
、0.0f
和false
,还是应该隐含这些值,从而减少我编写的代码量,(可以说)减少我可以引入程序的错误数量?
[*] 老实说,经过 10 分钟的谷歌搜索,我很难找到证实这一点的相关文档!如果有人向我指出,我会修改问题!
C#不会为局部变量分配任何默认值。这些默认值仅适用于字段(类成员)。
如果您在首次使用之前没有为局部变量赋值,您将收到编译时错误:
static void Test() {
int x;
Console.WriteLine(x); // compile time error.
}
我会说不要初始化它们(字段)。如果没有它们,将会非常清楚会发生什么。
我还要说,在你为它们获得有意义的值之前不要初始化局部变量,例如,我经常看到类似于以下示例的代码:
private void SomeMethod()
{
SomeObject myObj = null;
if (SomeCondition)
{
myObj = someValue;
}
else if (SomeOtherCondition)
{
myObj = someValue;
}
else
{
myObj = someOtherValue;
}
}
空分配是多余的,但我实际上觉得它是有害的,就好像我们忘记在其中一个代码路径中分配给 myObj 一样,例如,如果我们在 else 中分配给 yourObj 而不是 myObj,那么我们最终会设置 myObj为 null ,这最终将在运行时的某个稍后时间表现为空引用异常。如果没有初始的空赋值,那么这将是一个编译错误——更容易处理。
对于静态/实例变量和数组元素,是的,它确实默认它们是合适的。请参阅 C# 3.0 规范的第 5.2 节:
以下类别的变量会自动初始化为其默认值:
变量的默认值取决于变量的类型,并确定如下:
初始化为默认值通常是通过让内存管理器或垃圾收集器在分配内存之前将内存初始化为所有位为零来完成的。因此,使用全位为零来表示空引用很方便。
局部变量无关紧要,因为它们在被明确分配之前不能使用。
至于是否应该显式初始化它们,这主要是个人喜好问题。例如,如果要在构造函数中重新分配值,我通常不会在声明中分配值。
老实说,就可读性而言,这真的不是一个让我兴奋的话题。
成员变量被初始化为其默认值(即零或空)。
如果您将默认值分配给成员变量并进行代码分析,它会捕捉到这一点并给您一个DoNotInitializeUnnecessarily警告。
下面的主观答案:)
我觉得不应该将成员变量初始化为其默认值。它是多余的,不会为代码增加太多/任何价值。
我发现大多数这样做的人都有 C++ 方面的深厚背景,因此他们根深蒂固地认为必须初始化成员变量才能编写正确的代码(我在这里感到内疚)。因此,这种做法只是在实际上没有必要的情况下转换为 C#。
但这不是我失去很多睡眠的事情。如果人们默认初始化他们的变量,我可能会在代码审查中添加一个挑剔的评论,但我并没有对此采取强硬立场。
当 CLR 初始化一个原始类型时,它会将该类型的所有位清零。因此,就CLR而言,以下内容:
int i;
bool b;
与此等效:
int i = 0;
bool b = false;
但是,C# 编译器要求您在将变量用于表达式之前对其进行初始化。我总是觉得这有点奇怪,但这是规则。