Как установить значение для частного набора в C#

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

Я знаю, что из-за этого мне будет сложнее установить значения, и я могу сделать это с помощью конструктора. Есть ли у меня другие способы установить значение, кроме как через конструктор?

Дело в том, чтобы ограничить доступ при изменении значения.

У вас есть пример? Вы можете использовать инициализатор свойства / поля, но есть ограничения.

Sinatr 17.12.2018 15:45

Вы спрашиваете, что означает прицел private? Это просто означает, что вы можете установить значение только внутри самого класса - другие классы имеют доступ только для чтения к значению. Вы по-прежнему можете предоставлять общедоступные методы, которые позволяют другим классам косвенно изменять значение.

Rufus L 17.12.2018 15:52

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

Meta-Knight 17.12.2018 16:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
1 403
3

Ответы 3

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; }
   }
}

Другие вопросы по теме