// Declaring a record with a public property and a private field
record WithOperatorTest
{
private int _myPrivateField;
public int MyProperty { get; set; }
public void SetMyPrivateField(int a = 5)
{
_myPrivateField = a;
}
}
现在让我们看看如何使用with运算符:
var firstInstance = new WithOperatorTest
{
MyProperty = 10
};
firstInstance.SetMyPrivateField(11);
var copiedInstance = firstInstance with { };
// now "copiedInstance" also has "MyProperty" set to 10 and "_myPrivateField" set to 11.
var thirdCopiedInstance = copiedInstance with { MyProperty = 100 };
// now "thirdCopiedInstance " also has "MyProperty" set to 100 and "_myPrivateField" set to 11.
thirdCopiedInstance.SetMyPrivateField(-1);
// now "thirdCopiedInstance " also has "MyProperty" set to 100 and "_myPrivateField" set to -1.
var person = new Person("John", "Doe")
{
MiddleName = "Patrick"
};
var modifiedPerson = new Person(person.FirstName, person.LastName)
{
MiddleName = "William"
};
您可以执行以下操作:
var modifiedPerson = person with
{
MiddleName = "Patrick"
};
3条答案
按热度按时间flseospp1#
它是表达式中的一个操作符,用于更容易地复制对象,覆盖它的一些公共属性/字段(可选)with expression - MSDN
目前它只能与记录一起使用。但将来可能没有这样的限制(假设)。
下面是一个如何使用它的示例:
现在让我们看看如何使用
with
运算符:MSDN中引用类型的注意事项:
对于引用类型成员,复制操作数时只复制对成员示例的引用。复制操作数和原始操作数都可以访问同一个引用类型示例。
这个逻辑可以通过修改记录类型的复制构造函数来修改。
默认情况下,复制构造函数是隐式的,即编译器生成的。如果需要自定义记录复制语义,请显式声明具有所需行为的复制构造函数。
至于它带来的好处,我想现在应该很明显了,它使示例的复制变得更加容易和方便。
58wvjzkj2#
本质上,当您使用
with
操作符时,它会创建一个新的对象示例,当前仅用于记录。这个新的对象示例是通过从源对象复制值并重写目标对象中的特定命名属性来创建的。例如,不要这样做:
您可以执行以下操作:
基本上,你会写更少的代码。
使用this source获取上面示例的更多细节,使用official documentation获取更多示例。
6za6bjd03#
简短的回答如下:在C#中添加
with
关键字是为了更容易地复制复杂的对象,并有可能覆盖一些公共属性。在接受的答案中已经简要提供了示例。