在参数列表

时间:2018-02-02 11:45:04

标签: c# declare

在c#7中可以为参数列表中的out变量声明变量:

if (int.TryParse(input, out int result))
    WriteLine(result);

是否可以在参数列表中声明("非out")变量?像这样:

if (!string.IsNullOrEmpty(string result=FuncGetStr()))
        WriteLine(result);

2 个答案:

答案 0 :(得分:3)

你不能在参数列表中这样做,没有。

可以使用模式匹配,但我不建议:

if (FuncGetStr() is string result && !string.IsNullOrEmpty(result))

这使声明保持在if的源代码中,但result的范围仍然是封闭的块,所以我认为分离出来会简单得多:

// Mostly equivalent, and easier to read
string result = FuncGetStr();
if (!string.IsNullOrEmpty(result))
{
    ...
}

我能想到两个不同之处:

  • result未在第一个版本中的if语句后明确分配
  • 如果string.IsNullOrEmpty返回null,则
  • FuncGetStr()甚至不会在第一个版本中调用,因为is模式不匹配。您可以因此将其写为:

    if (FuncGetStr() is string result && result != "")
    

完全可怕,你可以这样做,使用帮助方法让你使用out参数。这是一个完整的例子。请注意,我建议这样做。

// EVIL CODE: DO NOT USE
using System;

public class Test
{
    static void Main(string[] args)
    {
        if (!string.IsNullOrEmpty(Call(FuncGetStr, out string result)))
        {
            Console.WriteLine(result);
        }
    }

    static string FuncGetStr() => "foo";

    static T Call<T>(Func<T> func, out T x) => x = func();
}

答案 1 :(得分:0)

您可以在语句中分配变量,但变量的声明应该在它们之外完成。您无法将它们组合在一起(在out之外和模式匹配,正如您在问题中已经指出的那样)。

bool b;
string a;

if (b = string.IsNullOrEmpty(a = "a")){ }

为什么这种行为与out等不同的情况下,Damien_The_Unbeliever的评论可能很有趣:

  

内联声明out变量的能力来自于a)必须是变量而不是价值的尴尬b)如果你经常没有什么对这个值有用的话在调用函数之前声明它。我没有看到其他此类用途的相同动机。