首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当值为空时,为什么System.Convert(对象值)返回String.Empty不为空

当值为空时,为什么System.Convert(对象值)返回String.Empty不为空
EN

Stack Overflow用户
提问于 2015-03-26 01:15:41
回答 3查看 732关注 0票数 0

我有一个与System.Convert(Object value)方法有关的问题,我的研究导致了这个文档

我想知道the reasons在c#团队做出这个决定的背后是什么,因为这对我来说没有任何意义。

在我看来,返回“空”更好,请注意这个例子:

代码语言:javascript
复制
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

如你所见,IDnull,但convert(ID)不是null,对我来说听起来很奇怪!!

这是convert(object value)的源代码,我是从这个问题的回答中找到的。

代码语言:javascript
复制
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()根本没用。

例如, :

代码语言:javascript
复制
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在这里是nullConvert.Tostring(ID)的转储是System.Empty或"“。

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

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

发布于 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值的影响,而是返回到缺省值。这不是一个技术原因,而是为了使(某些方式的)编程变得更容易。

票数 2
EN

Stack Overflow用户

发布于 2015-03-26 02:15:36

代码语言:javascript
复制
return value == null? String.Empty: value.ToString();

在您的例子中,值==为null,因此结果将是string.Empty。方法ID.ToString()也是一样的。

代码语言:javascript
复制
public override string ToString()
{
  if (!this.HasValue)
    return ""; //return empty string when value is null
  else
    return this.value.ToString();
}

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

代码语言:javascript
复制
public static class Extension {
    public static string ToStringWithChecking(this int? param) {
        if (!param.HasValue) {
            return null;// or throw exception here
        }
        return param.ToString();
    }
}
票数 0
EN

Stack Overflow用户

发布于 2015-03-26 10:32:42

你问题中的陈述是不正确的。当值为Convert.ToString(object value)时,null确实返回null。这

代码语言:javascript
复制
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,所以问题的答案是:他们意识到这是个坏主意,并改变了它。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29269432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档