扩展方法 - IsNull和IsNotNull,使用的好坏?

时间:2009-09-29 21:39:10

标签: c# extension-methods

我喜欢可读性。

所以,几分钟前我想出了一个扩展方法,用于(x =!null)类型语法,称为IsNotNull。反过来,我还创建了一个IsNull扩展方法,因此

if(x == null) becomes if(x.IsNull())

if(x != null) becomes if(x.IsNotNull())

但是,我担心我可能会滥用扩展方法。您是否认为这是Extenion方法的不良用法?

9 个答案:

答案 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值。