哪一个更好用,为什么用c#

Ven*_*nom 11 c#

哪一个更好用?

int xyz = 0;
Run Code Online (Sandbox Code Playgroud)

要么

int xyz= default(int);

Mat*_*hen 35

int xyz = 0;
Run Code Online (Sandbox Code Playgroud)

为什么让人们认为不仅仅是必要的? default对于通用代码很有用,但在这里它不会添加任何内容.您还应该考虑是否在正确的位置初始化它,并且具有有意义的值.有时您会看到堆栈变量,代码如下:

int xyz = 0;

if(someCondition)
{
  // ...
  xyz = 1;
  // ...
}
else
{
  // ...
  xyz = 2;
  // ...
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您应该延迟初始化,直到获得实际值.做:

int xyz;

if(someCondition)
{
  // ...
  xyz = 1;
  // ...
}
else
{
  // ...
  xyz = 2;
  // ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • +1为什么让人们认为超过必要? (2认同)
  • 思考超过必要:xyz = 0表示x = 0或y = 0或z = 0(有时?) (2认同)
  • 我完全赞同马修.但对于他的(简单)局部变量初始化示例,我更喜欢"int x = someCondition?1:2;" 因为它更紧凑,清楚地表明它是一个单一的值赋值.应尽可能在使用之前直接创建局部变量. (2认同)

Inc*_*ito 14

这取决于你想要达到的目标.

我会比较喜欢

int xyz = 0;
Run Code Online (Sandbox Code Playgroud)

因为我相信它更具可读性而且不会令人困惑.

default关键字主要适用于泛型.


ang*_*son 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;
}
Run Code Online (Sandbox Code Playgroud)

没有default,上面的代码需要一些黑客才能编译和正常运行.

所以使用第一个,设置它0.


Ser*_*glu 5

您的代码之间没有性能差异.看清楚使用int xyz = 0;

  • 表现并非唯一的基本指标. (2认同)