中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

將不確(que)定(ding)變為(wei)確(que)定(ding)~類(lei)中的屬性何時被(bei)執行

回到目錄

對于類(lei)(lei)中的(de)(de)(de)屬性何時(shi)(shi)(shi)被(bei)(bei)(bei)的(de)(de)(de)執(zhi)(zhi)行(xing),我(wo)之前(qian)的(de)(de)(de)看(kan)法是(shi),當(dang)類(lei)(lei)被(bei)(bei)(bei)初始化時(shi)(shi)(shi),自動(dong)去執(zhi)(zhi)行(xing),就是(shi)類(lei)(lei)中的(de)(de)(de)字段(duan)一樣,但昨天在技術會(hui)議(yi)上,同(tong)事提(ti)出了(le)不同(tong)的(de)(de)(de)看(kan)法,意思是(shi)屬性的(de)(de)(de)Getter塊在被(bei)(bei)(bei)使用(yong)時(shi)(shi)(shi),才(cai)會(hui)被(bei)(bei)(bei)執(zhi)(zhi)行(xing)?這(zhe)(zhe)個有點意思,這(zhe)(zhe)種說法就是(shi)說,屬性不僅(jin)是(shi)為字段(duan)的(de)(de)(de)封(feng)裝(zhuang),而且(qie)它(ta)還可以實現延時(shi)(shi)(shi)的(de)(de)(de)使用(yong),即(ji)在被(bei)(bei)(bei)Getter時(shi)(shi)(shi),才(cai)執(zhi)(zhi)行(xing)Get,再被(bei)(bei)(bei)Setter時(shi)(shi)(shi),才(cai)執(zhi)(zhi)行(xing)Set塊,而如果這(zhe)(zhe)個提(ti)議(yi)是(shi)正確(que)的(de)(de)(de),那我(wo)之前(qian)理解(jie)的(de)(de)(de)就是(shi)錯(cuo)誤的(de)(de)(de),所以,我(wo)需要(yao)用(yong)代碼來證明它(ta)。

相關代碼:

 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屬性,看(kan)看(kan)Display的結(jie)果:

而當我們使用Name的Getter塊時,即它(ta)將的值取出來,賦給一個對象,代碼如下:

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

結果就為:

而當代碼中使用Name的Setter塊時,即(ji)為Name屬(shu)性賦值(zhi)為,代碼如下:

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

結果就為:

通過上面的(de)(de)測試,使用(yong)我(wo)(wo)明(ming)白(bai)了,原來我(wo)(wo)之前對C#屬性的(de)(de)認識是(shi)錯誤的(de)(de),人(ren)家微軟設(she)計(ji)的(de)(de)屬性,在(zai)執行上是(shi)效率極高的(de)(de),用(yong)到(dao)哪個塊,才運行哪個塊,而(er)不是(shi)類在(zai)初始化時(shi)同(tong)步(bu)運行的(de)(de)!實(shi)事上,在(zai)linq to sql的(de)(de)原文件時(shi),也有對屬性的(de)(de)運用(yong),只是(shi)當時(shi)沒有去認識考慮它,linq to sql中的(de)(de)運用(yong),代(dai)碼如下:

      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這篇文章。

回到目錄

posted @ 2013-10-17 09:20  張占嶺  閱讀(924)  評論(1)    收藏  舉報