【发布时间】:2011-09-08 23:40:56
【问题描述】:
我正在阅读 Microsoft 的一些 AppHub 示例,这是其中一个功能的开始:
if (string.IsNullOrEmpty(textureFilename))
{
string message = "textureFilename wasn't set properly, so the " +
"particle system doesn't know what texture to load. Make " +
"sure your particle system's InitializeConstants function " +
"properly sets textureFilename.";
throw new InvalidOperationException(message);
}
ReSharper 说要使这个值成为常数,而不是每次都重新声明它。但是,此字符串值仅在此函数中使用,因此不必将其设为成员变量。理想情况下,变量的范围应该限制在这个函数中。对吧?
另外,我同意“将字符串放在资源文件中”的说法。在这种情况下,这很可能是最佳解决方案。它不仅解决了本地化问题,而且还避免了每次函数调用都重新初始化变量,并且不再弄乱源文件。然而,这只是一个例子。
我知道很多人可能会说“过早的优化是万恶之源”,但请注意这只是一个例子。如果这个准常数变量很复杂并且每次调用都重新初始化它会导致明显的减速怎么办?
Visual Basic .NET 允许程序员将函数中的变量声明为静态变量。例如,在这段代码中TestFunction只会在我第一次点击按钮时被调用:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Static example As Integer = TestFunction()
MessageBox.Show(example)
End Sub
Private Function TestFunction() As Integer
Console.WriteLine("Method Accessed")
Return 5
End Function
据我所知,C# 不允许这样做。有什么特别的原因吗?在这种情况下,它似乎是完美的。它将变量范围限制为函数,并且只在第一次初始化它。即使对象创建成本很高,也只会执行一次。那么为什么这不可用呢?还是这样?
感谢阅读!
【问题讨论】:
-
我不知道为什么它不可用。 (可能是因为 VB.NET 是一种稍微好一点的语言 :])不过,让它成为一个成员变量也不错 - 虽然在范围方面有点问题,但单类文件应该由同一个人编写,并且变量的用途应该很明显。
-
VB 中的静态“本地”只是一个编译器技巧。生成的 IL 与您使用类级静态字段(除了编译器生成的名称)没有什么不同。
标签: c# coding-style static scope standards