如果在一個類別中定義了虛屬性或虛擬方法,又在建構子中存取了這個虛擬屬性或方法,此時VisualStudio是不會給予警告,並且編譯也沒有問題,但是如果安裝了Resharper插件則會給出警告提示:“在構造函數中訪問了虛成員”,那麼,這為何是一個安全隱患,下面給出一個例子說明:
using System; namespace VirtualDemo { class Program { static void Main(string[] args) { var test = new SubClass(); Console.ReadKey(); } } class BaseClass { protected virtual string VirtualProperty { get; set; } public BaseClass() { var p = VirtualProperty; VirtualMethod(); } protected virtual void VirtualMethod() { } } class SubClass : BaseClass { private MockClass _mockClass; public SubClass() { _mockClass = new MockClass(); } protected override string VirtualProperty { get { return _mockClass.MockProperty; } set { _mockClass.MockProperty = value; } } protected override void VirtualMethod() { var p = _mockClass.MockProperty; } } class MockClass { public string MockProperty { get; set; } } }
這個範例很簡單,在建構SubClass
時出現了空引用報錯,因為基類建構函式先於子類建構函式運行,而子類建構函式中初始化了一個成員類,但是基類構造函數存取虛成員時子類別還沒構造,所以出現了空引用報錯。有多種方式可以避免這種情況,可以透過子類字段初始化的方式來構造成員類,這個語法糖可避免構造函數的時序問題,第二個是可定義一個虛的Initialize方法在子類構造函數第一步調用,子類別在繼承這個方法時初始化所需的依賴。
以上是C#中在建構函式中存取虛擬成員有什麼問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!