我讀由Microsoft AppHub樣品,這是功能之一的開頭:爲什麼C#不允許變量在方法中聲明爲靜態?
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是一種稍微好一點的語言:])使它成爲一個成員變量並不壞 - 雖然在範圍方面存在一些問題,但單一類文件應該由同一個人編寫,它應該是顯而易見的變量。 – Ryan
VB中的靜態「本地」只是一個編譯器技巧。生成的IL與您使用類級別的靜態字段(除了編譯器生成的名稱之外)沒有區別。 – LukeH