您好,登錄后才能下訂單哦!
C#中在構造函數中訪問虛成員時會出現什么問題?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
如果在一個類中定義了虛屬性或者虛方法,又在構造函數中訪問了這個虛屬性或方法,此時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#中在構造函數中訪問虛成員時會出現什么問題的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。