1

Delegate在类范围内声明类型与直接在命名空间范围内声明类型相比有哪些优缺点?我的意思是以下两个-

namespace MyNamespace
{
    public delegate string NamespaceScopeDelegate(int x, int y);

    public class ClassX
    {
        //class members
    }
}  

和,

namespace YourNamespace
{
    public class ClassA
    {
        public delegate string ClassScopeDelegate(int x, int y);

        //...
        //other class members
    }
}  

什么样的实际场景会让我使用后一个?我的意思是它到底在哪里合适?

编辑 :

对于第一种情况,每当我需要实例化委托类型时,我可以这样做 -

var delegateInstance = new NamespaceScopeDelegate(MethodToPoint);  

但对于第二种情况,我必须使用封闭类型名称作为 -

var delegateInstance = new ClassA.ClassScopeDelegate(MethodToPoint);  

我为什么要这样做?第二种情况是否提供了我还不知道的任何封装?是否有任何特殊情况需要这种可访问性?

4

3 回答 3

1

在您当前的示例中,唯一的区别是第二个不会弄乱您的命名空间,您需要引用它首先声明的类。您可以使用它来明确委托与类有密切的关系,并且主要由它单独使用。

以下也是可能的(内部或私有):

namespace YourNamespace
{
    public class ClassA
    {
        internal/private delegate string ClassScopeDelegate(int x, int y);

        //...
        //other class members
    }
}

通过将其设为内部,只有同一个程序集可以访问它,并且它不会弄乱您的命名空间,通过将其设为私有,只有类本身可以访问委托声明。

于 2012-09-19T10:45:24.303 回答
0

您需要了解命名空间只是您的类/委托的一个漂亮的命名工具。

以这段代码为例:

namespace YourNamespace
{
    public class ClassA
    {
    }
}

它产生一个名为 的类YourNamespace.ClassA。没有任何实际的命名空间 - 只是一个带有点名称符号的类。

对于在类中定义的委托也是如此。

重要的是您希望如何组织代码。

就那么简单。

于 2012-09-21T03:11:23.627 回答
0

什么样的实际场景会让我使用后一个?

对于代表,可能没有。

来自评论中已经提到的嵌套类型:

如果类型可能在声明类型之外被引用,则不要使用嵌套类型。在常见情况下,不应该要求声明嵌套类型的变量和对象实例化。例如,处理类上定义的事件的事件处理程序委托不应嵌套在类中。

于 2017-12-19T10:27:49.803 回答