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

时间:2010-07-08 06:12:49

标签: c#

哪一个更好用?

int xyz = 0;

OR

int xyz= default(int);

8 个答案:

答案 0 :(得分: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等)。这是规则的例外(没有双关语)。

答案 1 :(得分:14)

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

我更喜欢

int xyz = 0;

因为我相信它更具可读性而且不会混淆。

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

答案 2 :(得分:9)

default运算符的目的是为您提供类型的默认值,但主要是为了允许泛型为声明为泛型类型参数的值赋予有效值。 / p>

我没有确凿的证据,但我怀疑编译器会在您的具体案例中为两者发出相同的代码。

但是,这里合法使用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

答案 3 :(得分:5)

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

答案 4 :(得分:3)

鉴于发出的CIL是相同的(你得到

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

在这两种情况下),规则是选择您认为更好地传达代码的 intent 的那个。通常,感觉问题是主观的,难以决定的;然而,在这种情况下,如果我是代码审查员,我必须得到一个非常令人信服的理由来接受第一眼看上去完全是多余使用default()的内容。

答案 5 :(得分:2)

int xyz = default(int); 在使用Generics bcoz时,我喜欢这种方式,它可以让您灵活地获得您正在使用的任何类型的默认值。

int xyz = 0; 另一方面,这很容易和快速,显然在通用情况下不起作用。

两者各有利弊。

此致

答案 6 :(得分:0)

int xyz = 0更清楚,defaut通常用于泛型

答案 7 :(得分:0)

最好的是

int xyz;

因为您无法访问未初始化的变量。