Krowar
Krowar

Reputation: 591

How to access private variables using { get; set; }

I'd like to create a class for my website with a lot of private variable.

I thought there was a solution not to write all the getters and setters for each variable, something like

private int confirmed { get; set; }

Is it the right way? ANd then, how do I access this value from outside the class?

I've tried .confirmed , I get the error saying that it's private (which I understand)

But more surprising, .getConfirmed() or getconfirmed() do not work either.

I thought that the { get; set; } would create implicitely those methods.

Can someone clarify this concern for me please?

Upvotes: 21

Views: 48537

Answers (5)

singhsac
singhsac

Reputation: 401

There are multiple ways to perform such action. Depending upon your requirements, you can choose any one method from below:

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

Upvotes: 2

D Stanley
D Stanley

Reputation: 152521

how do I access this value from outside the class?

You can't (without reflection form trusted code). They're private. If you want the getter to be public but the setter private then do

public int confirmed { get; private set; }

I thought that the {get;set;} would create implicitly those methods.

It does, but they're not accessible at design time.

Upvotes: 3

rae1
rae1

Reputation: 6144

You need to understand that,

private int confirmed { get; set; }

will be expanded to a set of private methods with a private backing field,

private int _confirmed;

private int confirmed_get() 
{ 
    return this._confirmed; 
}

private void confirmed_set(int value) 
{ 
    this._confirmed = value; 
}

Thus, marking the property private makes both the accessor and the mutator also private, which is why you cannot access them outside of the class. Also, these methods are not accessible at compile time, so calling instance.confirmed_get() is not permitted, only instance.confimed both to read and write to the property.

What you might want is to declare it public,

public int confirmed { get; set; }

where the behavior is similar (the field still is private), but both method are now public. As others have mention you can individually modify the get and set for readonly or writeonly type of behavior,

public int confirmed { get; private/protected set; }

or

public int confirmed { private/protected get; set; }

And one last thing, you should get into the habit of using camel case for propeties, e.g. Confirmed and lower camel case for fields, e.g. confirmed (some might even do _confirmed). It is a popular naming conventions to distinguish the two types, especially for consumers of the class.

Upvotes: 7

DROP TABLE users
DROP TABLE users

Reputation: 1955

Just do this if you want to get it from outside the class.

    public int confirmed { get; set; }

or you can go this route:

    private int confirmed;

    public int Confirmed 
    {
        get { return confirmed }
        set { confirmed = value; }
    }

Upvotes: 2

CodingIntrigue
CodingIntrigue

Reputation: 78525

You can declare your property as public, then mark the getter or setter individually as private:

public int confirmed { get; private set; }

That way, you can access confirmed outside of your defined class:

Console.WriteLine(myClass.confirmed); // This is OK
myClass.confirmed = "Nothing"; // Can't do this

And the only one who can set the value of confirmed is then MyClass:

public class MyClass {
    public int confirmed { get; private set; }

    public MyClass() {
        this.confirmed = "This"; // This is fine as we have private access
    }
}

Upvotes: 28

Related Questions