Автоматически сгенерированное свойство {get;set;} vs {get;частный или защищенный набор;} в C # - PullRequest
4 голосов
/ 24 сентября 2011

Я вижу, что много кода использует автоматически сгенерированное свойство, такое как {get; private set;} или {get; protected set;}.

В чем преимущество этого набора private или protected?

Я пробовал этот код, но он такой же, когда у меня Foo{get; set;}.

public class MyClass
{
    public int Foo {get; private set;}
    public static void RunSnippet()
    {
        var x = new MyClass();
        x.Foo = 30;
        Console.WriteLine(x.Foo);
    }
...
}

Ответы [ 4 ]

13 голосов
/ 24 сентября 2011

Оно делает свойство доступным только для чтения внешними источниками (то есть классами, которые не являются MyClass и / или его подклассами). Или, если вы объявили свойство protected с private set, оно доступно только для чтения его подклассами, но доступно для записи самим.

Это не имеет значения в вашем классе, потому что ваш установщик является закрытым для этого класса, так что ваш класс все еще может получить к нему доступ. Однако если вы попытаетесь создать экземпляр MyClass из другого класса, вы не сможете изменить значение свойства Foo, если оно имеет закрытый или защищенный установщик.

private и protected означают здесь то же самое, что и в других местах: private ограничивает доступ только этому самому классу, тогда как protected ограничивает доступ к этому классу и всем его производным классам.

1 голос
/ 24 сентября 2011

Если вы не укажете модификаторы доступа для ключевых слов get и set, свойство будет доступно в соответствии с модификатором доступа самого свойства.В вашем примере вы сможете получить значение Foo и установить значение Foo из любой точки вашей программы, если вы укажете get вместо private get.

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

1 голос
/ 24 сентября 2011

Это имеет значение, когда у вас есть модель класса, которая использует наследование. Если ваши методы MyClass являются клиентами ваших личных полей и методов, это не имеет значения.

Тем не менее, даже если вы не ожидаете, что MyClass станет родительским классом в какой-либо иерархии классов, не повредит ограничить область действия вашего поля и метода минимально видимой областью, которая ему требуется. Инкапсулируйте то, что вы можете, с наименьшей видимой областью по умолчанию, чтобы вам не приходилось проводить рефакторинг, когда подклассы начинают получать доступ к родительским свойствам, которых им не должно быть. Уровень усилий ничем не отличается от того, чтобы этого не делать.

0 голосов
/ 24 сентября 2011

Думайте о функциях get и set в терминах методов доступа и мутатора (за исключением того, что вам не нужно явно записывать тела методов:

private int foo;

public int get_Foo()
{
    return foo;
}

public /* or protected, or private */ void set_Foo(int value)
{
    foo = value;
}

После того, как вы это увидите, знайте, что модификаторы protected и private работают так же на сеттере, как и на любой другой член.

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