2012-07-12 61 views
1

我在网上阅读(http://www.codinghorror.com/blog/2005/07/for-best-results-dont-initialize-variables.html),我们不应该初始化变量。如何避免这些变量的初始化?

不知何故,我不明白它。我经常无法避免这种情况。让我们看一个简单的例子:

public int test(string s) 
{ 
    int start = 0; 
    int mod = 2; 
    int output = 0; 

    foreach (int i in s) 
    { 
    output = output + (i % mod) + start; 
    start++; 
    } 

    return output; 
} 

确定它可能是废话:-)但问题是:我可以避免初始化吗?也许它不可能为mod,因为mod从一开始就必须是2并且它会留2.但开始输出如何?我不能写int start,因为那总是Error Use of unassigned local variable。也许int start = null会更好,但在这种情况下,它不会工作。那么如何避免这些东西?

+1

foreach(int我在s中)可能不会编译? – Anton 2012-07-12 13:47:14

+4

不要打扰。这篇文章归结为极端的微观优化,并且提议几乎没有影响。你必须编写更多的代码来检查一个未初始化的'output',并且如果为true则赋值。对于价值类型来说,这是一个100%不存在的问题。 – 2012-07-12 13:48:00

+1

int的默认值为0。 – albertjan 2012-07-12 13:48:39

回答

5

您误解了他的文章。在他的文章中,他特别提到了关于类的变量的初始化。在你提出的情况下,你的变量在被使用之前应该被初始化,因为它们会被立即使用。

编辑:是的,在这个特定的情况下,int变量不需要初始化,因为编译器会自动初始化一个int为0,但如果这被认为是在不同程度上与stringDateTime,初始化就变得很重要在方法的上下文中。

+0

在这种情况下,只有返回的变量需要在从方法返回之前进行初始化。 – stevethethread 2012-07-12 13:54:10

+1

@SteveSolomon:微观分析他的具体例子忽略了他原来的问题。用字符串或日期时间替换整数,初始化变得立即相关。 – 2012-07-12 13:55:40

+0

@HenkHolterman:在类中,是的,但在方法中,在使用它之前未明确初始化DateTime时,我收到了编译时错误。 – 2012-07-12 17:25:46

5

您误解了文章。本文讨论的是成员变量(自动初始化为默认值,因此不需要显式初始化),但是您试图将规则应用于局部变量(不会自动初始化,因此需要显式初始化)。

1

你可以重写你的方法是这样

public int Test(string s) { 
      const int mod = 2; 
int start;     
int output = 0; 

      foreach(int i in s) { 
       output = output + (i % mod) + start; 
       start++; 
      } 

      return output; 
     } 

在这种情况下,开始变量不需要被初始化,这是事实无论是在内部或外部范围声明。

但是,由于输出变量将由方法返回,因此输出变量确实需要初始化,并且如果循环从不运行,变量将永远不会被初始化。

+0

'int output;'就足够了,默认为0 – albertjan 2012-07-12 13:50:50

+0

@the_ajp错误使用未分配的本地变量 – miri 2012-07-12 13:52:55

+0

尝试一下,看看它不会编译。 for循环可能永远不会执行,所以输出在返回之前永远不会被初始化。 – stevethethread 2012-07-12 13:57:18

-2

本文正在讨论不使用默认值初始化变量。例如,

int x = 0; 

不好。此外,您应该在它的使用是一个干净的代码之前初始化(并声明)该变量。

构造函数中的初始化不只是在使用之前。