Каковы преимущества / преимущества свойства c # / VB.net - Модификаторы частного доступа для сеттеров - PullRequest
2 голосов
/ 25 января 2012

Ниже приведен класс со свойством.

public class abc
    {
        public int MyProperty { get; private set; }
    }

Путаница - в чем преимущество ввода модификатора частного доступа в сеттер?

Ответы [ 5 ]

6 голосов
/ 25 января 2012

Проще говоря, это свойство, которое сам класс может устанавливать, но внешние объекты могут только читать. Возможно, MyProperty изменяется как побочный эффект для метода, возможно, он устанавливается только один раз (в конструкторе). Суть в том, что источник изменений с MyProperty должен исходить из abc (или вложенного класса abc), а не из чего-то извне, содержащего ссылку на него.

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

2 голосов
/ 25 января 2012

Модификатор private позволяет свойству быть доступным только для чтения в контексте открытого, защищенного или внутреннего доступа, в то же время предоставляя типу возможность устанавливать свойство (т. Е. В контексте частного доступа).

1 голос
/ 25 января 2012

Это сделано для того, чтобы сделать ваше свойство доступным только для чтения, чтобы во внешнем мире не разрешалось изменять значение свойства, и только класс, реализующий свойство, может изменять значение свойства, являющегося владельцем свойства. В качестве примера того, как класс отслеживает количество экземпляров, и только количество экземпляров можно увеличивать / уменьшать изнутри класса, и внешнему миру нельзя разрешать изменять свойство счетчика экземпляров, например ::1001*

public class Customer
{    
    public Customer()
    {
        InstanceCount++;
    }

    //Helps retrieving the total number of Customers
    public int InstanceCount { get; private set; } //Count should not be increased by the clients of this class rather should be increased in the constructor only
}

Еще одним преимуществом в некоторых ситуациях является то, что после предоставления частного набора для вашего свойства вы можете предоставить метод Set для изменения значения свойства из внешнего мира, когда вы хотите выполнить некоторые вычисления или проверки полученного значения (которое не является рекомендуется использовать внутри метода Set свойство accessors), а затем изменить значение свойства следующим образом:

public class Customer
{
    public string City { get; private set; }

    public bool SetCity(string customerCity)
    {
        //validate that the customerCity is a valid USA city or else throw some business rule exception, and then call below code
        City = customerCity
    }
}
1 голос
/ 25 января 2012

Существует несколько причин для использования частного набора.

1) Если вы вообще не используете вспомогательное поле и хотите автоматическое свойство только для чтения:

public class abc
    {
        public int MyProperty { get; private set; }
    }

2) Если вы хотите проделать дополнительную работу, когда вы изменяете переменную внутри вашего класса и хотите захватить ее в одном месте:

private string _name = string.Empty;
public string Name 
{ 
    get { return _name; }
    private set 
    {
        TextInfo txtInfo = Thread.CurrentThread.CurrentCulture.TextInfo;
        _name = txtInfo.ToTitleCase(value);
    }
}

В целом, однако, это вопрос личных предпочтений.Насколько я знаю, нет никаких причин для производительности использовать один над другим.

0 голосов
/ 25 января 2012

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

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