在C#中声明局部作用域中的常量是否有任何好处?

时间:2010-09-03 13:49:18

标签: c# const constants

如果我知道我不会修改它的值,那么将局部变量声明为“const”会有什么好处吗?

谢谢,

7 个答案:

答案 0 :(得分:5)

您通常会在整个解决方案中使用const。但是,在本地范围内使用的好处是,您知道范围中的其他位置,您将不会更改它。而且,如果其他人正在处理此代码,他们也会知道不会更改它。 这使得您的程序更易于维护,因为您只需要维护const(即使它只是在本地范围内)

答案 1 :(得分:5)

声明变量const也将允许编译器进行优化 - 而不是说在堆栈上分配int并将其值放在那里,编译器可能只是直接在代码中使用该值

即以下内容:

const int test = 4;
DoSomething(test);

可以编译为

DoSomething(4);

由编译器

修改:对“常量传播”的回复,因为评论框具有大小限制

使用ildasm检查const和none const之间的优化发布:

代码

int test = 4;
Console.WriteLine(test*2);

编译到

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       11 (0xb)
  .maxstack  2
  .locals init ([0] int32 test)
  IL_0000:  ldc.i4.4
  IL_0001:  stloc.0
  IL_0002:  ldloc.0
  IL_0003:  ldc.i4.2
  IL_0004:  mul
  IL_0005:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_000a:  ret
} // end of method Program::Main

虽然

const int test = 4;
Console.WriteLine(test*2);

优化到

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       7 (0x7)
  .maxstack  8
  IL_0000:  ldc.i4.8
  IL_0001:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_0006:  ret
} // end of method Program::Main

这是在发布中使用2010并进行优化。

我进行了搜索,以了解有关常量传播的更多信息,虽然可行,但当前的编译器并没有像上面提到的那样here

答案 2 :(得分:3)

是。您将保护您的代码不会意外更改此变量。

答案 3 :(得分:3)

当我将布尔标志指示符传递给方法时,我喜欢这样做:

const bool includeFoo = true;
int result = bar.Compute(10, includeFoo);

这对我来说比简单的true / false更具可读性,这需要阅读方法声明来确定其含义。

答案 4 :(得分:2)

将local声明为const将让编译器知道您的意图,因此您将无法在函数的其他位置更改变量的值。

答案 5 :(得分:1)

除了有效的答案之外,您不仅告诉编译器该值不会改变,您还可以快速告诉其他人将查看您的代码。

答案 6 :(得分:0)

视使用情况而定..

例如,

void Foo()
{
    const string xpath = "//pattern/node";

    new XmlDocument().SelectNodes(xpath);
}

在这种情况下,我认为const声明毫无意义