Возможен ли публичный и частный сеттеры с одинаковыми именами в C #? - PullRequest
33 голосов
/ 21 мая 2011

Как я могу создать публичный геттер и частный сеттер для свойства?Правильно ли следующее?

public String Password
{
    set { this._password = value; }
}

private String Password
{
    get { return this._password; }
}

Ответы [ 6 ]

83 голосов
/ 21 мая 2011

Да, это возможно, даже с автоматическими свойствами. Я часто использую:

public int MyProperty { get; private set; }
11 голосов
/ 21 мая 2011

Да, начиная с C # 2.0, вы можете указывать разные уровни доступа для метода получения и установки свойства.

Но у вас неправильный синтаксис: вы должны объявить их как часть одного и того же свойства. Просто отметьте тот, который вы хотите ограничить, с помощью private. Например:

public String Password
{
    private get { return this._password; }
    set { this._password = value; }
}
3 голосов
/ 21 мая 2011
public String Password
{
    private set { this._password = value; }
    get { return this._password; }
}

или вы можете использовать автоматически реализованное свойство:

public String Password { get; private set; }
2 голосов
/ 21 мая 2011

public string Password { get; private set; }

2 голосов
/ 21 мая 2011
public String Password
{
    private set { this._password = value; }
    get { return this._password; }
}

MSDN:

Методы get и set обычно не отличаются от других методов.Они могут выполнять любую логику программы, генерировать исключения, переопределяться и объявляться с любыми модификаторами, разрешенными языком программирования.

Редактировать: цитата MSDN предназначена только для выяснения того, почему геттер и сеттер могут иметь разный доступmdofiers, Хороший вопрос, поднятый @Cody Grey:

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

0 голосов
/ 23 марта 2016

Чтобы получить значок 'Экскаватор' и сделать ответ актуальным - поля только для чтения, инкапсулированные свойством только для получения *

private readonly int myVal;
public int MyVal get { return myVal; }

теперь могут быть сокращены (начиная с C # 6.0) до

public int MyVal { get; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...