我喜欢可读性。
所以,几分钟前我想出了一个扩展方法,用于(x =!null)类型语法,称为IsNotNull。反过来,我还创建了一个IsNull扩展方法,因此
if(x == null) becomes if(x.IsNull())
和
if(x != null) becomes if(x.IsNotNull())
但是,我担心我可能会滥用扩展方法。您是否认为这是Extenion方法的不良用法?
答案 0 :(得分:13)
它似乎没有任何可读性,并且可能会让阅读代码的人感到困惑,想知道在这些方法中是否有任何他们不知道的逻辑。
我使用了一个PerformIfNotNull(Func方法)(以及一个执行操作的重载),我可以传递一个快速的lambda表达式来替换整个if块,但如果你没有做任何事情,除了检查似乎它没有提供任何有用的东西。
答案 1 :(得分:3)
完全有效,但我认为它不是非常有用。由于扩展方法只是简单的编译器技巧,我很难将它们称为“滥用”,因为无论如何它们只是起伏不定。我只是抱怨扩展方法会损害可读性。
答案 2 :(得分:3)
我觉得这不是很有用,但是这个:
someString.IsNullOrBlank() // Tests if it is empty after Trimming, too
someString.SafeTrim() // Avoiding Exception if someString is null
因为这些方法实际上可以让您不必进行多项检查。但是用方法调用替换单个支票对我来说似乎没用。
答案 3 :(得分:2)
有先例,在字符串类中有 IsNullOrEmpty
答案 4 :(得分:2)
我并不完全赞同这种推理说“它可能会混淆”。
在某种程度上,我可以看出是什么意思,没有理由在“共同理解”之外冒险 - 每个人都理解对象!= null。
但是在Visual Studio中,我们有很棒的工具,你可以简单地将鼠标悬停在方法上,以显示一些额外的信息。
如果我们说延伸方法注释了一个很好的解释,那么我觉得混乱的论点崩溃了。
方法.IsNotNull()和.IsNull()完全解释它们是什么。我觉得它们非常合理和实用。
老实说,这是“你喜欢什么”的问题。如果您认为这些方法会使您的项目更具可读性,那就去吧。如果你在你的项目中违反惯例,那么我会说相反。
我对这个问题有着同样的想法,并且在我的工作地点问了几个非常有经验的开发人员。并且他们都没有提出一个很好的理由(除了已经提到的关于 - 这里的混淆),这可以解释为什么你不应该这样做。
去吧: - )
答案 5 :(得分:1)
您还要为CLR内部操作引入方法调用开销。 JIT可能会将其内联,但它可能不会。可以肯定的是,这是一个微观的挑剔,但我同意它不是特别有用。当有显着的可读性改进时,我会做这样的事情,或者如果我想要一些其他的行为,例如“抛出一个ArgumentNullException并传递arg名称”,这是愚蠢的一遍又一遍内联。
答案 6 :(得分:1)
相反,我会选择以下内容:
static class Check {
public static T NotNull(T instance) {
... assert logic
return instance;
}
}
然后像这样使用它:
Check.NotNull(x).SomeMethod();
y = Check.NotNull(x);
就个人而言,事情要清楚得多,而不是聪明并允许以下内容:
if( ((Object)null).IsNull() ) ...
答案 7 :(得分:0)
例如,如果您假设您可能希望在x为null时抛出异常(仅在扩展方法中执行此操作),这是有意义的。但是,我在这种特殊情况下的个人偏好是明确检查(空对象应为null :-))。
答案 8 :(得分:0)
要遵循模式,它应该是属性而不是方法(但当然不适用于扩展)。
System.Data命名空间中的数据值具有IsNull属性,该属性确定该值是否包含DbNull值。
DataRow类有一个IsNull方法,但它不确定DataRow是否为null,它确定数据行中的一个字段是否包含DbNull值。