我第一次创建了一个linq to sql classes。我决定看一下这个班级,发现了这个。
什么..。为什么( sz !=sz2) {sz= sz2;}。我不明白。为什么集合不能生成为this._Property1 = value
private string _Property1;
[Column(Storage="_Property1", CanBeNull=false)]
public string Property1
{
get
{
return this._Property1;
}
set
{
if ((this._Property1 != value))
{
this._Property1 = value;
}
}
}发布于 2009-12-20 17:20:15
设置字段不会导致属性更改通知,所以这不是原因。
我猜想这个设计选择是由下面这样的东西驱动的:
该字符串是一个不可变的引用类型。因此,原始实例和新实例是可以互换的。但是,原始实例可能存在的时间更长,因此收集的平均成本可能会稍微高一些(*)。因此,如果保留原始实例而不是替换为新的相同实例,性能可能会更好。
(*)在大多数情况下,新值只是刚刚分配,在设置属性后不会被重用。因此,收集起来非常有效的通常是Gen0对象,而原始值的GC生成是未知的。
如果这个推理是正确的,我不希望看到值类型属性(int,double,DateTime,...)也有同样的模式。
当然,这只是一种猜测,我可能完全错了。
发布于 2009-12-20 15:51:03
它仅在属性发生更改时更新属性。这可能是基于这样的假设,即比较比更新可能涉及的引用(以及所有相关的内存管理)的成本更低。
发布于 2009-12-20 17:49:01
你在哪里看到的?通常LINQ-to-SQL生成的属性如下所示:
private string _Property1;
[Column(Storage="_Property1", CanBeNull=false)]
public string Property1 {
get {
return this._Property1;
}
set {
if ((this._Property1 != value)) {
this.OnProperty1Changing(value);
this.SendPropertyChanging();
this._Property1 = value;
this.SendPropertyChanged("Property1");
this.OnProperty1Changed();
}
}
}现在很明显,设备是为了避免在属性实际上没有更改时发送属性更改/更改通知。
现在,事实证明,OnProperty1Changing和OnProperty1Changed都是partial方法,所以如果你不在其他地方为它们声明一个主体,对这些方法的调用将不会被编译到最终的程序集中(所以,如果你在Reflector中寻找,你就不会看到这些调用)。但是SendPropertyChanging和SendPropertyChanged是无法编译出来的protected方法。
那么,您是否更改了阻止代码生成器发出属性更改/更改通知的设置?
https://stackoverflow.com/questions/1935164
复制相似问题