Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';tc#是否允许多个返回值?_C# - Fatal编程技术网

为什么';tc#是否允许多个返回值?

为什么';tc#是否允许多个返回值?,c#,C#,我只是想知道…为什么C不允许多个返回值 目前,我们表达了通过返回一个类或使用out-返回多个值的意图,如下所示 static void Check(MyTask task ) { if (GoodReasonsNotTo(task)) { throw new ApplicationException("There are good reasons not to do this."); } } public static int UglyDo( MyTas

我只是想知道…为什么C不允许多个返回值

目前,我们表达了通过返回一个类或使用
out
-返回多个值的意图,如下所示

static void Check(MyTask task )
{
    if (GoodReasonsNotTo(task))
    {
        throw new ApplicationException("There are good reasons not to do this.");
    }
}

public static int UglyDo( MyTask task, out string response )
{
    Check(task);
    //...
    response = "Done";
    return 7;
}

static void Main(string[] args)
{
    var task = new MyTask("Add multiple return values");

    string response;
    var err = UglyDo(task, out reponse));
}
上述代码可以用不同的方式表示:

static void Check(MyTask task )
{
    if (GoodReasonsNotTo(task))
    {
        throw new ApplicationException("There are good reasons not to do this.");
    }
}

public static (int, string) PrettyDo(MyTask task)
{
    Check(task);
    //...
    return 7, "Done.";
}
static void Main(string[] args)
{
    var task = new MyTask("Add multiple return values");

    var (err, response) = PrettyDo(task); 
}
返回值与函数参数之间有什么特别之处吗?他们看起来一样,做的事情也一样。为什么他们不平等

此外,它能否支持未来的发展


顺便说一句,StackOverflow的语法highlighter处理得很好——这当然意味着这将是一件好事

你这么问真有趣。刚刚宣布我还是C#的新手,但是像这样的解决方法对你有帮助吗? 使用所需的参数创建一个新类,并创建一个返回该类的函数

public static testClass PrettyDo(MyTask task)
{
    Check(task);
    //...
    testClass answer = new testClass();

    answer.param1 = 7;
    answer.param2 = "Done.";

    return answer;
}

public class testClass
{
    public int param1 { get; set; }
    public string param2 { get; set; }
}

好问题。实际上,目前一些高级语言(如Go)以及至少一些汇编语言(如MIPS)都支持这一点,MIPS用于参数,两个用于返回值(但这至少是部分约定,而不是寄存器之间的实际物理差异)。在更一般的意义上,返回值没有什么特别的“特殊”

关于为什么C#还没有直接支持这一点,我在这里有点猜测,但C#仍然非常倾向于面向对象的开发。甚至像匿名函数这样的功能也是以面向对象的方式“在后台”实现的,因此我怀疑,如果它们将来真的会执行类似于多个返回值的操作,那么它本质上也是创建和返回对象的语法糖。所以,基本上,你现在显式地返回一个对象,也许将来它会隐式地返回一个

Edit:目前,我们最接近多个返回值的可能是元组,不幸的是,元组目前在C#中的语法非常不方便(在其他一些.NET语言中使用它们要方便得多,尤其是F#,我真的希望看到它变得更加突出,但我想这只是我的观点)。显然,他们正在考虑在C#的未来版本中改进这一点,这可能是我们在一段时间内所能得到的最接近的结果(我想这与我的怀疑是一致的,即他们在多个返回值方面所做的任何事情都只是一个对象的语法糖)。

使用:

公共静态元组PrettyDo(MyTask任务)
{
检查(任务);
//...
返回元组。创建(7,“完成”);
}
静态void Main(字符串[]参数)
{
var task=new MyTask(“添加多个返回值”);
var结果=PrettyDo(任务);
var err=result.Item1;
var响应=结果项2;
}

它不像某些高级语言那样支持解包,但它非常接近您的目标。

非常棒的链接,谢谢。允许返回元组并不是真正的交易。.Item1位很难看。@Tymski如果使用C#7,它充其量只是一个预览。请随时提交错误报告或参与github上的讨论:。像在其他语言中一样,解构(所以你不需要.Item1等)也包括在内。我不会说它是“刚刚”宣布的,它在C#7的计划中已经有几个月了。我想Go编程语言实际上有这个功能。可能是因为有其他方法可以实现同样的功能,例如使用一个包含2个成员或元组的小类。所有这些新的东西使得C语言更难阅读那些有C++背景的人。是的,不是。是的,因为我们一直都在做(返回类)。不,因为在简单的情况下,即使是一个简单的类也是一种过分的杀伤力(并且还考虑值与引用类型以及其他一些小但重要的事情)。我应该提到这一点,我的问题更多的是设计问题,而不是试图找到实现它的方法+1.)
public static Tuple<int, string> PrettyDo(MyTask task)
{
    Check(task);
    //...
    return Tuple.Create(7, "Done.");
}
static void Main(string[] args)
{
    var task = new MyTask("Add multiple return values");

    var result = PrettyDo(task); 
    var err = result.Item1;
    var response = result.Item2;
}