Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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
为什么";“出去”;参数作为语言构造存在于C#中? 问题:_C#_Out - Fatal编程技术网

为什么";“出去”;参数作为语言构造存在于C#中? 问题:

为什么";“出去”;参数作为语言构造存在于C#中? 问题:,c#,out,C#,Out,为什么“out”参数作为一种语言结构存在于C#中 关于这个问题的详细说明 它为什么首先存在?难道没有更好的语言特性可以获得与“out”参数相同的效果吗 使值类型的行为类似于引用类型不是很奇怪吗 难道没有更好的方法从一个方法返回多个值吗 这是一个历史事件吗?也就是说,在C的第一个版本中,没有办法实现使用out参数可以实现的功能,但是现在有了更新的功能,并且只是为了向后兼容而保留在语言中 我没问的是什么 我不是问它有什么用 我不是问它是怎么用的 我不是问“ref”和“out”有什么区别

为什么“out”参数作为一种语言结构存在于C#中

关于这个问题的详细说明 它为什么首先存在?难道没有更好的语言特性可以获得与“out”参数相同的效果吗

使值类型的行为类似于引用类型不是很奇怪吗

难道没有更好的方法从一个方法返回多个值吗

这是一个历史事件吗?也就是说,在C的第一个版本中,没有办法实现使用out参数可以实现的功能,但是现在有了更新的功能,并且只是为了向后兼容而保留在语言中

我没问的是什么
  • 我不是问它有什么用
  • 我不是问它是怎么用的
  • 我不是问“ref”和“out”有什么区别
  • 我读到人们应该避免使用它,而选择其他的结构
  • 在阅读类似的问题时,我没有发现任何重复的问题

    预期答案格式 我很想听到这样的话,“看,这是一个你只能用“out”参数语言构造来解决的问题,这里有一个代码示例……”

    或者,“看,这曾经是解决以下问题的唯一方法…代码示例…,但是由于C版本…更好的解决方法是这样的…代码示例…”


    请不要发表意见。

    原因之一是与Win32 API等兼容。如果要直接从C#调用Win32 API调用的某些方法声明,则需要使用out和/或ref

    您可以在pinvoke.net上找到此类方法声明的一些示例:

    它为什么首先存在?难道没有更好的语言特性可以获得与“out”参数相同的效果吗

    “更好”是什么?基于C#7的争论,事情更容易一些,是这样的:

    public static (bool Succesful, int Value) TryParse(string s) { ... }
    
    var parseResult = TryParse(s);
    if (parResult.Succesful)
        DoSomething(parResult.Result);
    

    if (int.TryParse(s, out var i))
        DoSomething(i);
    

    在本机元组支持之前,实际上必须实现一个结构/类才能返回多个值。。。。讨厌。诚然,
    out
    解决方案也不会那么干净,但这仍然是一个更好的选择,而不仅仅是为了让方法返回多个值而不得不在代码库中塞满大量轻量级容器类

    使值类型的行为类似于引用类型不是很奇怪吗

    为什么??即使只是为了向后兼容或互操作,它也是一种必需的语言特性

    还有,你把事情搞混了。如果需要按引用传递语义,可以使用
    ref
    关键字。
    out
    关键字表示该参数将用作返回值;它需要通过引用传递这一事实是一个实现细节

    难道没有更好的方法从一个方法返回多个值吗

    这基本上是你重写的第一个问题

    这是一个历史事件吗?也就是说,在C的第一个版本中,没有办法实现使用out参数可以实现的功能,但是现在有了更新的功能,并且只是为了向后兼容而保留在语言中

    向后兼容性是显而易见的重要原因。而且,仅仅因为有更好的方法做事情并不一定意味着语言特性应该被删除。然后,您可以为许多其他的语言构造提供一个例子:
    用于循环,
    转到
    ,等等。这要求它准确地知道何时分配变量。通常不难理解,一项任务很容易理解

    但有一种情况是,通过引用将变量传递给另一个方法。该方法是否要求在调用之前分配该变量,然后对其进行修改,还是只分配该变量?编译器通常无法知道,该方法可能位于另一个程序集中,且方法体不可用。例如,对于任何.NET Framework程序集都为True

    因此,您必须明确它,当方法要求在调用之前分配参数时,您使用
    ref
    ,当方法仅分配参数时,您使用
    out
    。伟大的功能顺便说一句,它消除了一整条非常常见的错误



    关于这个问题的其他错误答案,请注意。数据流在pinvoke中也起着重要的作用,pinvoke封送器需要知道转换程序是否转换非托管函数返回的任何数据。它不注意out和ref关键字,只注意
    [In]
    [out]
    属性。更多关于这个棘手的细节,请参见。

    根据定义,这个问题是基于意见的,这就是为什么它被关闭的原因。@DavidG:我不明白。这种观点是如何建立的?难道不能说,“看,这个问题只能通过使用'out'参数来解决,这里是一个代码示例”?正如KristoferA刚才在他的?中所做的,很明显,使用
    ref
    可以得到相同的结果,只是不能保证参数会在方法内部初始化。可能是C#design团队认为最好添加这种支持。然而,如果没有让C#language团队的任何人来回答这个问题,或者没有链接到其他地方的答案,这里的所有答案都只是某人的观点。我不同意那些认为这是基于观点的人。我懒得花一个小时在谷歌上搜索它,但我敢打赌,在这一点上,Hejlsberg或Lippert一定引用了他的话。Entymology问题通常不适合堆栈溢出,因为你真的在寻找某些事情的根本原因,而我们知道的根本原因正如@Liam所说,它在那里是因为说明书上说它在那里。你在问为什么有人把它添加到