Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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#_Delegates_Scope - Fatal编程技术网

C# 实际场景中的委托:类范围内与命名空间范围内

C# 实际场景中的委托:类范围内与命名空间范围内,c#,delegates,scope,C#,Delegates,Scope,与直接在命名空间范围内声明类型相比,在类范围内声明委托类型有哪些优点和缺点?我指的是以下两项: namespace MyNamespace { public delegate string NamespaceScopeDelegate(int x, int y); public class ClassX { //class members } } 以及 namespace YourNamespace { public class C

与直接在命名空间范围内声明类型相比,在类范围内声明
委托
类型有哪些优点和缺点?我指的是以下两项:

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);  

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

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

也可以(内部或私有)执行以下操作:


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

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

也可以(内部或私有)执行以下操作:


通过将其设置为内部,只有相同的程序集才能访问它,并且不会使命名空间混乱;通过将其设置为私有,只有类本身可以访问委托声明。

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

以这段代码为例:

namespace YourNamespace
{
    public class ClassA
    {
    }
}
它生成一个名为
YourNamespace.ClassA
的类。没有任何实际的名称空间,只有一个带有点名称符号的类

对于类内定义的委托也是如此

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


就这么简单。

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

以这段代码为例:

namespace YourNamespace
{
    public class ClassA
    {
    }
}
它生成一个名为
YourNamespace.ClassA
的类。没有任何实际的名称空间,只有一个带有点名称符号的类

对于类内定义的委托也是如此

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

就这么简单

什么样的实际场景会让我使用后面的场景

对于代表来说,可能没有

如评论中所述:

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

什么样的实际场景会让我使用后面的场景

对于代表来说,可能没有

如评论中所述:

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


如果我把声明保密,那有什么用呢?我是说,这毕竟是一个代表。如果外部代码不能引用它,那么声明它又有什么意义呢?@NerotheZero我看不出嵌套委托有多实际用途。通常,我将嵌套类型视为其所属类的实现细节,因此通常使它们
私有。到目前为止,我发现的最有用的应用程序是,如果
ClassA
上的公共方法返回接口类型,在
ClassA
中私下嵌套的类可以实现该接口,如果该实现足够具体到
ClassA
以保证外部代码无法访问该接口。@shambulator:我现在记不起确切的类名,但我想我见过.NET framework类具有成员委托类型。如果我错了,请纠正我。@NerotheZero我怀疑你是对的,但我也不记得名字了。不管怎样,@Femaref的答案非常准确——拥有公共嵌套类型的唯一原因是表明这两个类型之间(非常)紧密的关联——非常紧密,以至于大多数类型都应该是非嵌套的。私有嵌套的委托听起来一点用处都没有,随着generic
Action
Func
委托的引入,IMO甚至没有理由声明任何新的委托类型,即使它们根本没有嵌套。尽管我意识到这并不是一个很令人满意的答案:)@shambulator:如果某个代码的特定实现意味着要向某个东西发送信号,那么它一定有理由认为应该向发送信号的人(无论是程序员还是客户机代码)发送信号,对吧?如果我把声明保密会有什么用吗?我是说,这毕竟是一个代表。如果外部代码不能引用它,那么声明它又有什么意义呢?@NerotheZero我看不出嵌套委托有多实际用途。通常,我将嵌套类型视为其所属类的实现细节,因此通常使它们
私有。到目前为止,我发现的最有用的应用程序是,如果
ClassA
上的公共方法返回一个接口类型,一个嵌套在其中的类<