Итак, мне нужно просмотреть свою базу кода и удалить все общедоступные сеттеры и изменить их на частные для неизменяемых свойств.
Я знаю, что из-за этого мне будет сложнее установить значения, и я могу сделать это с помощью конструктора. Есть ли у меня другие способы установить значение, кроме как через конструктор?
Дело в том, чтобы ограничить доступ при изменении значения.
Вы спрашиваете, что означает прицел private
? Это просто означает, что вы можете установить значение только внутри самого класса - другие классы имеют доступ только для чтения к значению. Вы по-прежнему можете предоставлять общедоступные методы, которые позволяют другим классам косвенно изменять значение.
Вы хотите сказать, что ваш класс теперь неизменен? В этом случае вы не можете «установить значение», потому что если вы хотите изменить состояние, вам понадобится новый объект.
private string _value;
public SetValue(string value)
{
_value = value;
}
или
ctrl + . на свойстве для инкапсуляции поля
Похоже, вы говорите о C# 6 { get; }
. Эти свойства устанавливаются только из конструктора.
Если вы определите свое свойство как { get; private set; }
, вы сможете установить его из этого класса или в производных классах.
Есть несколько методов, которые я использую для создания неизменяемых свойств в C#, когда мне также нужно установить это свойство вне конструктора.
Первый сценарий - вызвать исключение, если объект был изменен после установки.
private object _myProperty;
public object MyProperty
{
public get { return _myProperty; }
public set
{
if (_myProperty == null) { _myProperty = value; }
else { throw new InvalidOperationException("MyProperty can't be changed onece set"); }
}
}
Этот метод не предотвращает ошибок до выполнения, но может помочь вам поймать себя, когда вы делаете глупости.
Другой метод - скрыть сеттеры с помощью интерфейса. Явно реализуя интерфейс, вы можете скрыть свойство или метод от пользователя, если они не приведут ваш класс к этому конкретному интерфейсу. На самом деле это не делает вашу собственность неизменной, но помогает защитить свойства от непреднамеренного изменения.
public interface MyInterface
{
object MyProperty { get; }
}
public interface MyInterfaceProtected
{
object MyProperty { set; }
}
public class MyClass : MyInterFace, MyInterfaceProtected
{
private object _myProperty;
public object MyProperty { get {return _myProperty;} }
object MyInterfaceProtected.MyProperty
{
set { _myProperty = value; }
}
}
У вас есть пример? Вы можете использовать инициализатор свойства / поля, но есть ограничения.