首頁  >  文章  >  後端開發  >  C#中在建構函式中存取虛擬成員有什麼問題?

C#中在建構函式中存取虛擬成員有什麼問題?

零下一度
零下一度原創
2017-06-24 09:51:101711瀏覽

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#中在建構函式中存取虛擬成員有什麼問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn