2009-12-12 56 views
4

我在看一段代码我在C#中写道:的毗连字符串中IsNullOrEmpty参数

if(string.IsNullOrEmpty(param1) && string.IsNullOrEmpty(param2) && string.IsNullOrEmpty(param3)) 
{ 
     // do stuff 
} 

,并决定将使其更具可读性/简洁

if(string.IsNullOrEmpty(param1+param2+param3)) 
{ 
     // do stuff 
} 

但是看着它,我可以没有帮助,只是畏缩。你对此有何看法?你有没有做过这样的事情,你是否在适用的时候使用它。

注意:此行之前的代码将通过添加特定项来操作集合,具体取决于param(param1,param2,param3)是否为空。这个if语句是为了验证/错误处理。

回答

5

我个人比较喜欢前者。对我来说,意图更明确 - 检查所有参数是否为空/空。

第二个也隐藏了它处理空值的事实。空字符串是奇数。例如,上面的杰森威廉姆斯并没有实际上确实工作。

+0

中的第一个示例一样,我也惊讶连接空字符串引用没有抛出。 – 2009-12-12 07:37:18

+0

+1(我认为这是一个词) - 第二个示例 – 2009-12-12 07:48:17

+0

+1中的代码不易理解,用于正确验证。在第二个例子中,即使**一些**(不是全部)字符串为空或空白,验证也会通过。这会改变行为。主要目的是验证,正如Buddie明确写到的那样。因此后面的例子引入了一个错误。 – 2009-12-12 08:08:23

0

原始代码尽管时间更长,但其意图更清晰,并且可能具有类似的性能。我会放弃它。

1

如果你能得到一个集合中的PARAMS(这如果是功能,您可以用params关键字),那么这可能会奏效:

if (myParams.Any(IsNullOrTrimEmpty) 
    { 
     // do stuff 
    } 

的例子使用this string extensionmyParamsstring[]

+2

你可以只对myParams.Any(String.IsNullOrEmpty) – ICR 2009-12-12 07:32:21

+0

@ICR:你能详细解释一下吗? – 2009-12-12 07:35:33

+0

@ ICR-我认为他的意思是p.IsNullOrTrimEmpty()来自该扩展方法,而不是.Any() – Omar 2009-12-12 07:37:46

2

这是行不通的。如果任何字符串为空,您将得到一个空解除引用异常。你需要在使用它们之前检查它们。

此外,这是非常低效的。您将所有字符串连接成一个新字符串,然后测试它是否为非空。这会导致一个或多个内存分配,并且可能会复制大量数据,只会立即丢弃并稍后收集垃圾。

更好的方法是编写一个方法,它接受可变参数或字符串列表,并在循环中使用IsNullOrEmpty逐个检查它们。这将会更加高效,安全,但仍然可以在您的if语句中实现整齐代码的预期结果。

+4

连接空字符串不会导致NullReferenceException。只有取消引用它们。 – 2009-12-12 07:31:09

+2

同意迈克尔。是的,这将是低效的 - 但它不会抛出。 – 2009-12-12 07:32:05

+1

我很高兴回答 - 当我学到新的东西时,我喜欢它:-)现在有什么机会可以停止低估我?这仍然是低效的。 – 2009-12-12 07:36:31

4

也许把它写这样的事情,这是一个比较可读:

bool paramsAreInvalid = 
    string.IsNullOrEmpty(param1) 
    && string.IsNullOrEmpty(param2) 
    && string.IsNullOrEmpty(param3); 

if (paramsAreInvalid) 
{ 
     // do stuff 
} 
3

这是一件小事,但我认为在提高可读性原始结果的一个简单的重新格式化,使代码的意图大约为清澈如可以是:

if (string.IsNullOrEmpty(param1) && 
    string.IsNullOrEmpty(param2) && 
    string.IsNullOrEmpty(param3)) 
{ 
     // do stuff 
} 

考虑此组类似的例子:

if (c == 's' || c == 'o' || c == 'm' || c == 'e' || c == 't' || c == 'h' || c == 'i' || c == 'n' || c == 'g') { 
    // ... 
} 

if (c == 's' || 
    c == 'o' || 
    c == 'm' || 
    c == 'e' || 
    c == 't' || 
    c == 'h' || 
    c == 'i' || 
    c == 'n' || 
    c == 'g') { 
    // ... 
}