C# 用C语言控制字符串是否为空的快速而优雅的方法#

C# 用C语言控制字符串是否为空的快速而优雅的方法#,c#,C#,我正在尝试控制多个字符串变量是否为空: 我的第一种方法非常简单: if(string.isNullOrEmpty(val1) && string.isNullOrEmpty(val2) && string.isNullOrEmpty(val3)) 我的第二条路是这样的 if(string.isNullOrEmpty(val1 + val2 + val3)) 哪一个最快最优雅? 是否有任何选项可以执行此操作?如果(string.isNullOrEmpty(val

我正在尝试控制多个字符串变量是否为空:

我的第一种方法非常简单:

if(string.isNullOrEmpty(val1) && string.isNullOrEmpty(val2) && string.isNullOrEmpty(val3))
我的第二条路是这样的

if(string.isNullOrEmpty(val1 + val2 + val3))
哪一个最快最优雅? 是否有任何选项可以执行此操作?

如果(string.isNullOrEmpty(val1+val2+val3))
在我看来是最快的

我建议您也使用
concat

但在幕后,它使用
“+”
操作符

我想这是最快的

如果它不可为空,我建议将它们的长度相加并检查
==0

这个怎么样

new string[] {val1, val2, val2}.All(s => string.IsNullOrEmpty(s))

或者类似的东西。

它们不是等价物。第一个检查它们中是否有null。第二个检查它们是否都为null。下定决心。

我认为“最快”取决于一个或多个字符串实际为null或空的频率

例如,如果val1通常为null或空,那么第一个选项可能是最好的;如果它们很少都是空的或空的,那么我不确定答案,但为您的特定期望拼凑一些基准不会超过五分钟


(另外,请注意,这两个选项的作用不同,如果其中任何一个为null或为空,则第一个选项为真,第二个选项则不为空)

在我的测试中,第一个选项的速度更快(只是必须):6ms vs.70ms,每个迭代次数为10000000次(因此,速度差异可能并不重要,除非你是在大规模进行这项工作)。
无论如何,我发现第一个更清楚

另外,它也不依赖于不明显的
IsNullOrEmpty
行为(如果您不太清楚的话,您可能会认为传递
null
参数会导致
ArgumentNullException
),这一点很重要

注意:测试中所有变量都设置为null,但将它们设置为其他值可以确认这一点,字符串越长,选项2所用的时间就越长,而选项1的最大值大约为30ms

此外,如果任何字符串为null或空,则第一个返回true,而第二个仅当所有字符串均为null或空时才返回true。因此,这不是相同的检查。

第二个:

if(string.isNullOrEmpty(val1 + val2 + val3))
相等于

if(string.isNullOrEmpty(val1) && string.isNullOrEmpty(val2) && string.isNullOrEmpty(val3))
(注意
&
而不是
|

但是会创建一个中间字符串,而我的第二个版本不会创建额外的字符串,并在一个字符串不为空时停止检查。

如果您有许多字符串变量,那么我认为使用第一个结构更具可读性:

if(string.isNullOrEmpty(val1) &&
   string.isNullOrEmpty(val2) &&
   string.isNullOrEmpty(val3))
{
}
通过这种方式,似乎每个变量都是单独处理的,如果需要以另一种方式处理其中一个变量,则此代码更容易更改

但是,如果所有字符串变量都以相同的方式处理,它们很可能表示为数组或另一种枚举。那么使用John M Gant的建议显然更好:

if(myStrings.All(s => string.IsNullOrEmpty(s)))
{
}

第一个肯定更具可读性。关于最快:试试!关于优雅:这很主观,取决于您是否更喜欢短代码而不是逻辑代码。第一个例子是逻辑代码。第一个是最安全的。如果您遇到空字符串导致某个val变量未初始化的情况,则使用第二个然后,我怀疑您将得到一个object not set(对象未设置)或null value(空值)错误。在没有混淆问题的意思的情况下,必须指出这两个代码段并不等效。这两条指令有不同的含义:如果其中一个字符串为null或空,则第一条指令将返回true;如果所有字符串均为n,则第二条指令将返回trueull或empty…所以这与性能或优雅无关,而是与正确性有关;)这肯定比其他方法慢。
wstrcpy()
确实将托管指针(准确地说,不是引用)作为其参数。但是它仍然通过复制内存区域来完成它的工作,因此字符串越长,执行的时间就越长。仅供参考,如果字符串中有1000个字符,那么Concat方法的速度要慢180倍。我知道。建议在下文4中使用concat。在StringBuilder之后,您是否可以更新性能测试数据,将| |更改为&,如编辑的问题中所示?ThxOn average它没有区别,&&和| | |基本上都是单指令。虽然原子and和OR占用相同的时间,但有区别是因为OR链
(a | | b | | | c | | | | | | | | | | | | | |…)
会在第一个真时停止,而and链会在第一个假。假设真与假分布均匀。当然,如果在开始时放置最有可能阻止以下检查的变量,则可以加快速度。这将为每10000000次迭代节省几毫秒。