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