Dot-Net

VB.NET 可以在呼叫基類型建構子之前強制初始化實例變數嗎?

  • January 5, 2011

在調試 VB.NET 中涉及初始化實例變數的順序的一個特別棘手的問題後,我發現我對 C# 的預期行為與 VB.NET 中的實際行為之間存在重大差異。

**注意事項:*這個問題涉及 VB.NET 和 C# 的行為略有差異。如果你是一個語言偏執者,除了“這就是你應該使用 C# 的原因,菜鳥”*之外無法提供答案,那麼這裡沒有任何東西可供你看到;請繼續前進。

具體來說,我期望C# 語言規範概述的行為(強調添加):

當實例建構子沒有建構子初始值設定項,或者它有一個形式為 的建構子初始值設定項時base(...),該建構子隱式執行由在其類中聲明的實例欄位的變數初始值設定項指定的初始化。**這對應於在進入建構子時和直接基類建構子的隱式呼叫之前立即執行的一系列賦值。**變數初始化器按照它們在類聲明中出現的文本順序執行。

將其與 VB.NET 語言規範中關於Instance Constructors的部分進行對比,該部分說(強調添加):

當建構子的第一條語句為 形式MyBase.New(...)時,建構子隱式執行類型中聲明的實例變數的變數初始化器指定的初始化。**這對應於在呼叫直接基類型建構子後立即執行的一系列賦值。**這種排序確保所有基本實例變數在執行任何有權訪問該實例的語句之前由其變數初始化程序初始化。

**這裡的差異立即顯而易見。**C# 在呼叫基本建構子之前初始化類級變數。VB.NET 正好相反,顯然更喜歡在設置實例欄位的值之前呼叫基本建構子。

如果您想查看一些程式碼,這個相關問題提供了發散行為的更具體範例。不幸的是,它沒有提供任何關於如何強制 VB.NET 遵循 C# 建立的模型的提示。

我對這兩種語言的設計者為什麼選擇如此不同的方法而不是對問題的可能解決方法不太感興趣。最終,我的問題如下:有什麼方法可以在 VB.NET 中編寫或構造我的程式碼,以強制在呼叫基類型的建構子之前初始化實例變數,就像 C# 中的標準行為一樣?

如果您有要在構造期間呼叫的虛擬成員(違背最佳建議,但我們已經同意),那麼您需要將您的初始化移動到一個單獨的方法中,該方法可以保護自己免受多次呼叫(即,如果init 已經發生,立即返回)。然後,該方法將由虛擬成員和您的建構子呼叫,然後它們依賴於發生的初始化。

這有點混亂,可能會帶來輕微的性能損失,但在 VB 中您幾乎無能為力。

引用自:https://stackoverflow.com/questions/4602468