首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用扩展:权衡利弊

使用扩展:权衡利弊
EN

Stack Overflow用户
提问于 2009-02-15 21:06:18
回答 5查看 2.9K关注 0票数 4

最近,我在asked a question上讨论了如何清理我认为丑陋的代码。一种建议是创建一个扩展方法,它将执行所需的函数并返回我想要的结果。我的第一个想法是“太棒了!扩展是多么酷啊……”但是经过更多的思考之后,我开始重新考虑使用扩展了……

我主要担心的是,扩展似乎是一条自定义的“捷径”,会让其他开发人员很难遵循。我知道使用扩展可以帮助代码语法更容易阅读,但是如何跟随幕后的声音呢?

以我之前的问题代码片段为例:

代码语言:javascript
复制
if (entry.Properties["something"].Value != null)
  attribs.something = entry.Properties["something"].Value.ToString();

现在将其替换为扩展名:

代码语言:javascript
复制
public static class ObjectExtensions
{
    public static string NullSafeToString(this object obj)
    {
        return obj != null ? obj.ToString() : String.Empty;
    }
}

并使用以下语法调用:

代码语言:javascript
复制
attribs.something = entry.Properties["something"].Value.NullSafeToString();

这绝对是一种便捷的方式,但它真的值得另一个类对象的开销吗?如果有人想重用我的代码片段,但又不理解扩展,该怎么办呢?我可以很容易地使用语法,得到相同的结果:

代码语言:javascript
复制
attribs.something = (entry.Properties["something"].Value ?? string.Empty).ToString()

所以我做了一些挖掘,找到了几篇关于使用扩展的利弊的文章。对于那些有兴趣的人,可以看看下面的链接:

MSDN: Extension Methods

Extension Methods Best Practice

Extension Methods

我真的不能决定哪条路更好。是做我想做的自定义扩展,还是显示更多的代码来完成相同的任务?我真的很有兴趣了解“真正的”开发者对这个话题的看法……

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-02-15 21:10:04

就我个人而言,我认为扩展方法可读性的“问题”被大大夸大了。如果你专注于让你的代码更容易读懂它在做什么,这在大多数情况下比它是如何做的更重要。如果开发人员想要跟踪并找出幕后实际发生的事情,他们总是可以单击到实现。

我对扩展方法的主要问题是它们的发现方法-即通过指定的命名空间而不是指定的类。但这是另一回事:)

我不是建议您随意添加扩展方法,但我会认真考虑您需要了解方法中的每个表达式是如何工作的频率,而不是浏览它以了解它在更广泛的术语中的作用。

编辑:您对术语的使用可能会稍微误导您。没有“扩展对象”这种东西--只有“扩展方法”,它们必须存在于静态类型中。所以你可能需要引入一个新的类型,但是你不会创建更多的对象。

票数 20
EN

Stack Overflow用户

发布于 2009-02-15 21:09:43

OP绝对是一种方便的方法,但它真的值得另一个类对象的开销吗?

在这种情况下不会创建额外的类对象。在幕后,扩展方法的调用与静态方法没有什么不同。对于扩展方法容器,有一个额外的元数据条目,但这是非常小的。

OP,如果有人想重用我的代码片段,但又不理解扩展对象,该怎么办呢?

那么这将是教育他们的好时机:)。是的,有这样的风险,一个新的开发人员可能不习惯开始使用扩展方法。但这并不是一个孤立的特征。在我在内部和网络上看到的所有代码示例中,它被越来越多地使用。这绝对是值得开发人员学习的东西。我不认为它属于“深奥的期望人们知道”的范畴。

票数 6
EN

Stack Overflow用户

发布于 2009-02-15 21:35:20

在扩展方法中唯一需要处理的问题是:

  1. 如果左边(看起来你在调用方法的对象)是空的,它们就不必引起空引用异常。
    • 有时可能很有用,但与预期相反,因此应该与extreme caution.

一起使用

  1. 它们不能通过它们所应用的类/接口上的反射来访问。
    • 通常不是问题,但值得在mind.

中保留

  1. 名称与其他扩展方法的冲突涉及一个冗长的解析规则序列
    • 如果您关心该序列是首选的:在当前命名空间中定义的数据类型内定义的
      1. 扩展方法,或其任何一个父类,如果子命名空间的优先级高于在任何类型导入中定义的父namespaces.
      2. Extension方法,则在任何命名空间中定义的当前file.
      3. Extension方法中导入在任何项目级类型中定义的当前file.
      4. Extension方法中导入在任何项目级命名空间imports.

中定义的imports.

  • Extension方法

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/551589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档