【问题标题】:C# discard with ref operatorC# 使用 ref 运算符丢弃
【发布时间】:2019-02-16 20:21:43
【问题描述】:

是否可以将 C# 7 丢弃运算符与 ref 运算符一起使用而不是 out。

例子:

int testInt;
if (!Int32.TryParse(AnyString, ref testInt)) {
   // do something
}

【问题讨论】:

  • 你应该在那里使用out,而不是ref。除此之外,你的问题对我来说没有任何意义。如果您需要更多帮助,请您改写一下吗?
  • 你为什么要这样做?
  • 为什么不简单地尝试一下呢?无论如何:TryParse 需要 out-参数,而不是 ref-参数。
  • @HimBromBeere OP 的意思是if (int.TryParse("1", out _))

标签: c# c#-7.2


【解决方案1】:

您编写的内容无法编译,因此我假设您将其用作示例。但是没有丢弃运算符不能与 ref 一起使用。我不知道你为什么甚至想要。如果您有一个想要丢弃输出的用例,只需使用 out 即可。

if (!Int32.TryParse(AnyString, out _)) {
   // do something
}

【讨论】:

    【解决方案2】:

    来自docs

    在 C# 7.0 中,在以下分配中支持丢弃 上下文:

    元组和对象解构。
    使用 isswitch 进行模式匹配。
    调用带有 out 参数的方法。
    当范围内没有 _ 时,独立的 _

    int.TryParse 显然需要一个out 参数。您提到的操作员不会改变这一点。

    除了这个ref 意味着该值已经被初始化为某个值以便在方法中使用它。因此,ref 在您需要提供的值并在之后更改它时使用,而out 根本不会对提供的值做任何事情,它只是返回它。这就是为什么您必须初始化由ref 传递的变量的原因,而对于out 参数,您不需要这样做。

    换句话说。当您有一个需要 ref-parameter 的方法时,您可以使用提供的值并在您的方法中使用它:

    void DoSomething(ref int i)
    {
        var a = i + 1;
        i = a;
    }
    

    这显然假设i 具有一个值集。

    另一方面,如果在方法中将值作为 out 传递,您将无法执行任何操作

    void DoSomething(out int i)
    {
        var a = i + 1;  // won´t compile because i has not been set
        i = a;
    }
    

    那么为什么你提到的运算符不适用于ref?这就是我上面所说的:使用ref 假定您在传递它之前初始化该值。但是您不能初始化丢弃的变量

    【讨论】:

      【解决方案3】:

      你不应该在这里使用 ref。相反,您应该使用 out 参数进行丢弃。示例代码如下:

      if(!int.tryParse(yourString, out string _)){//Do something}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-14
        • 1970-01-01
        相关资源
        最近更新 更多