Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在同一类中使用构造函数参数时可以访问私有属性_C# - Fatal编程技术网

C# 为什么在同一类中使用构造函数参数时可以访问私有属性

C# 为什么在同一类中使用构造函数参数时可以访问私有属性,c#,C#,我有一个工作的示例代码,我无法解释为什么这样工作 以这门课为例 public class TestClass { private int _testValue; public void TestMethod() { var t = new TestClass() {_testValue = 42}; // Why is that working? } } 为什么允许这样做? 我本以为会有这样的行为: static void Main(str

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

以这门课为例

 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.\u testValue
t.\u testValue

我头脑中的正常行为就是我在主要功能中的行为

摘自:

私有访问是最低权限的访问级别。私人成员 只能在中的类或结构体中访问 它们被声明,如本例所示:

-剪断-

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

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

至于你的截图。。 first
\u testValue
的值为0,因为这是int的默认值,并且在创建该对象时没有设置任何其他值

您在
TestClass
中创建的新对象-您显式地将值设置为23,这样做是因为您可以根据
private
关键字的定义访问该属性


私有访问是最低权限的访问级别。私有成员只能在声明它们的类体或结构体中访问
在声明私有成员的类或结构之外引用私有成员是编译时错误

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

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

关键字的引用定义中指出了这一点:
TestMethod
是“在声明了
\u testValue
的类的主体中”,因此它可以访问这些

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

我们有
private
的原因之一是为了使内部远离无关的代码,但仍然提供对它所属类的访问。这允许类操作自身的实例,这在将内部数据从对象的一个实例复制到另一个实例时非常重要。您不希望将这些
公开
,因为这样任何其他不相关的代码都会有不必要的访问权限


<> > <>代码>私下<>代码>至少与C++和TypeScript共享,并且在大多数不是所有的编程语言中都有共同点,如“<代码>公共< /COD>”和私下< //C> Access .< /P> < P>让我只参考您问题的这个特定部分-我认为它应该有助于您理解行为:


放置一个调试器,您将看到TestClass this.\u testValue与t.\u testValue不同

现在,请澄清一下这里发布的所有
private
关键字定义。
private
protected
访问修饰符都指的是
而不是
对象
——这意味着如果属性标记为
private
,则该类的任何对象都可以在同一类的任何实例中访问该私有属性,包括不同的对象。这就是为什么定义明确地说:

私有成员只能在类的主体或声明它们的结构中访问


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

您似乎认为
private
关心实例,而它显然不关心。事实上,你甚至不需要一个实例——例如,在
静态
成员上

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

  • 您是否与该成员在同一范围内
  • 您是否有权访问该成员所属的实例 在您的情况下,您的成员是
    private
    ,这使得成员的作用域为类级别
    TestMethod
    是该类中的一个方法,因此点1匹配

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


    作为第2点的补充:如果成员是静态的,没有实例,那么您可以从另一个实例中访问它。

    Main属于哪个类?如果它与
    TestClass
    不同,您肯定无法访问
    TestClass
    的私有成员。但是在
    TestMethod
    中,您当然可以。那是你的名字吗