这个例子在C#中,但我希望能够轻松地应用于其他人。
我最近发现以下似乎工作正常:
int i = Int32.TryParse(SomeString, out i) ? i : -1;
从某种角度来看,似乎变量i
在技术上不应该在TryParse
中出现。或者我是否正确地假设int i
有效地声明了变量,即使声明还没有结束呢?
答案 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;
哪个非常好。