我见过以下c#class:
public class Bucket: ObservableObject
{
private ObjectId _oid;
public ObjectId Oid
{
get { return _oid; }
set
{
Set(() => Oid, ref _oid, value);
}
}
}
我理解_oid
是Bucket类的属性。但我不明白这一点:
Set(() => Oid, ref _oid, value);
如何设置此属性?请解释一下这个语法?它在做什么?
答案 0 :(得分:3)
ObservableObject
可能希望通知客户端属性更改,因此在设置内部字段时,它还需要属性的名称;这是() => Oid
的用途。要设置的第一个参数可能是Expression<Func<TResult>>
,这意味着编译器不会为lambda生成代码,而是将代码表示为抽象语法树(AST),并将其传递给{{ 1}}方法。这允许Set
方法检查AST并获取属性的名称。如果您使用较新版本的C#,那么Set
也会有一个重载,允许您传递属性的名称而不是表达式。我会使用它,因为它具有较低的开销:Set
正在设置字段,因为您通过Set(nameof Oid, ref _oid, value);
(ref
)传递了该字段,因此对ref _oid
内的参数的更改将反映为作为参数发送的字段的更改。