【问题标题】:How to access private variables using { get; set; }如何使用 { get; 访问私有变量放; }
【发布时间】:2014-01-23 15:43:26
【问题描述】:

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

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

private int confirmed { get; set; }

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

我试过 .confirmed ,我收到错误消息说它是私有的(我理解)

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

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

有人可以帮我澄清一下这个问题吗?

【问题讨论】:

  • 我认为看到名为 getconfirmed 的方法是 java 的事情,这就是为什么不在 .net 中看到它们并不奇怪。

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


【解决方案1】:

您可以将您的属性声明为公共的,然后将 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
    }
}

【讨论】:

    【解决方案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。正如其他人所提到的,您可以单独修改 getsetreadonlywriteonly 类型的行为,

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

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

    最后一件事,你应该养成使用驼峰式包装的习惯,例如Confirmed 和字段的小写驼峰式,例如confirmed(有些人甚至可能会这样做_confirmed)。区分这两种类型是一种流行的命名约定,尤其是对于类的消费者而言。

    【讨论】:

    • +1 表示关于外壳的注释。阅读代码要容易得多,因为人们可以通过其外壳来直观地了解成员的类型。
    【解决方案3】:

    如何从类外部访问该值?

    不能(没有反射形式的可信代码)。他们是私人的。如果您希望 getter 是公开的,而 setter 是私有的,那么就这样做

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

        【讨论】:

          猜你喜欢
          • 2011-03-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-13
          • 2015-09-25
          相关资源
          最近更新 更多