如何使用 { get; set; } 访问私有变量

21

我想为我的网站创建一个有很多私有变量的类。

我认为有一种解决方法,可以避免为每个变量编写所有的getter和setter,类似于

private int confirmed { get; set; }

这是正确的方法吗?然后,我该如何从类外访问这个值?

我尝试过.confirmed,但我得到了“它是私有的”(我理解这个)的错误。

更令人惊讶的是,.getConfirmed() 或者 getconfirmed() 也不能正常工作。

我以为{ get; set; }会隐式地创建这些方法。

请问有人可以为我澄清这个问题吗?


看到被称为getconfirmed的方法应该是Java的事情,这就是为什么在.NET中没有看到它们并不奇怪。 - Simon Halsey
5个回答

26
你可以将属性声明为public,然后分别将getter或setter标记为private:
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
    }
}

7

你需要理解,

在IT技术中,

private int confirmed { get; set; }

将扩展为一组包含私有支持字段和私有方法的代码。
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。正如其他人所提到的,您可以单独修改getset以获得readonlywriteonly类型的行为。

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

或者

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

还有一件事,你应该养成使用驼峰式命名属性的习惯,例如Confirmed,并使用小写驼峰式命名字段,例如confirmed(有些人甚至会使用_confirmed)。这是一种流行的命名约定,用于区分两种类型,特别是对于类的消费者。


对于大小写的注释点赞。通过大小写,我们可以直观地了解成员的类型,这样编写的代码更易读。 - Shibumi

3

如何从类外部访问这个值?

你不能(除非使用受信任代码的反射)。它们是私有的。如果你想让getter是public但setter是private,那么可以这样做:

public int confirmed { get; private set; }

我认为 {get;set;} 会自动创建这些方法。
确实如此,但它们在设计时是不可访问的。

2

有多种方法可以执行此操作。根据您的要求,您可以从以下任何一种方法中选择:

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

2

如果你想从类外部获取它,请按照以下步骤操作。

    public int confirmed { get; set; }

或者你也可以选择这个方法:
    private int confirmed;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接