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

简介:

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

本文转自博客园张占岭(仓储大叔)的博客,原文链接:将不确定变为确定~类中的属性何时被执行,如需转载请自行联系原博主。

目录
相关文章
|
2月前
|
JavaScript 前端开发
判断对象是否含有改属性,三个方法
JavaScript中判断对象是否包含属性的三种方法:1. 使用`'property' in object`检查自有属性和继承属性;2. 使用`object.hasOwnProperty('property')`仅检查自有属性;3. 使用`if (object.property)`判断,但返回属性值。
36 2
判断对象是否含有改属性,三个方法
|
14天前
|
设计模式
在静态方法中访问类的实例属性和方法时会发生什么?
总之,静态方法主要用于处理与类本身相关的操作和逻辑,不应该直接访问类的实例属性和方法。如果需要在静态方法中使用与实例相关的信息,应该通过合理的参数传递或其他设计模式来实现,以保持代码的清晰性和面向对象设计的原则。
42 8
|
6月前
|
测试技术
反射获取或修改对象属性的值
* 获取单个对象的所有键值对
53 3
C++中转换构造函数与默认函数的优先级
C++中转换构造函数与默认函数的优先级
|
编译器 C++
C++类中默认生成的函数
C++类中默认生成的函数
174 0
|
Java 数据库
java反射机制查找类的属性并赋值
先说一下需求:最近做一个项目其中需要将前台传来的数组存到数据库,但是这个表里有15个字段,集合是不固定的,然后要把这个集合的数值赋给这个类的相应属性,然后存到数据库中。集合长度应小于等于这个类属性的个数。
329 0
|
C++
VS 显示方法引用的设置方法
VS 中Codelens的设置面板没有相关的设置项?那如何调整出方法的引用呢?
2243 0
VS 显示方法引用的设置方法
|
Java
【Groovy】循环控制 ( Java 语法循环 | 默认的 IntRange 构造函数 | 可设置翻转属性的 IntRange 构造函数 | 可设置是否包含 to 的构造函数 | 0..9 简写 )(一)
【Groovy】循环控制 ( Java 语法循环 | 默认的 IntRange 构造函数 | 可设置翻转属性的 IntRange 构造函数 | 可设置是否包含 to 的构造函数 | 0..9 简写 )(一)
160 0
|
Java
【Groovy】循环控制 ( Java 语法循环 | 默认的 IntRange 构造函数 | 可设置翻转属性的 IntRange 构造函数 | 可设置是否包含 to 的构造函数 | 0..9 简写 )(二·)
【Groovy】循环控制 ( Java 语法循环 | 默认的 IntRange 构造函数 | 可设置翻转属性的 IntRange 构造函数 | 可设置是否包含 to 的构造函数 | 0..9 简写 )(二)
149 0
【错误记录】反射时调用方法及成员报错 ( 执行反射方法 | 设置反射的成员变量 | 设置方法/成员可见性 )
【错误记录】反射时调用方法及成员报错 ( 执行反射方法 | 设置反射的成员变量 | 设置方法/成员可见性 )
183 0