首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >属性中的空setter与无setter

属性中的空setter与无setter
EN

Stack Overflow用户
提问于 2016-06-30 13:38:31
回答 5查看 11.9K关注 0票数 22

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

代码语言:javascript
复制
public override string A
{
    get { return "s"; }
    set { }
}

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

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-06-30 13:47:03

因为Aoverride,所以基类必须同时具有getset (否则代码不会编译)。

代码语言:javascript
复制
public class MyBase {
  public virtual String A {
    get {
      return "getBaseA";
    }
    set {
      throw new NotSupportedException("setBaseA");
    }
  }
}

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

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
// 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";
票数 27
EN

Stack Overflow用户

发布于 2016-06-30 13:39:27

第一个方法将重写基类中的A的setter,该方法是不做任何操作的。所以你可以拥有A = "",但它什么也不做。

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

票数 7
EN

Stack Overflow用户

发布于 2016-06-30 13:47:06

这个getter和setter是overriden。在执行x.A =""时,这段代码在这两种情况下都会编译。在第一种情况下,我们重写set属性,这意味着当您试图为对象赋值时,不会发生任何事情。在第二种情况下,它将使用基类实现。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38124814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档