我遇到了与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
正如您所看到的,ID
是null
但convert(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 ,因为此处ID
为null
且Convert.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
?
答案 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);
写真真实。
在您的示例中,您没有传递null
,而是将Nullable
的{{1}}传递给null
。
从您链接到的文档(我必须阅读两次):
value的字符串表示形式,如果value是a,则为String.Empty 值为null的对象。如果value为null,则该方法返回null。
注意:问题没有指定框架版本,所以我假设4.5。 显然行为从4.0变为4.5,所以问题的答案是:他们意识到这是一个坏主意并改变了它。