[英]C# Extension methods in .NET 2.0
我找到了几个链接到扩展方法在.NET2.0中运行的方法( The moth , Discord&Rhyme , Stack Overflow )。 我还从一位同事那里隐约听到这会导致图书馆或其他问题? 是这样的吗? 所有3个使用不同的方法:
飞蛾 :
namespace System.Runtime.CompilerServices
{
public class ExtensionAttribute : Attribute { }
}
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class ExtensionAttribute : Attribute {}
}
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class
| AttributeTargets.Method)]
public sealed class ExtensionAttribute : Attribute {}
}
这些方法之间的区别是什么,你会推荐哪一种?
最终它不会产生太大的影响; 您可能会认为匹配运行时的那个是首选,但理想的答案是切换到.NET 3.5(否则在以后它可能会混淆与范围内相同属性的不同版本等)。
在[AttributeUsage]
会防止它被连接到的东西,它不会做任何事情-但它本身不会做反正... aything
根据类型查看元数据,确切的属性使用看起来最像是stackoverflow变体 - 但最终这并不是非常重要 - 名称和命名空间都很重要(并且它继承自Attribute
)。
差异很简单:
在第一个示例中,您可以将属性放在任何位置。 在第二个示例中,您只能将它应用于某个方法,对同一个方法只能应用一个方法,并且重写方法的继承类不会继承该属性。 在第三个示例中,您可以将其应用于方法,类或程序集。
如果您尝试在任何其他地方应用它,您将收到编译器错误。
第二个看起来最有意义。
我会推荐Discord和Rhyme,因为它为如何应用属性提供了有意义的约束。
就个人而言,我建议避免这三个。 每个选项都通过执行“技巧”来实现这一点 - 我不会依赖它来生成代码。
如果要使用扩展方法,请升级到C#3.0。 否则,只需坚持使用非扩展方法语法调用该方法。
您可以随时进行扩展方法调用:
public static class Utility {
public static string Extension(this string original) { ... }
// call with:
var newString = myString.Extension();
并直接调用它:
string newString = Utility.Extension(myString);
这将与C#/。NET 2语法更加一致,并且将是我的建议。
SO版本是准确的版本,为了您应该使用它的准确性。
Fwiw,AttributeTarget.Method说明符非常清楚。 等级和装配不那么重要。 C#和VB.NET编译器都在包含扩展方法的静态类/ Module上发出属性。 并在包含类/模块的程序集上。 为什么他们这样做不太清楚,不需要正确编译它们。 我猜这是一个优化工作,帮助编译器和IntelliSense发现何时应该考虑扩展方法。
获取应用于程序集的属性实际上是一个问题。 当您将代码编译为.netmodules时,这将无法正常工作。 但这是一个非常模糊的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.