在同一个类中使用构造函数参数时,为什么要访问私有属性

时间:2019-01-11 12:33:50

标签: c#

我有一个有效的示例代码,我无法解释为什么这样工作。

以此类为例。

 public class TestClass
{
    private int _testValue;


    public void TestMethod()
    {
        var t = new TestClass() {_testValue = 42}; // Why is that working?
    }
}

为什么允许这样做? 我本来希望有这样的行为:

static void Main(string[] args)
    {

        new TestClass() { _testValue = 23 }; // Does not compile and I am happy with that.

        // The code provided will print ‘Hello World’ to the console.
        // Press Ctrl+F5 (or go to Debug > Start Without Debugging) to run your app.
        Console.WriteLine("Hello World!");
        Console.ReadKey();

        // Go to http://aka.ms/dotnet-get-started-console to continue learning how to build a console app! 
    }

编辑:请您发表评论,但我知道private关键字的意思是,问题是,当我在同一个对象中使用参数构造函数时,为什么可以访问私有属性。 放置调试器,您将看到TestClass this._testValuet._testValue

不同

我脑海中的正常行为是我在Main函数中拥有的行为。

Debugger.

4 个答案:

答案 0 :(得分:2)

  

private keyword
  专用访问权限是最低允许的访问级别。 仅在类的主体或声明其的结构内可访问私有成员 ...
  在类或声明它的结构之外引用私有成员是编译时错误。

如果您查看private关键字的文档,则与您的问题有关的“关键”部分是它可以在类的主体内访问,而不仅限于仅通过同一实例访问声明了私有成员或方法的那个。

在您添加的示例中,TestMethod位于TestClass中,因此TestMethod中的代码可以访问其自己的实例以及它有权访问的任何其他实例中的任何私有方法或属性。 / p>

这在关键字的带引号的定义中表明:TestMethod是“在声明了_testValue的类的主体中”,因此它可以访问它们。

文档中没有限制,访问必须通过特定实例进行,因此,无论您如何在TestClass内创建或访问新的或不同的TestMethod,您都可以访问该实例的私有成员和方法。

我们拥有private的原因之一是使内部结构远离无关的代码,但仍然提供对其所属类的访问。这使类可以操作其自身的实例,这在将内部数据从一个对象的实例复制到另一个实例中非常重要。您不想创建那些public,因为那样的话其他任何不相关的代码都将具有不需要的访问权限。

private的这种行为至少与C ++和TypeScript共享,并且可能在大多数具有publicprivate访问权限的编程语言中普遍存在。

答案 1 :(得分:1)

取自documentation

  

私人访问权限是最低的访问权限级别。私人会员   仅可在该类的主体或其中的struct中访问   声明它们,如本例所示:

     

-snip-

     

同一主体中的嵌套类型也可以访问这些私有成员。

     

引用外部的私有成员是编译时错误   类或声明它的结构。

至于您的屏幕截图。 第一个users的值是0,因为这是int的默认值,并且在创建该对象时没有设置其他任何东西。

您在_testValue内创建的新对象-您明确为此设置了23的值,并且这样做是因为您可以按照TestClass关键字的定义访问该属性

答案 2 :(得分:0)

让我只提及您问题的这一特定部分-我认为它应该可以帮助您了解行为:

  

放置调试器,您将看到TestClass this._testValue与t._testValue不同

现在,对此处发布的所有private关键字定义进行一些澄清。 privateprotected访问修饰符均引用class而不是object-这意味着,如果将某个属性标记为private,则该对象的任何对象类可以在同一类的任何实例(包括不同的对象)中访问该私有属性。这就是为什么明确地说:

  

仅在类的正文 或声明它们的结构中可以访问私有成员。

如果大多数(如果不是全部)面向对象的编程语言,则是相同的。这样做的理由可能是,如果两个对象属于同一类,那么他们知道如何正确,安全地处理和使用其私有成员-那么就没有必要限制该访问了。

答案 3 :(得分:0)

您似乎假设private关心实例-显然并不如此。实际上,您甚至不需要实例-例如static成员上。

因此,是否可以访问类的成员取决于两个因素:

  1. 您与该成员在同一个范围内吗?
  2. 您有权访问该成员所属的实例吗?

在您的情况下,您的成员为private,这使成员范围成为类级别。 TestMethod是该类中的一种方法,因此指向一个匹配项。

您有两个不同的实例。当您位于TestMethod中时,您当然可以访问this(当前实例)的成员。此外,您还引用了新创建的实例t。因此,第2点同样适用,您可以访问两个实例的两个成员。

除了点2:如果成员是静态成员,则没有实例,您可以始终从另一个实例中访问它。