0
点赞
收藏
分享

微信扫一扫

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

楚木巽 2022-08-26 阅读 107

​​回到目录​​

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

结果就为:

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

而当代码中使用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();
}

结果就为:

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

通过上面的测试,使用我明白了,原来我之前对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​​这篇文章。

​​回到目录​​

作者:仓储大叔,张占岭,
荣誉:微软MVP



举报

相关推荐

0 条评论