Как получить доступ к приватным переменным, используя {get; задавать; }
Я хотел бы создать класс для моего сайта с большим количеством частной переменной.
Я думал, что есть решение не писать все геттеры и сеттеры для каждой переменной, что-то вроде
private int confirmed { get; set; }
Правильно ли это? И затем, как мне получить доступ к этому значению вне класса?
Я пробовал .confirmed
, я получаю ошибку, говорящую, что она закрыта (что я понимаю)
Но более удивительно, что .getConfirmed()
или getconfirmed()
тоже не работают.
Я думал, что { get; set; }
будет создавать неявно эти методы.
Может кто-нибудь прояснить эту озабоченность для меня, пожалуйста?
Ответы
Ответ 1
Вы можете объявить свое свойство общедоступным, а затем пометить геттер или сеттер как индивидуально:
public int confirmed { get; private set; }
Таким образом, вы можете получить доступ к confirmed
за пределами вашего определенного класса:
Console.WriteLine(myClass.confirmed); // This is OK
myClass.confirmed = "Nothing"; // Can't do this
И единственным, кто может установить значение confirmed
, является MyClass:
public class MyClass {
public int confirmed { get; private set; }
public MyClass() {
this.confirmed = "This"; // This is fine as we have private access
}
}
Ответ 2
Вам нужно понять, что
private int confirmed { get; set; }
будет расширен до набора методов private
с использованием поля поддержки private
,
private int _confirmed;
private int confirmed_get()
{
return this._confirmed;
}
private void confirmed_set(int value)
{
this._confirmed = value;
}
Таким образом, маркировка свойства private
делает и аксессор и мутатор также закрытыми, поэтому вы не можете обращаться к ним за пределами класса. Кроме того, эти методы недоступны во время компиляции, поэтому вызов instance.confirmed_get()
не разрешен, только instance.confimed
для чтения и записи в свойство.
Что вы можете пожелать, это объявить его public
,
public int confirmed { get; set; }
где поведение похоже (поле по-прежнему равно private
), но оба метода теперь public
. Как упоминают другие, вы можете индивидуально изменять типы поведения get
и set
для readonly
или writeonly
,
public int confirmed { get; private/protected set; }
или
public int confirmed { private/protected get; set; }
И последнее, вы должны привыкнуть использовать верблюжьей кейс для пропозиций, например. Confirmed
и нижний регистр верблюда для полей, например. Confirmed
(некоторые могут даже сделать _confirmed
). Это популярные соглашения об именах, чтобы различать два типа, особенно для потребителей этого класса.
Ответ 3
как мне получить доступ к этому значению вне класса?
Вы не можете (без отражения формы доверенного кода). Они частные. Если вы хотите, чтобы getter был общедоступным, но setter private, тогда выполните
public int confirmed { get; private set; }
Я думал, что {get; set;} создаст неявно эти методы.
Это так, но они не доступны во время разработки.
Ответ 4
Просто сделайте это, если хотите получить его вне класса.
public int confirmed { get; set; }
или вы можете пойти по этому маршруту:
private int confirmed;
public int Confirmed
{
get { return confirmed }
set { confirmed = value; }
}
Ответ 5
Существует несколько способов выполнения такого действия. В зависимости от ваших требований вы можете выбрать один из следующих способов:
// Old Conventional - Statement body
public class SampleClass1
{
public bool CanAccessFromOutside
{
get { return _cannotAccessFromOutside; }
}
private bool _cannotAccessFromOutside;
private void DoSomething()
{
_cannotAccessFromOutside = true;
}
}
// Expression Bodied Property
public class SampleClass2
{
public bool CanAccessFromOutside => _cannotAccessFromOutside;
private bool _cannotAccessFromOutside;
private void DoSomething()
{
_cannotAccessFromOutside = true;
}
}
// Auto Property
public class SampleClass3
{
public bool CanAccessFromOutside { get; private set; }
private void DoSomething()
{
CanAccessedFromOutside = true;
}
}