Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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语言中密封类的扩展方法#_C#_.net_Extension Methods - Fatal编程技术网

C# c语言中密封类的扩展方法#

C# c语言中密封类的扩展方法#,c#,.net,extension-methods,C#,.net,Extension Methods,我有这个密封的类 public sealed class A { public string AName {get;set;} } 有人可以像这样为它编写一个扩展方法: public static class Extensions { public static void ExtensionMethodForA (this A a) { Console.WriteLine("A's Extension method!"); } } 问题是,你如何防止这种

我有这个
密封的

public sealed class A
{
    public string AName {get;set;}
}
有人可以像这样为它编写一个扩展方法:

public static class Extensions
{
   public static void ExtensionMethodForA (this A a)
   {
      Console.WriteLine("A's Extension method!");
   }
}

问题是,你如何防止这种情况发生?

你没有。你不能。你不应该这么做


实例方法总是优先于扩展方法,因此它不应该出现冲突。除此之外,它们只是语法/方便。不要试图给打电话的人带来生活不便。

这没有意义。任何用户仍然可以创建一个静态类,该类实现了使用您的类类型的方法

它们只是在声明中省略了“this”,调用方必须显式地传递对象,而不是使用更简单的方法。语法。最终结果将是相同的


扩展方法只是表达我刚才描述的内容的一种更好的方式,无论如何,它都是可能的。

您可能会被术语“扩展方法”弄糊涂。它不是类中的方法,甚至不是派生类;它是对类型的操作。它无法访问类层次结构的私有、受保护或内部成员,因此该类仍然是密封的


所以,你不能也不需要阻止它。

你不能阻止它-没有关键字可以在你的类中阻止此功能。如果你有一个类,有人可以为它编写一个扩展方法。但为什么会出现这样的问题?你想阻止别人做什么?@marc_s:我正在网上分发我的自定义助手库。但是,如果某个主体编写了一些
不需要的
扩展方法,创建dll的包装器,然后给出一个完全不同的dll,该功能不能被“禁用”。如果你在网上分发你的库,可能是为了保护它,如果可能的话,给它签名并使用模糊处理。你已经创建了一个公共类。您希望用户能够使用它。您无法控制用户使用它做什么/如何包装它。您可以阻止人们从中派生(使用sealed),但是使用扩展方法进行扩展实际上除了使静态方法调用看起来更漂亮之外,并没有做任何事情。如果您为用户提供了一个类,那么没有任何东西可以阻止他们将您的所有类包装到他们自己的类中,添加额外的函数,并发布新的DLL。@nowhewhomustnotbenamed.:谁来决定不需要的扩展方法是什么???:谢谢marc。但是,我担心的是:“我在网上发布我的自定义帮助程序库。但是,如果某个主体编写了一些不需要的扩展方法,创建了dll的包装器,然后发布了一个完全不同的dll呢?”+1@现在他不应该被解雇你的担心听起来像是“如果有人真的使用了我的图书馆怎么办”。。。“或者我错过了什么?”现在他不应该被谁称为“多余的”?如果有人创建了扩展方法,根据定义,它必须是“想要的”。此外,他们还需要部署原始dll和声明扩展方法的dll。“你担心的是什么还不清楚。”@MarcGravel:这是有道理的。谢谢Marc@nowhewhomustnotbenamed. 如果用户使用的代码来源不可信,那么您已经丢失了;故事结束了。他们可以做任何他们想做的恶意行为,阻止他们的时间已经过去了。这就像在管理员帐户被黑客攻击时试图禁止管理员用户的权限一样。到那时已经太晚了。