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


    回到目录

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

    回到目录

  • 相关阅读:
    符号表
    经典算法-堆排序
    AngularJs基础
    Echars详解
    经典算法-快速排序
    经典算法-递归
    异常分类,异常抛出位置
    js的数据类型具体分析
    函数
    数据
  • 原文地址:https://www.cnblogs.com/lori/p/3373376.html
Copyright © 2020-2023  润新知