在类范围内声明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);
为什么我要这样做?第二种情况是否提供了我不知道的任何封装?是否存在需要这种可访问性的特殊情况?
答案 0 :(得分:1)
在您当前的示例中,唯一的区别是第二个不会混淆您的命名空间,您需要首先引用它声明的类。您可以使用它来表明委托与该类具有密切关系,并且它主要由它单独使用。
以下也是可能的(内部或私人):
namespace YourNamespace
{
public class ClassA
{
internal/private delegate string ClassScopeDelegate(int x, int y);
//...
//other class members
}
}
通过将其设置为内部,只有相同的程序集可以访问它,并且它不会使您的命名空间混乱,通过使其成为私有,只有类本身可以访问委托声明。
答案 1 :(得分:0)
什么样的实际场景会让我使用后者?
对于代表,可能没有。
来自评论中已经提及的Nested Types:
如果类型很可能在声明类型之外被引用,则不要使用嵌套类型。在常见场景中,不应要求声明嵌套类型的变量和对象实例化。 例如,处理类上定义的事件的事件处理程序委托不应嵌套在类中。