最近,我在asked a question上讨论了如何清理我认为丑陋的代码。一种建议是创建一个扩展方法,它将执行所需的函数并返回我想要的结果。我的第一个想法是“太棒了!扩展是多么酷啊……”但是经过更多的思考之后,我开始重新考虑使用扩展了……
我主要担心的是,扩展似乎是一条自定义的“捷径”,会让其他开发人员很难遵循。我知道使用扩展可以帮助代码语法更容易阅读,但是如何跟随幕后的声音呢?
以我之前的问题代码片段为例:
if (entry.Properties["something"].Value != null)
attribs.something = entry.Properties["something"].Value.ToString();现在将其替换为扩展名:
public static class ObjectExtensions
{
public static string NullSafeToString(this object obj)
{
return obj != null ? obj.ToString() : String.Empty;
}
}并使用以下语法调用:
attribs.something = entry.Properties["something"].Value.NullSafeToString();这绝对是一种便捷的方式,但它真的值得另一个类对象的开销吗?如果有人想重用我的代码片段,但又不理解扩展,该怎么办呢?我可以很容易地使用语法,得到相同的结果:
attribs.something = (entry.Properties["something"].Value ?? string.Empty).ToString()所以我做了一些挖掘,找到了几篇关于使用扩展的利弊的文章。对于那些有兴趣的人,可以看看下面的链接:
MSDN: Extension Methods
Extension Methods Best Practice
Extension Methods
我真的不能决定哪条路更好。是做我想做的自定义扩展,还是显示更多的代码来完成相同的任务?我真的很有兴趣了解“真正的”开发者对这个话题的看法……
发布于 2009-02-15 21:10:04
就我个人而言,我认为扩展方法可读性的“问题”被大大夸大了。如果你专注于让你的代码更容易读懂它在做什么,这在大多数情况下比它是如何做的更重要。如果开发人员想要跟踪并找出幕后实际发生的事情,他们总是可以单击到实现。
我对扩展方法的主要问题是它们的发现方法-即通过指定的命名空间而不是指定的类。但这是另一回事:)
我不是建议您随意添加扩展方法,但我会认真考虑您需要了解方法中的每个表达式是如何工作的频率,而不是浏览它以了解它在更广泛的术语中的作用。
编辑:您对术语的使用可能会稍微误导您。没有“扩展对象”这种东西--只有“扩展方法”,它们必须存在于静态类型中。所以你可能需要引入一个新的类型,但是你不会创建更多的对象。
发布于 2009-02-15 21:09:43
OP绝对是一种方便的方法,但它真的值得另一个类对象的开销吗?
在这种情况下不会创建额外的类对象。在幕后,扩展方法的调用与静态方法没有什么不同。对于扩展方法容器,有一个额外的元数据条目,但这是非常小的。
OP,如果有人想重用我的代码片段,但又不理解扩展对象,该怎么办呢?
那么这将是教育他们的好时机:)。是的,有这样的风险,一个新的开发人员可能不习惯开始使用扩展方法。但这并不是一个孤立的特征。在我在内部和网络上看到的所有代码示例中,它被越来越多地使用。这绝对是值得开发人员学习的东西。我不认为它属于“深奥的期望人们知道”的范畴。
发布于 2009-02-15 21:35:20
在扩展方法中唯一需要处理的问题是:
一起使用
中保留
中定义的imports.
https://stackoverflow.com/questions/551589
复制相似问题