在C#中使用哪一个更好,为什么?

11

哪种使用方式更好?

int xyz = 0;

或者

int xyz= default(int);


4
尝试使代码更清晰、更简单。 - user240141
8个回答

35
int xyz = 0;

为什么要让人们思考得比必要的多?default在通用代码中很有用,但在这里没什么作用。你还应该考虑是否在正确的位置初始化它,并赋予一个有意义的值。有时候,你会看到像这样的堆栈变量的代码:

int xyz = 0;

if(someCondition)
{
  // ...
  xyz = 1;
  // ...
}
else
{
  // ...
  xyz = 2;
  // ...
}

在这种情况下,您应该延迟初始化,直到您拥有真实的值。请执行以下操作:

int xyz;

if(someCondition)
{
  // ...
  xyz = 1;
  // ...
}
else
{
  // ...
  xyz = 2;
  // ...
}

编译器确保您不使用未初始化的堆栈变量。 在某些情况下,您必须使用无意义的值,因为编译器无法知道代码是否会执行(由于异常、调用 Exit 等)。 这是规则的例外(不是双关语)。


2
过度思考:xyz = 0 表示 x = 0 或 y = 0 或 z = 0(有时候?) - TNi
2
我完全同意Matthew的观点。但是对于他(简单的)本地变量初始化示例,我更喜欢“int x = someCondition?1:2;”,因为它更紧凑,并清楚地显示它是单个值赋值。尽可能在使用之前直接创建局部变量。 - rotti2
@rotti,如果只有这段代码,我可能会做同样的事情。我已经澄清了我是在考虑更大的示例。 - Matthew Flaschen

14

这取决于你想要实现什么。

我更喜欢

int xyz = 0;

我相信 default 关键字更易读且不会混淆。

default 关键字在泛型中使用最合适。


9
default 运算符的目的是为类型提供默认值,但它主要是为了允许泛型具有其泛型类型参数声明的值的有效值而添加的。
我没有确凿的证据,但我怀疑编译器在您特定情况下会发出相同的代码。
然而,在这里,default 有一个合法的用途:
public T Aggregate<T>(IEnumerable<T> collection, Func<T, T, T> aggregation)
{
    T result = default(T);

    foreach (T element in collection)
        result = aggregation(result, element);

    return result;
}

没有default,上面的代码需要一些技巧才能编译和正常运行。因此,使用第一个选项,将其设置为0

5

你的代码之间没有性能差异。为了更清晰地看到,请使用 int xyz = 0;。


3

鉴于发出的CIL代码是相同的(您将获得

  IL_0001:  ldc.i4.0
  IL_0002:  stloc.0

在这两种情况下,规则是选择你认为更好地传达了代码意图的那个。通常,感觉问题是主观的且难以决定;但在这种情况下,如果我是代码审查者,我必须被呈现出一个极其令人信服的理由来接受乍一看完全多余使用default()的做法。

2

int xyz = default(int);

这种方式在使用泛型时非常有用,因为它可以让你灵活地获取任何类型的默认值。

int xyz = 0;

另一方面,这种方法简单快捷,但显然不能用于泛型情况。

两种方法都有其优缺点。

祝好!


0

int xyz = 0 更清晰,defaut通常与泛型一起使用


0

最好的是

int xyz;

由于无法访问未初始化的变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接