有没有一个内置的C#方法可以将空字符串转换为null值?

35

很多时候我会输入文本,如果它是空的(例如用户没有输入任何文本),我想将一个空值发送到DB查询。

不想发送String.Empty.(或者"")。

因此我经常这样做:

var mySqlValue =  string.IsNullOrEmpty( tbCustomerId.Text)?null:tbCustomerId.Text;

我觉得这看起来很丑陋。.NET有很多其他解决方案来处理相反的情况:

string.IsNullOrEmpty
string.IsNullOrWhiteSpace
myProblemVal ?? myDefultVal

在C#中是否有任何内置的方法可以让我以更短的方式实现相反的操作?

我知道可以通过编写自己的扩展方法来解决这个问题,我也知道如何做到;但这不是我感兴趣的解决方案。

我正在寻找类似于"如果为空,则null"这样的代码。


还有以下问题:如果.Text是一个属性(即调用get访问器),第一次调用getter时,它可能返回一个长字符串,比如“约翰道”。然后我们到了评估三元?:条件运算符的最后一个“组件”。但这将再次调用Text getter,这次它可能返回""。因此,原则上您必须获取Text的本地变量副本。当然,如果使用扩展方法,则不需要这样做。 - Jeppe Stig Nielsen
如果您使用扩展方法,可以在检查之前先对字符串进行Trim()操作,这在单个表达式中很难实现。 - toddmo
6个回答

35

你可以使用扩展方法:

public static class Extensions {
    public static string NullIfWhiteSpace(this string value) {
        if (String.IsNullOrWhiteSpace(value)) { return null; }
        return value;
    }
}

您可以像这样使用:

var mySqlValue = tbCustomerId.Text.NullIfWhiteSpace();

我不太清楚您所说的比扩展方法更好是指什么。您如何定义“更好”?更短?使用特殊关键字?使用很少使用的操作符看起来更聪明?实际上,这已经只是一个附加到您的值上的单个方法调用,甚至可以在空值上使用,并且您需要的逻辑无法以比这更短的方式表达。此外,我不知道是否有任何特殊的语法。


1
我明确地写道:“我知道这可以通过扩展方法来解决 - 而且我知道如何做到...” - 有更好的方法吗? - Royi Namir
抱歉,我没有看到那部分 :) 但我没有看到更优雅的方法。 - Botz3000
7
虽然他说他知道,但这可能是最好的方式,而不是一堆“如果”的情况。 - Matthew

10

是否有任何内置于C#中的方法可以让我以更短的方式实现这个目标?

没有,尽管我认为你在问题中描述的方法(扩展方法)是完全可以的。就像你在问题中所描述的,在另一个方向上,你可以使用null合并运算符。


@Royi 噢,没问题,那个条件语句有点丑... 有意思的是,如果你用""来表示null,那么就已经有一个问题了 - 也就是说,如果你的意思是null,为什么要用一个""来保存呢?使用null来表示null,使用""来表示"",这样你想解决的问题就不存在了。 - Marc Gravell
我没有持有 "" - 属性 tbCustomer.Text"" ......(而不是 null) - Royi Namir
@Royi,为什么你的与数据库相关的代码似乎知道一个 UI 控件(tbCustomer)?无论如何,另一种更清晰的方法是在对象上拥有一个属性:public bool HasWhatever { get { return !string.IsNullOrEmpty(Whatever);} } 然后你可以在其上使用条件语句,例如 object val = obj.HasWhatever ? obj.Whatever : DBNull.Value; - 只是一个想法。 - Marc Gravell

10

声明自己的静态方法:

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

正在进行中

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


4
嘿嘿,如果你将这个方法放在一个静态类中,并使用 this 关键字,你就可以像使用扩展方法一样使用它 ;) - 写起来更简洁。 - Matthew
7
你至少可以把它变成一个扩展方法,不是吗? - Marc Gravell
1
当然你可以创建一个扩展方法,但我并不是很喜欢它,特别是在空引用的情况下。这只是个人选择。 - Guillaume

0

这也许不是你直接问的问题,但是实现你想要做的事情(如果字符串的值为空,则将空值传递给 SQL)的一种方法是使用 if 语句来检查在 SQL 查询参数赋值期间传递的字符串值的长度(例如:Parameters.AddWithValue("@parameter", mySqlValue)):

if (mySqlValue.Length > 0) {
    SqlCommand.Parameters.AddWithValue("@mySqlValue", mySqlValue);
}
else {
    SqlCommand.Parameters.AddWithValue("@mySqlValue", DBNull.Value);
}

SqlCommand 是一个变量,在 using 语句中使用参数化 SQL 查询和预先建立的 SQL 连接/连接字符串。

这不是一种优雅的解决方案,但它可以工作(而且不需要编写扩展方法)。


0
如果您想在反序列化JSON时自动将空字符串返回为null:
public partial class MyClass
{
    string sample;
    [JsonProperty("myProperty")]
    public string MyProperty
    {
        get { return sample; }
        set { sample = string.IsNullOrEmpty(value) ? null : value; }
    }
}

-1

从你的字符串开始

string myString = "";

编写一个方法,将空格转换为null。
public static string NullIf(string value)
{
    if (String.IsNullOrWhiteSpace(value)) { return null; }
    return value;
}

然后将其包装在方法中,并使用与SQL中相同的语法进行调用

NullIf(myString);

1
OP说他们不想要扩展方法,而且已经有多个答案提供了扩展方法。 - TylerH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接