C# 如果(sz!=sz2)sz=sz2,为什么这个代码会这样做?
我第一次创建了一个C# 如果(sz!=sz2)sz=sz2,为什么这个代码会这样做?,c#,linq-to-sql,C#,Linq To Sql,我第一次创建了一个linqtosql类。我决定看看这个班,发现了这个 什么。。。如果(sz!=sz2){sz=sz2;},它为什么要这样做。我不明白。为什么集合不生成为this.\u Property1=value private string _Property1; [Column(Storage="_Property1", CanBeNull=false)] public string Property1 { get {
linqtosql类
。我决定看看这个班,发现了这个
什么。。。如果(sz!=sz2){sz=sz2;},它为什么要这样做。我不明白。为什么集合不生成为this.\u 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;
}
}
}
它仅在属性发生更改时更新属性。这可能是基于这样的假设,即比较比更新可能涉及的引用(以及所有必需的内存管理)更便宜。它仅在属性发生更改时更新属性。这可能是基于这样的假设,即比较比更新可能涉及的引用(以及所有必需的内存管理)更便宜。设置字段不会导致属性更改通知,因此这不是原因 我猜这种设计选择是由以下因素驱动的:
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();
}
}
}
该字符串是不可变的引用类型。因此,原始实例和新实例是可互换的。但是,原始实例可能存在的时间更长,因此平均而言,收集的成本可能稍高(*)。因此,如果保留原始实例而不是由新的相同实例替换,则性能可能会更好
(*)在大多数情况下,新值只是刚刚分配的,并且在设置属性后不会被重用。因此,通常Gen0对象可以有效地收集,而原始值的GC生成是未知的
如果这个推理是正确的,我不希望看到值类型属性(int、double、DateTime等)的相同模式
当然,这只是猜测,我可能完全错了。设置字段不会导致属性更改通知,所以这不是原因 我猜这种设计选择是由以下因素驱动的:
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();
}
}
}
该字符串是不可变的引用类型。因此,原始实例和新实例是可互换的。但是,原始实例可能存在的时间更长,因此平均而言,收集的成本可能稍高(*)。因此,如果保留原始实例而不是由新的相同实例替换,则性能可能会更好
(*)在大多数情况下,新值只是刚刚分配的,并且在设置属性后不会被重用。因此,通常Gen0对象可以有效地收集,而原始值的GC生成是未知的
如果这个推理是正确的,我不希望看到值类型属性(int、double、DateTime等)的相同模式
当然,这只是猜测,我可能完全错了。这里似乎存在持续性。如果在属性1更改时使用反射(或切入点等)创建SQL
更新
查询,那么更新字段的成本将远远高于进行比较的成本。这里似乎存在持久性。如果在属性1更改时使用反射(或切入点等)来创建SQL更新
查询,那么更新字段的成本将远远高于进行比较的成本。您在哪里看到的?通常由LINQ到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
是受保护的方法,无法编译
那么,您是否更改了防止代码生成器发出属性更改/更改通知的设置 你在哪里看到的?通常由LINQ到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
是受保护的方法,无法编译
那么,您是否更改了防止代码生成器发出属性更改/更改通知的设置 它来自Heijlsberg的ObjectPascal根。。。。至少这就是大多数Borland Delphi VCL的实现方式…;) 它来自Heijlsberg的ObjectPascal根。。。。至少这就是大多数Borland Delphi VCL的实现方式…;) 我刚刚意识到有这样一个类别名为WTF..Ack!我想创建那个标签@杰森D:哈哈,我也是。我还没有真正的WTF。也许除了这个。我刚刚意识到有这样一个类别叫做WTF..Ack!我想创建那个标签@杰森D:哈哈,我也是。我还没有真正的WTF。除了这个。那个,字符串是值类型,创建大量不必要的副本总是一件坏事。。。GC方面…@GrayWizardx:设置字段不会导致propertychange通知@JasonD:字符串不是值类型,但你可能是对的,它与GC成本有关——请看我的答案。这并不完全准确。如果在
If
块t中没有发送属性更改/更改通知的调用