当值为NULL时,为什么System.Convert(对象值)返回String.Empty而不是NULL

时间:2015-03-26 01:15:42

标签: c# .net oop

我遇到了与System.Convert(Object value)方法相关的问题,我的研究让我想到了documentation
我想知道c#团队做出这个决定背后的the reasons是什么,因为这对我没有任何意义。
从我的观点来看,它更好地返回" Null",请注意这个例子:

static void Main(string[] args)
    {
        int? ID = null; 
        string result = Convert.ToString(ID);
        Console.WriteLine("{0} ,{1}",result ,result.Length);
        Console.ReadKey();
    }
//result would be "" and the result.Length=0

正如您所看到的,IDnullconvert(ID)不是null,这对我来说听起来很奇怪!!
这是convert(object value)的源代码,我从问题answer中选择了它。

public static string ToString(Object value) {return ToString(value,null);}

public static string ToString(Object value, IFormatProvider provider) { 
    IConvertible ic = value as IConvertible; 
    if (ic != null)
        return ic.ToString(provider); 
    IFormattable formattable = value as IFormattable;
    if (formattable != null)
        return formattable.ToString(null, provider);
    return value == null? String.Empty: value.ToString();

请注意last line。我只是想知道背后的rational是什么。
提前谢谢你。

修改

有很多情况ID.Tostring()根本没用 例如:

public System.Web.Mvc.ActionResult MyAction(int? Id)
{
//This line of code dosent show "Id has no value" at all 
MyContetnt = (System.Convert.ToString(Id) ?? "Id has no value");

return Content(MyContetnt);
}

在此代码示例中,如果您通过此路径运行此Mvc示例:
http://localhost: portnumber/ControllerName/MyAction
我的意思是without using ID in the path您在屏幕上看到 Nothing ,因为此处IDnullConvert.Tostring(ID)的隐藏为System.Empty或& #34;"

我的意思是在这种情况下,无法使用null-coalescing-operator重构此代码,使用ID.tostring()会引发nullrefrenceException,这没有用,也不是我的意图。我知道这很容易说:

MyContent = Id.HasValue ? Id.Value.ToString() : "Id has no value" 
// this line works fine;

但是假设convert.ToString(Null)的结果是Null那么第一个以null-coalescing-operator为特色的代码就能完美运作。

所以我很好奇这个想法的原因是什么,Convert.tostring (object null)的结果是string.empty而不是null

3 个答案:

答案 0 :(得分:2)

所有Convert方法都以这种方式工作。这是你首先使用它们的唯一原因。

例如,考虑Convert.ToInt32。如果您通过null,则会获得0。如果您不希望这样,则可以使用int.Parse代替 - 这会使null值。

同样,Convert.ToString是从任何值中获取字符串的安全方式,包括null。如果您想要null投掷,可以使用object.ToString()。您可能会认为default(string)null而不是string.Empty,但null在这个意义上并不是一个安全的价值 - 您无法继续使用{{1}除了通过显式检查null之外。另一方面,null仍允许您连接或询问长度,或string.Empty,或...

重点是IndexOf类防范Convert值,而是返回默认值。这不是技术上的原因,它可以使编程(某些方式)变得更容易。

答案 1 :(得分:0)

return value == null? String.Empty: value.ToString();

在你的情况下,value == null所以结果将是string.Empty。方法ID.ToString()

也是如此
public override string ToString()
{
  if (!this.HasValue)
    return ""; //return empty string when value is null
  else
    return this.value.ToString();
}

但是如果你想在id为null时返回null,请为此写一个扩展名。

public static class Extension {
    public static string ToStringWithChecking(this int? param) {
        if (!param.HasValue) {
            return null;// or throw exception here
        }
        return param.ToString();
    }
}

答案 2 :(得分:-1)

您提问中的陈述不正确。 当值为Convert.ToString(object value)时,null 返回null。这个

int? ID = null;
Console.WriteLine(Convert.ToString(ID) == string.Empty);
Console.WriteLine(Convert.ToString(null) == null);
object box = ID;
Console.WriteLine(Convert.ToString(box) == string.Empty);

写真真实。

http://ideone.com/jRsefy

在您的示例中,您没有传递null,而是将Nullable的{​​{1}}传递给null

从您链接到的文档(我必须阅读两次):

  

value的字符串表示形式,如果value是a,则为String.Empty   值为null的对象。如果value为null,则该方法返回null。

注意:问题没有指定框架版本,所以我假设4.5。 显然行为从4.0变为4.5,所以问题的答案是:他们意识到这是一个坏主意并改变了它。