C#使用ref运算符舍弃

时间:2018-09-12 08:42:49

标签: c# c#-7.2

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

示例:

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

3 个答案:

答案 0 :(得分:2)

您编写的内容无法编译,因此我假设您以它为例。但是没有抛弃运算符不能与ref一起使用。我不确定你为什么还要。如果您有一个要丢弃输出的用例,只需使用out即可。

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

答案 1 :(得分:1)

来自docs

  

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

     

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

int.TryParse显然期望一个out参数。您所指的运算符不会改变它。

除此ref以外,还意味着该值已被初始化为某个值,以便在方法中使用它。因此,当您需要提供的值并随后对其进行更改时,有效地使用ref,而out只是对提供的值不执行任何操作,它只是返回。这就是为什么您必须初始化由ref传递的变量,而对于out参数则不需要初始化的原因。

换句话说。如果您的方法需要一个ref参数,则可以使用提供的值并在您的方法中使用它:

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假设您在传递值之前先初始化该值。但是您无法初始化丢弃的变量

答案 2 :(得分:0)

您不应在此处使用ref。相反,您可以使用out参数进行丢弃。示例代码如下:

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