【发布时间】: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
这两个属性实现有什么区别?
public override string A
{
get { return "s"; }
set { }
}
public override string A
{
get { return "s"; }
}
【问题讨论】:
A = "";看看会发生什么。
标签: c# .net properties
好吧,因为A 是override,所以基类必须同时拥有get 和set(否则代码无法编译)例如
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";
【讨论】:
NotSupportedException其实是更好的选择。
第一个将用一个什么都不做的方法覆盖基类中A 的setter。所以你可以拥有A = "",但它什么也没做。
定义setter时的方法是public override TheCompilerGeneratedNameForSetterOfAInBaseClass(string value) { },在第二种情况下A = ""会编译,但它会调用A的基类setter。
【讨论】:
这个getter 和setter 被覆盖。
在执行x.A ="" 时,此代码在这两种情况下都会编译。
在第一种情况下,我们覆盖 set 属性,这意味着当您尝试为对象分配值时,什么都不会发生。在第二种情况下,它将使用基类实现
【讨论】:
你使用override,所以我假设你的片段来自的类有一个类似的基类
public virtual string A { get; set; }
如果您只是覆盖 getter(您的第二个示例),则仍将使用原始 setter。您只是看不到结果,因为它被您的覆盖隐藏了。
当您还使用空方法覆盖 setter 时,将不会调用基本 setter。
【讨论】:
首先:有一个 setter,但在那个 setter 中什么都不做
第二:没有setter
【讨论】: