將不確定變為確定~類中的屬性何時被執行

張佔嶺發表於2013-10-17

回到目錄

對於類中的屬性何時被的執行,我之前的看法是,當類被初始化時,自動去執行,就是類中的欄位一樣,但昨天在技術會議上,同事提出了不同的看法,意思是屬性的Getter塊在被使用時,才會被執行?這個有點意思,這種說法就是說,屬性不僅是為欄位的封裝,而且它還可以實現延時的使用,即在被Getter時,才執行Get,再被Setter時,才執行Set塊,而如果這個提議是正確的,那我之前理解的就是錯誤的,所以,我需要用程式碼來證明它。

相關程式碼:

 class Program
    {
        static void Main(string[] args)
        {
            TestPropery tp = new TestPropery();
            Console.WriteLine(tp.Display);
            Console.ReadKey();
        }
    }

    public class TestPropery
    {
        string _name;
        public string Display="初始值";
        public string Name
        {
            get
            {
                if (_name == null)
                {
                    Display = "Getter";
                    _name = "zzl";
                }
                return _name;
            }
            set
            {
                Display = "Setter";
                _name = value;
            }
        }
    }

這是意思是說,當物件被例項化時,不去使用Name屬性,看看Display的結果:

而當我們使用Name的Getter塊時,即它將的值取出來,賦給一個物件,程式碼如下:

  static void Main(string[] args)
        {
            TestPropery tp = new TestPropery();
            var a = tp.Name;//觸發這個屬性的Getter
            // tp.Name = "bobo";//觸發這個屬性的Setter
            Console.WriteLine("Display=" + tp.Display);
            Console.ReadKey();
        }

結果就為:

而當程式碼中使用Name的Setter塊時,即為Name屬性賦值為,程式碼如下:

static void Main(string[] args)
        {
            TestPropery tp = new TestPropery();
            //var a = tp.Name;//觸發這個屬性的Getter
             tp.Name = "bobo";//觸發這個屬性的Setter
            Console.WriteLine("Display=" + tp.Display);
            Console.ReadKey();
        }

結果就為:

通過上面的測試,使用我明白了,原來我之前對C#屬性的認識是錯誤的,人家微軟設計的屬性,在執行上是效率極高的,用到哪個塊,才執行哪個塊,而不是類在初始化時同步執行的!實事上,在linq to sql的原檔案時,也有對屬性的運用,只是當時沒有去認識考慮它,linq to sql中的運用,程式碼如下:

      public string ExceptionID
          {
              get
              {
                  return this._ExceptionID;
              }
              set
              {
                  if ((this._ExceptionID != value))
                  {
                      this.OnExceptionIDChanging(value);
                      this.SendPropertyChanging();
                      this._ExceptionID = value;
                      this.SendPropertyChanged("ExceptionID");
                      this.OnExceptionIDChanged();
                  }
              }
          }

詳細說明請看我的從微軟的DBML檔案中我們能學到什麼(它告訴了我們什麼是微軟的重中之重)~五 LINQ實體類中對屬性的賦值,變化前與變化後SendPropertyChanging與SendPropertyChanged這篇文章。

回到目錄

相關文章