【问题标题】:C# Parse value if not null如果不为空,则 C# 解析值
【发布时间】:2012-07-28 12:49:08
【问题描述】:

这不是一个真正的问题,如果这是一个愚蠢的问题,我深表歉意,但这只是我很好奇的事情。假设如果字符串不为空,我想将字符串参数解析为整数,否则将整数设置为 -1。有没有更好的方法来写这个语句:

int id = context.Request["Id"] == null ? -1 : int.Parse(context.Request["Id"]);

必须评估字符串以查看它是否为空,然后再次评估它以解析它,这似乎很麻烦。现在我想了想,这已经提出了对象并在它不为空时访问对象属性。所以像:

int id = person == null ? -1 : person.id;

这是公认的做法吗?

【问题讨论】:

    标签: c# parsing null


    【解决方案1】:

    您没有说明 int.Parse() 是否有可能因非空值而失败,但如果您不确定非空输入字符串是否始终是 int 值,您也可以使用TryParse()方法:

    int id;
    if (!int.TryParse(context.Request["Id"], out id)
        id = -1;
    

    如果context.Request["Id"] 为空,或者无法解析为int,则不会引发异常。

    【讨论】:

    • 这看起来完全像我的回答 :) 好像我们在同一时刻输入了相同的字符。
    • 无论如何都要为此 +1,因为最好为非数字输入做好准备而不是捕获异常。
    【解决方案2】:

    对于您的第一个示例,您可以使用null coalescing operator

    int id = int.Parse(context.Request["Id"] ?? "-1");
    

    如果存在null-safe dereferencing operator,则可以改进第二个示例,但由于它在 C# 中不存在,因此您的方法很好:

    int id = person == null ? -1 : person.Id;
    

    【讨论】:

    • 这确实会导致不必要的int.Parse("-1"),而不是直接将值设置为-1。
    • 我什至没有想到在将参数传递给 parse 方法时进行 null 检查,doh!现在看起来很简单。是的,空安全解除引用运算符正是我正在寻找的,很高兴知道它存在,只是不适用于 C#。谢谢!
    【解决方案3】:

    就我个人而言,我会做这两个陈述:

    string tmp = context.Request["Id"];
    int id = String.IsNullOrWhitespace(tmp) ? -1 : int.Parse(tmp);
    

    这无需任何额外的解析即可处理此问题。在一行中执行此操作将需要额外查找上下文(您试图避免这种情况)或额外的解析。

    【讨论】:

    • 是空还是空白?其他不是数字的东西怎么办? int.TryParse 对我来说似乎是一个更好的解决方案。
    • @WouterH 是的 - 这不处理非数字输入 - 但实际上更多的是尝试解决有关处理空值与 int 解析的具体问题。
    猜你喜欢
    • 2017-09-01
    • 2014-12-12
    • 2020-08-09
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 2020-08-17
    相关资源
    最近更新 更多