[英]What is the "with" operator for in C#?
我遇到了这个代码:
var rectangle = new Rectangle(420, 69);
var newOne = rectangle with { Width = 420 }
我想知道 C# 代码中的with
关键字。 它是做什么用的? 以及如何使用它? 它给语言带来了什么好处?
它是表达式中使用的运算符,用于更轻松地复制对象,用表达式覆盖它的一些公共属性/字段(可选) - MSDN
目前它只能用于记录。 但也许将来不会有这样的限制(假设)。
这是一个如何使用它的示例:
// 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.
MSDN 中引用类型的注意事项:
在引用类型成员的情况下,复制操作数时仅复制对成员实例的引用。 副本和原始操作数都可以访问相同的引用类型实例。
可以通过修改记录类型的复制构造函数来修改该逻辑。 引用自 MSDN:
默认情况下,复制构造函数是隐式的,即编译器生成的。 如果您需要自定义记录复制语义,请显式声明具有所需行为的复制构造函数。
protected WithOperatorTest(WithOperatorTest original)
{
// Logic to copy reference types with new reference
}
就它带来的好处而言,我认为现在应该很明显了,它使复制实例变得更加容易和方便。
基本上, with
运算符将创建一个新的对象实例(目前仅记录),通过“处理值”从“源”对象并覆盖目标对象中的一些命名属性。
例如,不要这样做:
var person = new Person("John", "Doe")
{
MiddleName = "Patrick"
};
var modifiedPerson = new Person(person.FirstName, person.LastName)
{
MiddleName = "William"
};
你可以这样做:
var modifiedPerson = person with
{
MiddleName = "Patrick"
};
基本上,您将编写更少的代码。
简短的回答是: with
在C#关键字是对复杂物体,更容易的副本,添加,有可能重写某些公共属性的。 已接受的答案中已经简要提供了示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.