如何使公共方法只在类本身和C#中拥有对象的类中可见

本文关键字:拥有 对象 何使公 方法 | 更新日期: 2023-09-27 18:19:29

我和同事在研究获取委托的调用列表时遇到了这个问题。如果您在类X中创建了一个事件,那么您可以从该类中访问事件fine的公共方法。但是(请忽略为什么您可以对类成员进行公共访问,这不是我们要问的!),如果我们有一个实例化X的类Y,并访问X中的事件,它就不能调用任何公共方法,如事件的GetInvocationList()。我们想知道这是怎么回事。下面是一个代码示例(阅读注释以了解我们的意思):

    public class X
    {
        public delegate void TestMethod();
        public event TestMethod testMethod;
        private void rubbish()
        {
            // can access testMethod.GetInvocationList() fine here
            testMethod.GetInvocationList(); 
        }
    }
    public class Y
    {
        public Y()
        {
            X x = new X();
            x.testMethod += this.test;
            // here it says testMethod can only appear on the left hand side of += or -=
            // why is this? (i.e. the below line is invalid)
            x.testMethod.GetInvocationList(); 
        }
        public void test()
        {
        }
    }

出于好奇,你是如何做到这一点的?为什么有这个功能?

非常感谢Amit

如何使公共方法只在类本身和C#中拥有对象的类中可见

这就是event关键字的作用;它是一个修饰符,用于限制除订阅所属类之外的操作。如果删除event关键字,则最终会得到一个普通委托,类外的客户端可以调用该委托,例如.上的GetInvocationList()方法

在一篇博客文章中,他们比较了为普通委托和事件生成的IL代码,结果处理完全相同。event关键字是一个编译时修饰符,用于限制对委托方法的访问。(它还支持在接口中使用)。所有细节都在博客文章中。

我发现了一些关于这方面的信息-在声明类之外对它的访问非常受限-下面是MSDN网站(事件教程)。

只能从声明事件的类中调用事件。连接到课外活动声明它时,事件看起来像一个字段,但访问该字段场地非常有限。唯一可以做的事情是:

在该字段中组成一个新的委托。

从字段(可能是复合字段)中删除委托。

这是用+=和-=运算符完成的。开始接收事件调用时,客户端代码首先创建事件类型的委托它引用了应该从事件中调用的方法。然后它将该委托组合到该事件的任何其他委托上可能使用+=连接到。

更多信息请访问链接。

afaik仅在使用事件时,如果删除行中的"事件",则可以使用该方法进行微调

将代表与事件分开思考

嗯。。。我要在这里打WAG。

将委托声明放在任何类之外的命名空间中。

  • 在类X中,创建该委托的实例(别管事件)并注册"处理者:"(我用这个词很巧妙)。

  • 创建一个公共方法或属性,以便类Y可以获得(引用to)委托,因此它的调用列表。

  • 现在你可以在Y班做任何你想做的事了。你甚至可以创建一个使用类X的委托调用列表在类Y中"镜像"事件。