この2つのプロパティー実装の違いは何ですか?プロパティに空のセッターとセッターがありません
public override string A
{
get { return "s"; }
set { }
}
public override string A
{
get { return "s"; }
}
この2つのプロパティー実装の違いは何ですか?プロパティに空のセッターとセッターがありません
public override string A
{
get { return "s"; }
set { }
}
public override string A
{
get { return "s"; }
}
まあはありません、A
がそうでなければを持っている必要があります、基本クラスよりもoverride
両方get
とset
(ですので、まず
@CodesInChaos:ヒントありがとう! 'NotSupportedException'は実際にはより良い選択です。 –
最初のものは、何もしない方法で基本クラスのA
の設定を上書きします。あなたはA = ""
を持つことができますが、何もしていません。
セッターを定義するメソッドはpublic override TheCompilerGeneratedNameForSetterOfAInBaseClass(string value) { }
になり、2番目のケースではA = ""
がコンパイルされますが、A
の基本クラスのセッターが呼び出されます。そこセッターがあるが、そのセッターに
第二に何もしません:なしセッター
コードはコンパイルされません)
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";
確かにありますが、見逃しやすいです。両方のケースにセッターがあります。最初のケースでは、基本クラスのセッターがオーバーライドされます(何もしません)。後者の場合は、基本クラスのセッターが継承されます(実行するために実装されたものを実行するため)。 – Zano
このゲッターとセッターがオーバーライドです。 x.A =""
を実行している場合、このコードはどちらの場合でもコンパイルされます。 最初のケースでは、setプロパティをオーバーライドします。つまり、オブジェクトに値を代入しようとすると何も起きません。後者の場合には、基本クラスの実装あなたがoverride
使用
を使用しますので、私はあなたのフラグメントが
public virtual string A { get; set; }
あなただけのgetterをオーバーライドする場合(2番目の例のようなもので基底クラスを持っているからであるクラスと仮定します)、元のセッターは引き続き使用されます。オーバーライドによって隠されているので、結果は表示されません。
また、空のメソッドでセッターをオーバーライドすると、基本セッターは呼び出されません。
'A =" ";'を試して、何が起こるかを見てください。 –