Как получить доступ к закрытым переменным, используя { get; задавать; }
Я хотел бы создать класс для моего сайта с большим количеством приватных переменных.
Я думал, что есть решение не писать все методы получения и установки для каждой переменной, что-то вроде
private int confirmed { get; set; }
Это правильный путь? И как я могу получить доступ к этому значению вне класса?
я пробовал .confirmed
, Я получаю сообщение об ошибке, говоря, что это личное (что я понимаю)
Но более удивительно, .getConfirmed()
или же getconfirmed()
тоже не работают.
Я думал, что { get; set; }
создаст имплицитно эти методы.
Может кто-нибудь прояснить эту проблему для меня, пожалуйста?
5 ответов
Вы можете объявить вашу собственность как общедоступную, а затем отдельно пометить получателя или установщика как частную:
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
}
}
Вы должны понимать это,
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
). Это популярные соглашения о присвоении имен, чтобы различать два типа, особенно для потребителей этого класса.
как я могу получить доступ к этому значению за пределами класса?
Вы не можете (без отражения формы доверенного кода). Они частные. Если вы хотите, чтобы получатель был общедоступным, но установщик частным, тогда выполните
public int confirmed { get; private set; }
Я думал, что {get;set;} неявно создаст эти методы.
Это так, но они не доступны во время разработки.
Просто сделайте это, если вы хотите получить его за пределами класса.
public int confirmed { get; set; }
или вы можете пойти по этому маршруту:
private int confirmed;
public int Confirmed
{
get { return confirmed }
set { confirmed = value; }
}
Есть несколько способов выполнить такое действие. В зависимости от ваших требований, вы можете выбрать один из следующих методов:
// 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;
}
}