gpt4 book ai didi

c# - 为什么私有(private)字段是类型私有(private)的,而不是实例私有(private)的?

转载 作者:IT王子 更新时间:2023-10-29 03:31:32 27 4
gpt4 key购买 nike

在 C#(和许多其他语言)中,访问相同类型的其他实例的私有(private)字段是完全合法的。例如:

public class Foo
{
private bool aBool;

public void DoBar(Foo anotherFoo)
{
if (anotherFoo.aBool) ...
}
}

作为C# specification (第 3.5.1、3.5.2 节)声明对私有(private)字段的访问是在类型上,而不是在实例上。我一直在与一位同事讨论这个问题,我们正试图找出它为何如此工作的原因(而不是限制对同一实例的访问)。

我们能想到的最好的论据是进行相等性检查,其中类可能想要访问私有(private)字段以确定与另一个实例是否相等。还有其他原因吗?或者一些黄金理由绝对意味着它必须像这样工作或者其他事情是完全不可能的?

最佳答案

我认为它以这种方式工作的一个原因是因为访问修饰符在编译时 起作用。因此,确定给定对象是否也是当前 对象并不容易。例如,考虑这段代码:

public class Foo
{
private int bar;

public void Baz(Foo other)
{
other.bar = 2;
}

public void Boo()
{
Baz(this);
}
}

编译器能否确定 other 实际上是 this?并非在所有情况下。有人可能会争辩说这不应该在那时编译,但这意味着我们有一个代码路径,其中无法访问正确实例的私有(private)实例成员,我认为这更糟。 p>

只需要类型级别而不是对象级别的可见性可确保问题易于处理,并使看起来应该有效的情况实际上有效。

编辑:Daniel Hilgarth 认为这种推理是倒退的观点确实有其道理。语言设计者可以创建他们想要的语言,而编译器编写者必须符合它。话虽这么说,语言设计者确实有一些动机让编译器编写者更容易完成他们的工作。 (尽管在这种情况下,很容易争辩说私有(private)成员可以通过this(隐式或显式)访问)。

但是,我认为这会使问题变得比它需要的更加困惑。如果上述代码不起作用,大多数用户(包括我自己)会发现这是不必要的限制:毕竟,那是我要访问的我的数据!为什么我必须经历 this

简而言之,我认为我可能夸大了编译器“困难”的情况。我真正想表达的是,上述情况似乎是设计人员希望工作的情况。

关于c# - 为什么私有(private)字段是类型私有(private)的,而不是实例私有(private)的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6983553/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com