Как получить доступ к закрытым переменным, используя { 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;
        }
    }
Другие вопросы по тегам