Пустой сеттер vs нет сеттера в свойствах

в чем разница между этими двумя реализациями собственность?

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

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

5 ответов


Ну так A is 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";

первый переопределит сеттер для A в базовом классе метод, который ничего не делает. Так что вы можете иметь A = "" но он ничего не делает.

метод при определении сеттера будет public override TheCompilerGeneratedNameForSetterOfAInBaseClass(string value) { } а во втором случае A = "" будет компилироваться, но он вызовет сеттер базового класса для A.


этот геттер и сеттер -overriden. Этот код будет компилироваться в обоих случаях при выполнении x.A ="". В первом случае мы переопределяем свойство set, что означает, что при попытке присвоить значение объекту ничего не произойдет. Во втором случае он будет использовать реализацию базового класса


вы используете override, поэтому я предполагаю, что класс вашего фрагмента имеет базовый класс с чем-то вроде

public virtual string A { get; set; }

Если вы просто переопределите геттер (ваш второй пример), исходный сеттер все равно будет использоваться. Вы просто не видите результат скрытую переопределить.

когда вы также переопределяете сеттер пустым методом, базовый сеттер не будет вызываться.


во-первых: есть сеттер, но в этом сеттере ничего не будет делать
Во-вторых: нет сеттера