Пустой сеттер против настроек в свойствах

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

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

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

Ответы

Ответ 1

Ну, поскольку 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";

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

public virtual string A { get; set; }

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

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

Ответ 5

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