【问题标题】:TryParse create inline parameter?TryParse 创建内联参数?
【发布时间】:2014-12-31 10:46:11
【问题描述】:

在 C# 中有什么方法可以创建内联变量吗? 像这样的:

int x = int.TryParse("5", out new int intOutParameter) ? intOutParameter : 0;

你不觉得这比在外面创建一个变量然后再也不使用它更有用吗?

【问题讨论】:

  • 可以封装在私有方法调用中吗?

标签: c# .net type-conversion clr tryparse


【解决方案1】:

这种语法 - 称为 声明表达式 - 在 C# 的下一版本(第 6 版)的提议功能列表中。

你不是唯一一个认为它有用的人。例如制作完整的TryParse 调用表达式(不需要语句来声明变量)。

但是has been dropped 从正在进行的工作到 C#6。

我确定我不是唯一一个希望它在未来版本中回归的人。它作为声明包含在 C#7 中(不需要new) :

int x = int.TryParse("5", out int intOutParameter) ? intOutParameter : 0;

【讨论】:

  • 我明白为什么他们现在放弃了它 - 需要太多特殊情况或手动解析来支持它。
  • @MatthewWatson 更多的是看到 F# 的模式匹配并想要做一些更接近的事情,解决这个问题将(我希望)因此成为 C# 7 的一部分。
【解决方案2】:

基于 OP 请求:

private static bool IsIntValid(string str)
{
  int i = 0;
  return int.TryParse(str, out i);
}

虽然不是最聪明的方法,但我猜是最简单的方法:) 也可以将其包装在扩展方法中。

【讨论】:

    【解决方案3】:

    outparams 的内联声明 是 C# 中一项新的建议功能,可能有一天会成为标准功能,请参阅例如Probable C# 6.0 features illustrated,第 9 节。预期/建议的语法:

    int.TryParse("5", out int x); // this declares (and assigns) a new variable x
    

    编辑: 这个out 变量语法最终包含在 C# 7.0 (Visual Studio 2017) 中;你也可以使用out var x


    补充:人们想出了有趣的扩展方法。我试着做一个通用的:

    public delegate bool TryParser<TResult>(string s, out TResult result);
    
    public static class FunExtensions
    {
      public static T TryParse<T>(this string str, TryParser<T> tryParser)
      {
        T outResult;
        tryParser(str, out outResult);
        return outResult;
      }
    }
    

    可以这样使用:

      var x = "5".TryParse<int>(int.TryParse);
      var y = "01/01".TryParse<DateTime>(DateTime.TryParse);
      var z = "bad".TryParse<decimal>(decimal.TryParse);
    

    等等。我希望编译器能从用法中推断出T,这样就可以简单地说:

      var x = "5".TryParse(int.TryParse);  // won't compile
    

    但您似乎必须明确指定方法的类型参数。

    【讨论】:

      【解决方案4】:

      作为一种解决方法,您可以创建一个扩展:

      public static int TryParse(this string input, int defaultValue = default(int))
      { 
          int intOutParameter;
          bool parsable = int.TryParse(input, out intOutParameter);
          if (parsable)
              return intOutParameter;
          else
              return defaultValue;
      }
      

      那么你甚至不需要out-参数:

      int parsed = "5".TryParse(0);
      

      【讨论】:

      • 但是如果我想让它更通用怎么办?我的意思是Guid.TryParseTimeSpan.TryParse 等。我在答案中尝试了一个通用扩展。
      【解决方案5】:

      您还可以为所有方法使用临时存储。

      public static class Tmp<T>
      {
          [ThreadStatic]
          public static T Value;
      }
      

       

      int x = int.TryParse("5", out Tmp<int>.Value) ? Tmp<int>.Value : 0;
      

      【讨论】:

      • 很有趣,但是这样有效率吗?
      • 我不明白为什么这应该是低效的。没有对象被创建,只有一个泛型类型在使用后被构建。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 2014-06-15
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多