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中没有发送属性更改/更改通知的调用