我有一个与System.Convert(Object value)方法有关的问题,我的研究导致了这个文档。
我想知道the reasons在c#团队做出这个决定的背后是什么,因为这对我来说没有任何意义。
在我看来,返回“空”更好,请注意这个例子:
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)的源代码,我是从这个问题的回答中找到的。
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或"“。
我的意思是,在这种情况下,没有办法使用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
发布于 2015-03-26 10:22:45
所有的Convert方法都是这样工作的。这是你一开始就会使用它们的唯一原因。
例如,以Convert.ToInt32为例。如果您通过null,您将得到0。如果您不想这样做,您可以使用int.Parse -这将抛出null值。
同样,Convert.ToString是从任何值(包括null )中提取字符串的安全方法。如果希望null抛出,可以使用object.ToString()。您可能会认为default(string)是null,而不是string.Empty,但从这个意义上说,null并不是一个安全的值--除了显式地检查null之外,您不能进一步使用null。另一方面,string.Empty仍然允许您连接,或要求长度,或IndexOf,或.
问题的关键是,Convert类不受null值的影响,而是返回到缺省值。这不是一个技术原因,而是为了使(某些方式的)编程变得更容易。
发布于 2015-03-26 02:15:36
return value == null? String.Empty: value.ToString();在您的例子中,值==为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();
}
}发布于 2015-03-26 10:32:42
你问题中的陈述是不正确的。当值为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 (即null )的引用。
从您链接到的文档中(我不得不读两遍):
值的字符串表示,如果值是值为null的对象,则为String.Empty。如果值为null,则该方法返回null。
注意:这个问题没有指定Framework版本,所以我假设为4.5。很明显,他们的行为从4.0变到4.5,所以问题的答案是:他们意识到这是个坏主意,并改变了它。
https://stackoverflow.com/questions/29269432
复制相似问题