【问题标题】:Difference between public and private variables公共变量和私有变量之间的区别
【发布时间】:2011-05-25 11:03:38
【问题描述】:
namespace hi
{
    class hithere
    {
         public int numberOne = 12;
         private int numberTwo = 12;

         static void yo()
         {
         }
    }
}

谁能告诉我这段代码摘录中变量 numberOne 和 numberTwo 之间的区别?

【问题讨论】:

  • 哦,我如何从这个用户更改我的名字######### 东西?
  • 谢谢伙计。不习惯有这样的用户名:)
  • Why use public variables? 的可能重复项

标签: c# access-modifiers


【解决方案1】:

来自accessibility levelsMSDN

公开访问不受限制。

protected 访问仅限于包含的类或派生自的类型 包含类。

内部访问仅限于当前程序集。

受保护的内部访问仅限于当前程序集或 从包含派生的类型 类。

private访问仅限于包含类型。

【讨论】:

    【解决方案2】:

    公共变量可以从外部类访问,但私有变量只能用于当前类和内部类:

    public class VarClass
    {
        public int publicID = 10;
        private int privateID = 100;
        public VarClass()
        {
            Console.WriteLine(publicID);
            Console.WriteLine(privateID);
        }
    
        public class InnerClass
        {
            public InnerClass()
            {
                VarClass c = new VarClass();
                Console.WriteLine(c.privateID);
                Console.WriteLine(c.publicID);
            }
        }
    }
    
    public class OuterClass
    {
        public OuterClass()
        {
            VarClass c = new VarClass();
            Console.WriteLine(c.privateID); // Compile Error
            Console.WriteLine(c.publicID);
        }
    }
    

    【讨论】:

      【解决方案3】:

      其他对象可以访问 NumberOne,但不能访问 numberTwo。

      所以我可以做Your_Object.numberOne = 14;,但我不能做Your_Object.numberTwo= 14;

      现在我可能能够根据应用程序中设置的权限通过反射访问 numberTwo,但我不能直接访问。

      Variables in C#
      Reflection in C#
      Accessors in C#

      【讨论】:

        【解决方案4】:

        一般来说,PUBLIC 意味着类之外的任何其他代码都可以更改其值。 PRIVATE 只能在类本身中使用/更改。此外,如果您构建从另一个派生的类,并且您希望子级类能够使用/更改其父级的值,但不能使用/更改该类之外的其他通用代码,请使用 PROTECTED。

        【讨论】:

          【解决方案5】:

          搜索“封装”。 有很多简单的材料可以学习。

          【讨论】:

            【解决方案6】:

            用最简单的术语来说,numberOne 被标记为公共意味着如果您创建 hithere 类的实例,则该成员变量将是可访问的。例如:

            hithere h = new hithere()
            h.numberOne = 42;
            

            numberTwo 是私有的意味着这是不可访问的,只能在 hithere 类中使用。所以进一步看上面的例子:

            hithere h = new hithere()
            h.numberOne = 42;
            h.numberTwo = 84;
            

            最后一行将导致编译器错误,因为您无法访问 numberTwo,因为它是私有的。

            可能值得花一些时间阅读访问修饰符,快速谷歌会找到很多示例,例如:

            http://www.devsource.com/c/a/Techniques/Understanding-C-Class-and-Member-Modifiers/ http://msdn.microsoft.com/en-us/library/ba0a1yw2%28v=vs.80%29.aspx

            此外,您的hithere 类没有定义访问修饰符,因此编译器假定这是私有的。因此,如果您要从另一个库引用您的库,您将无法创建 hithere 类的实例。

            【讨论】:

              【解决方案7】:

              publicprivate 是成员的访问修饰符。这是指谁可以通过代码直接访问成员。 public 表示访问不受限制,任何人都可以通过代码直接访问会员。 private 表示访问仅限于包含类。所以大家可以直接通过代码访问numberOne,但是只有包含类才能通过代码直接访问numberTwo

              一共有五个访问修饰符:

              public:访问不受限制

              protected:访问仅限于包含类或从包含类派生的类

              internal: 访问仅限于包含程序集

              protected internal:这是 protectedinternal 的 OR,因此访问权限仅限于包含类或从包含类或包含程序集派生的类

              private: 访问仅限于包含类

              请注意,“直接通过代码”子句在这里很关键;可以使用反射访问这些成员。

              C# 规范的相关部分是 §3.5,尤其是 §3.5.2。

              【讨论】:

              • private: access is limited to the defining class 不,也是内部类
              • @Saeed:在定义类中。
              • containing type 最好像 MSDN 一样,因为它不是变量的定义者。
              【解决方案8】:

              这意味着如果你有另一个这样的类:

              namespace hi
              {
                  class hithere2
                  {
                       static void yo2()
                       {
                           hithere h = new hithere();
                           h.numberOne = 2;
                           h.numberTwo = 3;
                       }
                  }
              }
              

              第二个错误,但第一个没问题。

              【讨论】:

                【解决方案9】:

                numberOne(公共变量)和numberTwo(私有变量)之间的主要区别在于值的控制方式。私有变量必须通过公共函数访问,才能在类外更改(setter)或读取(getter)。

                您可以将公共函数视为与私有变量交互的接口。例如,为变量 numberTwo 设置一个设置器将允许您控制该值的更改方式,您可以设置该值必须在特定范围内(即 1-10)或该变量的其他条件修改。

                基本上,

                • public:可以在任何地方访问
                • private:只能在类内访问

                【讨论】:

                  猜你喜欢
                  • 2012-05-14
                  • 1970-01-01
                  • 2014-08-22
                  • 1970-01-01
                  • 2011-05-25
                  • 1970-01-01
                  • 2011-12-03
                  • 2013-06-22
                  • 1970-01-01
                  相关资源
                  最近更新 更多