【问题标题】:Empty setter vs no setter in properties属性中的空设置器与无设置器
【发布时间】:2016-11-02 15:35:59
【问题描述】:

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

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

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

【问题讨论】:

  • 试试A = "";看看会发生什么。

标签: c# .net properties


【解决方案1】:

好吧,因为Aoverride,所以基类必须同时拥有getset(否则代码无法编译)例如

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

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

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
  }
}

让我们同时调用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";

【讨论】:

  • @CodesInChaos:谢谢你的提示! NotSupportedException其实是更好的选择。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这个getter 和setter 被覆盖。 在执行x.A ="" 时,此代码在这两种情况下都会编译。 在第一种情况下,我们覆盖 set 属性,这意味着当您尝试为对象分配值时,什么都不会发生。在第二种情况下,它将使用基类实现

    【讨论】:

      【解决方案4】:

      你使用override,所以我假设你的片段来自的类有一个类似的基类

      public virtual string A { get; set; }
      

      如果您只是覆盖 getter(您的第二个示例),则仍将使用原始 setter。您只是看不到结果,因为它被您的覆盖隐藏了。

      当您还使用空方法覆盖 setter 时,将不会调用基本 setter。

      【讨论】:

        【解决方案5】:

        首先:有一个 setter,但在那个 setter 中什么都不做
        第二:没有setter

        【讨论】:

        • 当然有,但很容易错过。在这两种情况下都有一个二传手。在第一种情况下,基类设置器被覆盖(什么都不做),而在第二种情况下,基类设置器被继承(做任何它被实现的事情)。
        猜你喜欢
        • 2016-02-07
        • 2013-01-25
        • 2021-11-29
        • 2013-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多