1

这是我经常遇到的一个案例,我想知道是否有人有更好更简洁的方法来做到这一点。

假设我有一个可以为空的类型的变量“x”。例如:字符串、int? 或 DateTime?

我想对 x 做一些事情,我需要将 x 格式化为字符串,但我不能在 x 上调用 .ToString() 或其他方法,因为 x 可能为空。

是的,我可以做类似的事情

if(x == null)
{
 Console.WriteLine("empty");
}
else
{
 Console.WriteLine(x.ToString("G"));
}

或者

Console.WriteLine("{0}", x == null? "empty" : x.ToString("G"));

但我正在寻找更短的东西。也许什么都不存在,但我想我会问并开始对话。

我对此感兴趣的一个原因是因为我经常有大量变量,我将数据从一个类移动到另一个类或类似的东西,我需要应用一些格式。

因此,除了 x 之外,我还有 a、b、c、... z 并且我必须检查每个是否为 null 并对每个应用格式,它们是各种类型的并且需要不同的格式。更短更容易复制和粘贴的东西,只需对每一行进行最小的更改就可以了。

那么有没有人为此使用任何聪明的技巧?

我也考虑过??运营商,但我似乎找不到任何好的方法来应用它。乍一看,它似乎是专为这种情况而设计的,但实际上并没有任何帮助。

只要您不需要应用任何格式,它就真的有用。

4

4 回答 4

2

编写包装方法

    public static string MyToString(MyType? x, string emptyString, string format)
    {
        if (x == null)
        {
            return emptyString;
        }
        else
        {
            return ((MyType)x).ToString(format);
        }
    }
于 2013-05-14T21:33:33.520 回答
2

通用助手:

public static class NullableHelper
{
    public static string ToString<T>(this T? x, string format) where T: struct 
    {
        return x.HasValue ? string.Format(format, x.Value) : null;
    }
}

用法:

int? i = 1;
i.ToString("{0:000}");
于 2013-05-14T21:42:27.617 回答
1

对于可为空的类型,您可以尝试:

int? i;
i= null;

i.HasValue ? i.ToString() : "empty"
于 2013-05-14T21:39:46.230 回答
1
public static void Main(string[] args)
{
    int? a = null;
    string b = "my string";
    object c = null;
    // prints empty 
    Console.WriteLine(a.MyToString());
    // prints my string
    Console.WriteLine(b.MyToString());
    // prints empty
    Console.WriteLine(c.MyToString());
    // prints variable a doesn't have a value either
    Console.WriteLine(c.MyToString(callback: () => !a.HasValue ? "variable a doesn't have a value either" : DecoratorExtensions.MY_DEFAULT));
}

public static class DecoratorExtensions
{
    public const string MY_DEFAULT = "empty";

    public static string MyToString<T>(this T obj, string myDefault = MY_DEFAULT, Func<string> callback = null) where T : class
    {
        if (obj != null) return obj.ToString();
        return callback != null ? callback() : myDefault;
    }

    public static string MyToString<T>(this T? nullable, string myDefault = MY_DEFAULT, Func<string> callback = null) where T : struct
    {
        if (nullable.HasValue) return nullable.Value.ToString();
        return callback != null ? callback() : myDefault;
    }
}
于 2013-05-14T21:47:21.247 回答