空的二传手与属性中没有二传手

16 .net c# properties

这两个属性实现有什么区别?

public override string A
{
    get { return "s"; }
    set { }
}

public override string A
{
    get { return "s"; }
}
Run Code Online (Sandbox Code Playgroud)

Dmi*_*nko 23

那么,既然Aoverride比基类必须有两个 getset(否则代码不会编译)如

public class MyBase {
  public virtual String A {
    get {
      return "getBaseA";
    }
    set {
      throw new NotSupportedException("setBaseA");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在您有两个不同的派生类:

public class MyDerivedA: MyBase {
  public override String A {
    get {
      return "s";
    }
    set { // set is overridden, now set does nothing
    }
  }
}

public class MyDerivedB: MyBase {
  public override String A {
    get {
      return "s";
    }
    // set is not overridden, same as in the base class
  }
}
Run Code Online (Sandbox Code Playgroud)

我们称之为两种set方法:

// Does nothing: overridden MyDerivedA.A.set is called
MyBase test1 = new MyDerivedA();
test1.A = "Sample";

// Will throw NotSupportedException (base MyBase.A.set is called)
MyBase test2 = new MyDerivedB();
test2.A = "Sample";
Run Code Online (Sandbox Code Playgroud)


Ham*_*jam 7

第一个将A使用一个什么都不做的方法覆盖基类中的setter .所以你可以拥有,A = ""但它什么都不做.

定义setter时的方法将public override TheCompilerGeneratedNameForSetterOfAInBaseClass(string value) { }在第二种情况下A = ""编译,但它将调用基类setter A.