когда и почему использовать методы доступа C # [duplicate]

6
задан Community 23 May 2017 в 12:07
поделиться

4 ответа

1: Это простое свойство, которое может использоваться почти так же, как публичное поле. Если у вас есть причина предоставлять операции get и set другим пользователям (то есть другим классам), и вам не нужно ничего особенного, то вот оно. Это также можно записать с помощью "auto-properties",

public static bool isInitialEditMapPageLoad {get;set;} // behaves just like example 1

auto props писать намного быстрее и, на мой взгляд, они более читабельны, чем полное объявление (если я увижу полное объявление с поддерживающим полем, я ожидаю найти некоторая сложность).

2: Это показывает одну из причин свойств: использование некоторой логики для возврата значения вместо того, чтобы всегда возвращать значение напрямую. Кто-то может установить это значение, как если бы он был публичным полем, когда захотел. Они также могут получить значение, когда захотят, с оговоркой, что false означает, что либо это не начальная загрузка, либо пользователь не авторизован - то есть некоторая (простая) логика сделано перед возвратом значения.

3: Это общедоступное поле ТОЛЬКО для чтения - кто-то может получить значение, но не может его установить. По сути, это значение, доступное только для чтения внешнему коду (не путать с ключевым словом readonly )

4: Это привело к ошибке компиляции для меня. Предполагая, что это должно быть объявление метода, вручную определяющее средство получения, как в Java, тогда это похоже на пример 3. Я считаю, что есть другие проблемы, которые делают это не совсем таким же, например, если вы хотите включить это в свойство зависимости и т. д. К сожалению, моих знаний в этой области недостаточно.

==========

Как правило, свойства пользователя ограничивают доступ к данным вашего класса. Как правило, все, к чему вы не можете позволить прикоснуться к другому коду, должно храниться таким образом. На практике вы захотите иметь возможность устанавливать значения для классов, чтобы изменять способ их отображения, изменять представленные данные и т. Д. Используйте свойства, чтобы максимально контролировать это взаимодействие.

Если другим классам нужно будет просматривать что-то в вашем классе, вам нужно будет предоставить доступ к получателю, но не к сеттеру. Это невозможно с полями, если вы не используете метод Java для написания пользовательского метода получения. Они также позволяют выполнять вычисления или проверки перед возвратом или установкой данных. Например, если у вас есть какое-то целочисленное значение, которое должно быть в пределах некоторого диапазона (диапазон, который может меняться даже в зависимости от состояния вашего объекта), в вашем сеттере вы можете проверить, выполняется ли это условие встретились до фактического обновления вашего значения.

Старайтесь избегать ловушки, просто устанавливая все как автопропускание - это ничем не отличается от того, чтобы сделать все общедоступным полем. Держите все как можно конфиденциальнее. Никаких геттеров, если это необходимо, никаких сеттеров, если это необходимо, и сеттеры должны выполнять любую небольшую логику, необходимую для проверки ввода, прежде чем принимать его, если это необходимо. Тем не менее, избегайте другой ловушки: размещения большого количества кода в геттерах / сеттерах. Если для этого требуется больше, чем несколько строк, вам, вероятно, следует создать метод, а не свойство, просто потому, что он дает больший намек для других, использующих ваш код, о том, что произойдет что-то грандиозное.

3
ответ дан 8 December 2019 в 12:57
поделиться

Смысл Getters / Setters состоит в том, чтобы защитить класс от взлома, когда пользователь изменяет поле недопустимым способом, и они позволяют вам изменять реализацию вашего класса, оставляя публично открытые свойства неизменными.

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

public string Name { get; set; }
5
ответ дан 8 December 2019 в 12:57
поделиться

Ваши геттеры / сеттеры должны быть вашим общедоступным интерфейсом к вашему классу.

Как показывает практика, все ваши члены должны быть закрытыми, за исключением того, к чему вы хотите, чтобы люди имели доступ за пределами вашего класса, и вы никогда не хотите, чтобы ваши частные переменные были доступны напрямую извне, если ваш класс

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

class Person {
  int age = 0;

  public int Age {
    get { return age; }
    set { 
      //do validation
      if (valid) {
        age = value;
      }
      //Error conditions if you want them.
    }
  } 

  //More getters/setters
}
8
ответ дан 8 December 2019 в 12:57
поделиться

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

Кроме того, читабельность вашего кода можно улучшить (если вы используете .NET 2.0 или выше), используя автосвойства. Тогда ваши примеры будут выглядеть так:

// example 1
public static bool IsInitialEditMapPageLoad { get; set; }

// example 3/4 - note that false is the default for bools
public static bool IsInitialEditMapPageLoad { get; private set; }

Пример 3, скорее всего, останется прежним, поскольку в нем присутствует логика валидации.

2
ответ дан 8 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: