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

时间:2014-01-23 15:43:26

标签: c# asp.net .net asp.net-mvc getter

我想为我的网站创建一个包含大量私有变量的类。

我认为有一个解决方案是不为每个变量编写所有的getter和setter,比如

private int confirmed { get; set; }

这是正确的方法吗?那么,如何从课外访问这个值?

我试过.confirmed,我收到的错误是说它是私密的(我明白了)

但更令人惊讶的是,.getConfirmed()getconfirmed()也不起作用。

我认为{ get; set; }会产生隐含的那些方法。

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

5 个答案:

答案 0 :(得分:17)

您可以将您的财产声明为公开,然后将getter或setter分别标记为私有:

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

答案 1 :(得分:4)

您需要了解这一点,

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使得访问者和mutator都是私有的,这就是为什么你不能在类之外访问它们的原因。此外,这些方法在编译时无法访问,因此不允许调用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)。它是一种流行的命名约定,用于区分这两种类型,特别是对于该类的消费者。

答案 2 :(得分:3)

  

如何从课外访问此值?

无法(没有反映形成可信代码)。他们私人。如果您希望 getter 是公开的,但 setter 是私有的,那么

public int confirmed { get; private set; }
  

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

确实如此,但它们在设计时无法访问。

答案 3 :(得分:2)

如果你想从课外获得它,就这样做。

    public int confirmed { get; set; }

或者你可以走这条路:

    private int confirmed;

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

答案 4 :(得分:1)

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

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