Есть ли техническая причина, по которой автоматическое свойство должно определять и метод доступа get, и set? - PullRequest
4 голосов
/ 22 октября 2010

Я знаю, что автоматические свойства должны определять метод доступа get и set, я также знаю, что любой из этих методов доступа можно сделать невидимым с помощью модификатора доступа.

Есть ли техническийпричина, по которой компилятор доволен

public object Property { get; set; }

, но не

public object Property { get; }

Мое (возможно, неправильное) понимание этого кода заключается в том, что компилятор создает поле поддержки, которое скрыто от вызывающегокод, подобный так:

private object hiddenField; //hidden by compiler.

public object Property

{

get { return hiddenField; }

set { hiddenField = value;}

}

Если компилятор может сгенерировать это, есть ли причина, по которой он не может опустить функцию доступа set, основываясь на наличии (или его отсутствии) метода set в объявлении свойства.

Я понимаю, что это может быть не столько из-за технических ограничений, сколько из области возможностей, я также свободно признаю, что еще не ознакомился со спецификацией языка C #.

[ ОБНОВЛЕНИЕ 2 ]

Прости меня ... Я идиот: P, теперь я вижу, спасибо всем за поддержку моего старшего момента /

Ответы [ 4 ]

11 голосов
/ 22 октября 2010

Без установленного метода доступа невозможно установить значение, поскольку у вас нет доступа к «hiddenField».

Точно так же без метода доступа get невозможно было бы вернуть заданное вами значение.

Поскольку это действительно становится бесполезным, это не разрешено.

Однако вы можете иметь разные возможности доступа к двум методам:

public object Property { get; private set; }

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

1 голос
/ 22 октября 2010

Как вы могли бы использовать свойство, такое как следующее?

public object Property { get; }

Теоретически, если вы могли бы написать что-то подобное, оно всегда возвращает ноль, поскольку ему не хватает установленного метода доступа. Я думаю, что это бесполезно, если вы не установите скрытое поле каким-либо образом, чтобы иметь статическое значение, чтобы всегда возвращать его.

1 голос
/ 22 октября 2010
public object Property { get; private set; } 

будет работать и будет иметь семантику, которую вы ожидаете.

0 голосов
/ 22 октября 2010

Из спецификации C #:

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

Если оставить один из методов доступа, это будет означать, что свойство будет доступно только для чтения или только для записи, даже внутри конструктора класса / структуры. Не очень полезно.

...