首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哇,什么TryParse

哇,什么TryParse
EN

Stack Overflow用户
提问于 2014-11-10 23:37:30
回答 3查看 949关注 0票数 4

我有一个会话,它包含特定的整数值,这些值都是用给定的控件索引的。通常情况下,以下内容可以很好地工作:

代码语言:javascript
复制
int value;
int.TryParse(Session["Key"].ToString(), out value);

但是,我确实需要说明null。其中,如果string失败,默认的out将返回一个null。但我注意到int.TryParse不适用于:

代码语言:javascript
复制
int? value = null;
int.TryParse(Session["Key"].ToString(), out value);

那么,如果失败,如何尝试该解析,从而导致null?

我发现这个question和命令:

当此方法返回时,如果转换成功,则包含与s中包含的数字等效的有符号整数值,如果转换失败,则为零。如果字符串参数为null或String.Empty,格式不正确,或表示小于Min值或大于最大值的数字,则转换失败。此参数未经初始化传递。

如果int.TryParse失败,则整数的值为零。在我的用法中,0可以是一个有效值。所以我需要null有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-10 23:42:19

当然;利用int.TryParse的返回值(如果转换成功与否返回):

代码语言:javascript
复制
int? retValue = null;
int parsedValue = 0;

if (int.TryParse(Session["Key"].ToString(), out parsedValue))
    retValue = parsedValue;
else
    retValue = null;

return retValue;

我承认有点冗长,但你可以把它包装成一个函数。

票数 9
EN

Stack Overflow用户

发布于 2014-11-10 23:42:44

代码语言:javascript
复制
int tmp;
int? value = int.TryParse(Session["Key"].ToString(), out tmp) ? (int?)tmp : null;
票数 6
EN

Stack Overflow用户

发布于 2014-11-10 23:45:18

问题是“空”这个词。它意味着什么?null可能意味着该值是不确定的,抛出了一个异常,简单地说该值为null,或者其他一些上下文意义。您的问题是一个完美的例子,因为您自己都在任意声明,在您看来,null意味着字符串的解析失败。

微软的TryParse范例很棒,但用途有限。考虑以下情况:

  • 字符串== "89“
  • 字符串==空
  • 字符串== "Hello“
  • 字符串== "“
  • 字符串== "2147483650“

然而,您唯一的选择是为输出分配一个整数或零,并返回true或false。

假设它起作用了,你打算怎么处理这些信息?像这样吗?

代码语言:javascript
复制
int? value = null;
if (int.TryParse(Session["Key"].ToString(), out value)) {
    if (value == null)
        // Handle "Appropriate" null
    else
        // Handle appropriate numeric value
}
else {
    // Note: value == null here, and TryParse failed
    // Handle null...
    // What if the reason it failed was because the number was too big?
    // What if the string was Empty and you wanted to do something special?
    // What if the string was actually junk?  Like "(423)322-9876" ?
    // Long-Story Short: You don't know what to do here without more info.
}

考虑一下这个NullableInt TryParse示例:

代码语言:javascript
复制
public bool TryParseNullableInt(string input, out int? output)
{
    int tempOutput;
    output = null;
    if (input == null) return true;
    if (input == string.Empty) return true; // Would you rather this be 0?

    if (!int.TryParse(input, out tempOutput))
        return false; // What if string was "2147483650"... or "Twenty Three"?
    output = tempOutput;

    return true;
}

一种解决方案是使用枚举TryParse而不是布尔TryParse:

代码语言:javascript
复制
public ParseStatus TryParseNullableInt(string input, out int? output)
{
    int tempInteger;
    output = null;
    if (input == null) return ParseStatus.Success;
    if (input == string.Empty) { output = 0; return ParseStatus.Derived; }

    if (!int.TryParse(input, out tempInteger)) {
        if (ParseWords(input, out tempInteger)) { // "Twenty Three" = 23
            output = tempInteger;
            return ParseStatus.Derived;
        }
        long tempLong;
        if (long.TryParse(input, out tempLong))
            return ParseStatus.OutOfRange;
        return ParseStatus.NotParsable;
    }
    output = tempInteger;

    return ParseStatus.Success;
}

另一个问题是out变量的存在。您的第三个选择是使用描述性单曲,如下所示:

代码语言:javascript
复制
public Maybe<int?> TryParseNullableInt(string input)
{
    if (input == null) return Maybe.Success(null);
    if (input == string.Empty) { return Maybe.Derived(0); }

    int tempInteger;
    if (!int.TryParse(input, out tempInteger)) {
        if (ParseWords(input, out tempInteger)) { // "Twenty Three" = 23
            return Maybe.Derived(tempInteger);
        }
        long tempLong;
        if (long.TryParse(input, out tempLong))
            return Maybe.OutOfRange();
        return Maybe.NotParsable();
    }

    return Maybe.Success(tempInteger);
}

您可以使用Monad作为单枚举值,或者类似这样:

代码语言:javascript
复制
Maybe<int?> result = TryParseNullableInt("Hello");
if (result.HasValue) {
    if (result.Status == ParseStatus.Success)
        // Do something you want...
    else if (result.Status == ParseStatus.Derived)
        // Do something else... more carefully maybe?
}
else if (result.Status == ParseStatus.OutOfRange)
    MessageUser("That number is too big or too small");
else if (result.Status == ParseStatus.NotParsable)
    // Do something

使用Monads,可能还有枚举TryParses,您现在可以从描述性返回中获得所需的所有信息,没有人需要猜测null可能意味着什么。

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

https://stackoverflow.com/questions/26855032

复制
相关文章

相似问题

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