繁体   English   中英

.NET 2.0中的C#扩展方法

[英]C# Extension methods in .NET 2.0

我找到了几个链接到扩展方法在.NET2.0中运行的方法( The mothDiscord&RhymeStack 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,因为它为如何应用属性提供了有意义的约束。

  1. 它只能应用于方法
  2. 您只能申请一次
  3. 该属性无法继承

就个人而言,我建议避免这三个。 每个选项都通过执行“技巧”来实现这一点 - 我不会依赖它来生成代码。

如果要使用扩展方法,请升级到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM