将不确定变为确定~类中的属性何时被执行

回到目录

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

回到目录

posted @ 2013-10-17 09:20  张占岭  阅读(912)  评论(1编辑  收藏  举报