c#空字符串-->;无效的

c#空字符串-->;无效的,c#,.net-4.0,C#,.net 4.0,我有很多次输入文本 如果它是空的(用户没有键入任何文本)-我想向DB查询发送“null” 而不是字符串。为空。(或“”) 所以我发现我自己经常这样做: var mySqlValue = string.IsNullOrEmpty( tbCustomerId.Text)?null:tbCustomerId.Text; 我觉得这很难看 .net为相反的场景提供了许多其他解决方案: string.IsNullOrEmpty string.IsNullOrWhiteSp

我有很多次输入文本

如果它是空的(用户没有键入任何文本)-我想向DB查询发送“null”

不是
字符串。为空。
(或“”)

所以我发现我自己经常这样做:

var mySqlValue =  string.IsNullOrEmpty( tbCustomerId.Text)?null:tbCustomerId.Text;
我觉得这很难看

.net为相反的场景提供了许多其他解决方案:

        string.IsNullOrEmpty
        string.IsNullOrWhiteSpace
        myProblemVal ?? myDefultVal
我知道这可以通过扩展方法来解决,我知道怎么做

但是还有更好的吗


如果为空->null

是否有智能代码?您可以使用扩展方法:

public static class Extensions {
    public static string NullIfWhiteSpace(this string value) {
        if (String.IsNullOrWhiteSpace(value)) { return null; }
        return value;
    }
}
你可以这样使用:

var mySqlValue = tbCustomerId.Text.NullIfWhiteSpace();

我真的不知道你能想象出什么比扩展方法更好。你如何定义“更好”?更短的使用特殊关键字?使用很少使用的操作符来显得聪明?这已经只是附加到您的值上的单个方法调用,它甚至可以处理空值,并且您需要的逻辑不能用比这更短的方式表达。另外,我不知道它有什么特殊的语法。

声明您自己的静态方法:

public static string NullIfEmpty(string value)
{
  return string.IsNullOrEmpty(value) ? null : value;
}

NullIfEmpty(value)并不比调用字符串类型的静态方法更难看。。。而且它似乎比每次编写“string.IsNullOrEmpty(tbCustomerId.Text)?null:tbCustomerId.Text”更简洁

但是还有更好的吗


不,尽管我认为你在问题中描述的(扩展方法)是绝对正确的。正如您在问题中所描述的,在另一个方向上,您有空合并。

从字符串开始

string myString = "";
编写一个将空白转换为null的方法

public static string NullIf(string value)
{
    if (String.IsNullOrWhiteSpace(value)) { return null; }
    return value;
}
然后封装该方法并使用与SQL中相同的语法调用它

NullIf(myString);

我明确地写了
我知道这可以通过扩展方法来解决-我知道怎么做..
-有什么更好的方法吗操作,没有看到那部分:)但我没有看到更优雅的方法。尽管他说他知道,这可能是最好的方法,而不是一大堆如果他,如果你把这个方法放在一个静态类中,然后使用
这个
关键字,您可以像使用扩展方法一样使用它;)-写起来要短得多你至少可以让它成为一个扩展方法,不是吗?当然你可以让它成为一个扩展方法,但我真的不喜欢它,尤其是在空引用上。个人选择。@Royi我指的是扩展方法方法-我已经澄清我写的
string.IsNullOrEmpty(tbCustomerId.Text)?null:tbCustomerId.Text很难看。。。不是扩展方法。(我很喜欢)-但我想看看是否有智能的解决方案。我一直在寻找的答案是“否”。-你给的。@Royi哦,当然,条件有点难看。。。但有趣的是;我想说的是,如果你用
来表示
null
,那么已经有一个问题了——也就是说,如果你的意思是
null
,你为什么要持有
?使用
null
表示
null
,使用
表示
,您试图解决的问题在未持有
”时停止存在-属性
tbCustomer。文本
。。。。。。(且不为null)还有以下问题:如果
.Text
是一个属性(即调用
get
访问器),第一次调用getter时,它可能会返回一个长字符串,比如
“John Doe”
。我们可以计算三元
?:
条件运算符的最后一个“分量”。但是这会再次调用
文本
getter,这次它可能返回
”。因此,在原则上,您必须获取
文本
的局部变量副本。当然,如果使用扩展方法,这是不必要的。如果使用扩展方法,可以在检查之前先
Trim()
字符串,这在单个表达式中很难做到。