为什么访问另一个对象实例的私有函数有效

本文关键字:函数 有效 实例 访问 一个对象 为什么 | 更新日期: 2023-09-27 17:56:36

可能的重复项:
为什么私有字段是类型私有字段,而不是实例私有字段?

请考虑以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Foo foo = new Foo();
            Foo foo2 = new Foo();
            foo.Test(foo);
            Console.ReadLine();
        }
    }

    public class Foo
    {
        public void Test(Foo foo)
        {
            Console.WriteLine("I was called");
            foo.test_fuction();
        }
        private void test_fuction()
        {
            Console.WriteLine("!");
        }

    }
}

在这种情况下,我希望 private 关键字会阻止访问实例的成员变量和函数。这难道不会允许某人写一些写得不好的对某些对象的迂回访问吗?有没有办法防止这种行为?还是有充分的理由?

为什么访问另一个对象实例的私有函数有效

Private 表示成员可以在声明它的类型的主体中访问,而不仅仅是由给定实例访问。

无法阻止此行为。如果只有特定实例可以访问私有成员,则静态方法的用处将小得多。

从规范的第 3.5.2 节:

在程序 P 中的类型 T 中声明的嵌套成员 M 的可访问性域定义如下(注意 M 本身可能是一个类型):

    如果 M 声明的可
  • 访问性是私有的,则 M 的可访问性域是 T 的程序文本。