UZER2006
@UZER2006

Вопрос про getter и setter?

public class Editor
{
	public string Type
	{
		get;
		set {
			if (value == EditorType.Dictionary) Editable = false;
		}
	}
}


Объясните, пожалуйста, почему нельзя так сделать? Какую идеологию это нарушает? Почему я, чтобы банально поменять другое свойство в классе при изменении этого на конкретное значение, должен плодить вот такую костыльную конструкцию?
public class Editor
{
	private string _type;
	public string Type
	{
		get { return _type; }
		set { _type = value;
			if (value == EditorType.Dictionary) Editable = false;
		}
	}
}


Поиск не дал ни ответа на вопрос, ни советов, как правильно реализовать такой функционал.
  • Вопрос задан
  • 4595 просмотров
Решения вопроса 1
Illivion
@Illivion
Ваше желаемое поведение нарушает идеологию простоты и прозрачности. Ибо как только мы разрешаем такую конструкцию, возникает множество вопросов с неоднозначными ответами. Например «Что должно выполняться сначала, присвоение значения или код в сеттере?» или «А что делать, если выбросило исключение?» и т.д. Архитекторы языка правильно посчитали, что ответами должен управлять разработчик приложения. Так же при таком подходе теряется часть гибкости синтаксиса. Так, уже не получится записать value в ту или иную переменную в зависимости от состояния объекта или присвоить значение всем элементам внутренней коллекции.
Вы можете использовать ваш второй пример, это будет правильно и совсем не костыльно, а наоборот, очень наглядно. Так же вы можете реализовать getter и setter методами, и это тоже будет корректно и читабельно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
gouranga
@gouranga
В C# есть свойства и авто-реализуемые свойства (AIP). Нечто промежуточное отсутствует на уровне компилятора и вряд ли появится в будущем (на мой взгляд). На вопрос «почему» могут ответить только архитекторы языка и компилятора C# из Microsoft. Правильно реализовать такой функционал можно только с использованием backing field, как у вас во втором примере.

Если очень хочется, то можно воспользоваться любой AOP-библиотекой (PostSharp, Fody и т.д.) и реализовать этот функционал, вероятно, весьма костыльным образом. Но зачем?

Рихтер вон вообще против этих AIP. :o)
Ответ написан
Комментировать
LightSUN
@LightSUN
Вот так что-ли?

public class Editor
{
    public string Type
    {
        set
        {
            Editable = value != EditorType.Dictionary;
        }
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы