声明变量并使用TryParse在同一行初始化它的任何问题?

时间:2010-12-30 20:54:42

标签: c# initialization declaration

这个例子在C#中,但我希望能够轻松地应用于其他人。

我最近发现以下似乎工作正常:

int i = Int32.TryParse(SomeString, out i) ? i : -1;

从某种角度来看,似乎变量i在技术上不应该在TryParse中出现。或者我是否正确地假设int i有效地声明了变量,即使声明还没有结束呢?

3 个答案:

答案 0 :(得分:10)

int i声明变量,并在out参数中使用它来初始化它。由于必须在结果之前评估谓词,因此i在使用之前都被声明和初始化。 (out参数必须在返回之前分配,因此无论如何都必须初始化。)

那就是说,我的同事们会在风格上看到类似的东西。 : - )

编辑:在调查了这种情况后,我会提出一些可能的替代辅助方法。静态类的命名在此处充当辅助方法的意图文档。

internal static class TryConvert
{
    /// <summary>
    /// Returns the integer result of parsing a string, or null.
    /// </summary>
    internal static int? ToNullableInt32(string toParse)
    {
        int result;
        if (Int32.TryParse(toParse, out result)) return result;
        return null;
    }

    /// <summary>
    /// Returns the integer result of parsing a string,
    /// or the supplied failure value if the parse fails.
    /// </summary>
    internal static int ToInt32(string toParse, int toReturnOnFailure)
    {
        // The nullable-result method sets up for a coalesce operator.
        return ToNullableInt32(toParse) ?? toReturnOnFailure;
    }
}

internal static class CallingCode
{
    internal static void Example(string someString)
    {
        // Name your poison. :-)
        int i = TryConvert.ToInt32(someString, -1);
        int j = TryConvert.ToNullableInt32(someString) ?? -1;

        // This avoids the issue of a sentinel value.
        int? k = TryConvert.ToNullableInt32(someString);
        if (k.HasValue)
        {
            // do something
        }
    }
}

答案 1 :(得分:4)

  

我最近发现以下似乎工作得很好

 int i = Int32.TryParse(SomeString, out i) ? i : -1;

它有效,但不是很好。

  

声明变量并使用TryParse在同一行初始化它有什么问题吗?

是的,可读性。我认为这看起来很糟糕,它正在做双重工作。


您的部分问题是您希望-1作为默认设置。当转换失败时,Int32.TryParse明确定义0作为out值。

为了便于阅读,我仍然会在2行中将其分解。

int i;
if (! int.TryParse(SomeString, out i))  i = -1;

当你需要这么多的时候,写一个(静态但不是扩展名)辅助方法:

int i = Utils.ParseInt(SomeString, -1);

答案 2 :(得分:4)

请记住,CIL中没有三元运算符。

int i = Int32.TryParse(SomeString, out i) ? i : -1;

您的代码转换为CIL,代表以下C#代码:

int i;
if (Int32.TryParse(SomeString, out i))
  i = i;
else
  i = -1;

哪个非常好。