对于类中的属性何时被的执行,我之前的看法是,当类被初始化时,自动去执行,就是类中的字段一样,但昨天在技术会议上,同事提出了不同的看法,意思是属性的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这篇文章。