將不確定變?yōu)榇_定~類中的屬性何時被執(zhí)行
對于類中的屬性何時被的執(zhí)行,我之前的看法是,當(dāng)類被初始化時,自動去執(zhí)行,就是類中的字段一樣,但昨天在技術(shù)會議上,同事提出了不同的看法,意思是屬性的Getter塊在被使用時,才會被執(zhí)行?這個有點意思,這種說法就是說,屬性不僅是為字段的封裝,而且它還可以實現(xiàn)延時的使用,即在被Getter時,才執(zhí)行Get,再被Setter時,才執(zhí)行Set塊,而如果這個提議是正確的,那我之前理解的就是錯誤的,所以,我需要用代碼來證明它。
相關(guān)代碼:
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; } } }
這是意思是說,當(dāng)對象被實例化時,不去使用Name屬性,看看Display的結(jié)果:
而當(dāng)我們使用Name的Getter塊時,即它將的值取出來,賦給一個對象,代碼如下:
static void Main(string[] args) { TestPropery tp = new TestPropery(); var a = tp.Name;//觸發(fā)這個屬性的Getter // tp.Name = "bobo";//觸發(fā)這個屬性的Setter Console.WriteLine("Display=" + tp.Display); Console.ReadKey(); }
結(jié)果就為:
而當(dāng)代碼中使用Name的Setter塊時,即為Name屬性賦值為,代碼如下:
static void Main(string[] args) { TestPropery tp = new TestPropery(); //var a = tp.Name;//觸發(fā)這個屬性的Getter tp.Name = "bobo";//觸發(fā)這個屬性的Setter Console.WriteLine("Display=" + tp.Display); Console.ReadKey(); }
結(jié)果就為:
通過上面的測試,使用我明白了,原來我之前對C#屬性的認(rèn)識是錯誤的,人家微軟設(shè)計的屬性,在執(zhí)行上是效率極高的,用到哪個塊,才運行哪個塊,而不是類在初始化時同步運行的!實事上,在linq to sql的原文件時,也有對屬性的運用,只是當(dāng)時沒有去認(rèn)識考慮它,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(); } } }
詳細(xì)說明請看我的從微軟的DBML文件中我們能學(xué)到什么(它告訴了我們什么是微軟的重中之重)~五 LINQ實體類中對屬性的賦值,變化前與變化后SendPropertyChanging與SendPropertyChanged這篇文章。
浙公網(wǎng)安備 33010602011771號