Пустой сеттер против настроек в свойствах
В чем разница между этими двумя реализациями свойств?
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
Во-первых: есть сеттер, но в этом сеттер ничего не сделает
Во-вторых: нет сеттера