需要一些解释这个C#奇怪的语法是什么

时间:2018-02-23 13:17:28

标签: c# syntax

我见过以下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);

如何设置此属性?请解释一下这个语法?它在做什么?

1 个答案:

答案 0 :(得分:3)

ObservableObject可能希望通知客户端属性更改,因此在设置内部字段时,它还需要属性的名称;这是() => Oid的用途。要设置的第一个参数可能是Expression<Func<TResult>>,这意味着编译器不会为lambda生成代码,而是将代码表示为抽象语法树(AST),并将其传递给{{ 1}}方法。这允许Set方法检查AST并获取属性的名称。如果您使用较新版本的C#,那么Set也会有一个重载,允许您传递属性的名称而不是表达式。我会使用它,因为它具有较低的开销:Set

正在设置字段,因为您通过Set(nameof Oid, ref _oid, value);ref)传递了该字段,因此对ref _oid内的参数的更改将反映为作为参数发送的字段的更改。