.NET 4.7 会在赋值前检查 属性 值吗?
Does .NET 4.7 check property values before assignment?
我刚开始使用 Resharper,我收到 "Redundant check before assignment" 警告,我想知道运行时是否真的检查相等性并跳过重新分配值。我看过其他关于不可变值、原始值或复杂值的帖子,以及检查相等性所涉及的成本与重新分配相等值的成本,这不是我关心的问题。
我担心的是 属性 上的 setter 在第二个 属性 上调用 setter 并且第二个 setter 的成本很高,因为例如,网络呼叫。如果运行时在赋值之前实际上没有检查相等性,我需要自己做,以防止 运行 中不必要的第二个 setter。如果它确实检查相等性而不是重新分配,我宁愿不做冗余检查以提高性能和可读性。
那么,.NET 4.7 会在赋值前检查 属性 值吗?
刚刚检查了下面的代码,它在赋值之前不检查是否相等:
Test t = new Test();
t.MyValue = 1;
t.MyValue = 1;
public class Test
{
public Test()
{
}
private int myValue;
public int MyValue
{
get
{
return myValue;
}
set
{
myValue = value;
Console.WriteLine($"Setter Called value->{myValue}");
}
}
}
输出:
Setter Called value->1
Setter Called value->1
我刚开始使用 Resharper,我收到 "Redundant check before assignment" 警告,我想知道运行时是否真的检查相等性并跳过重新分配值。我看过其他关于不可变值、原始值或复杂值的帖子,以及检查相等性所涉及的成本与重新分配相等值的成本,这不是我关心的问题。
我担心的是 属性 上的 setter 在第二个 属性 上调用 setter 并且第二个 setter 的成本很高,因为例如,网络呼叫。如果运行时在赋值之前实际上没有检查相等性,我需要自己做,以防止 运行 中不必要的第二个 setter。如果它确实检查相等性而不是重新分配,我宁愿不做冗余检查以提高性能和可读性。
那么,.NET 4.7 会在赋值前检查 属性 值吗?
刚刚检查了下面的代码,它在赋值之前不检查是否相等:
Test t = new Test();
t.MyValue = 1;
t.MyValue = 1;
public class Test
{
public Test()
{
}
private int myValue;
public int MyValue
{
get
{
return myValue;
}
set
{
myValue = value;
Console.WriteLine($"Setter Called value->{myValue}");
}
}
}
输出:
Setter Called value->1
Setter Called value->1