.NET中的参数ref和out参数有什么区别?一个人比另一个人更有用的情况是什么?什么是一个可以使用而另一个不能使用的代码片段?
前几天有人问我应该使用参数关键字out而不是ref.虽然我(我认为)明白之间的差别ref和out关键字(已问过)和最好的解释似乎是ref== in和out,都有些什么(假设或代码)的例子,我应该一直使用out,而不是ref.
既然ref更一般,你为什么要用out?它只是语法糖吗?
我理解如果我传递一个值类型(int,struct等)作为参数(没有ref关键字),该变量的副本将传递给该方法,但如果我使用该ref关键字,则传递对该变量的引用,不是新的.
但是使用引用类型(如类),即使没有ref关键字,也会将引用传递给方法,而不是副本.那么ref关键字与引用类型的用途是什么?
举个例子:
var x = new Foo();
Run Code Online (Sandbox Code Playgroud)
以下有什么区别?
void Bar(Foo y) {
y.Name = "2";
}
Run Code Online (Sandbox Code Playgroud)
和
void Bar(ref Foo y) {
y.Name = "2";
}
Run Code Online (Sandbox Code Playgroud) 以下两种字段初始化方式之间是否存在差异?什么时候使用哪一个?
public class Class1
{
private SomeClass someclass;
public Class1()
{
someclass = new SomeClass(some arg);
}
}
Run Code Online (Sandbox Code Playgroud)
public class Class1
{
private SomeClass someclass = new SomeClass(some arg);
}
Run Code Online (Sandbox Code Playgroud)
第二个例子中的字段可以是只读的.
的谷歌C++样式指南绘制有明显的区别(严格接着cpplint.py输入参数之间)(→常量REF,值)和输入-输出或输出参数(→非const的指针):
C/C++函数的参数既可以是函数的输入,也可以是函数的输出,或者两者兼而有之.输入参数通常是值或const引用,而输出和输入/输出参数将是非常量指针.
并进一步 :
事实上,在Google代码中,一个非常强大的约定是输出参数是值或const引用,而输出参数是指针.
但我无法弄清楚为什么不应该通过引用传递输入/输出参数(我将输出参数放在一边).在stackoverflow上有很多与这个问题相关的主题:例如,在这里,接受的答案清楚地说明了这一点
它主要是关于风格
但是如果
如果您希望能够传递null,则必须使用指针
那么,如果我想避免指针为空,总是需要一个指针是什么意思?为什么只使用输入参数的引用?
可能重复:
'ref'和'out'关键字之间有什么区别?
ref和之间有什么区别out?我很困惑何时使用ref和out.所以请解释如何使用ref和out,以及在哪些情况下.
为什么C#中的"out"参数作为语言构造存在?
为什么它首先存在?是否有更好的语言功能可以获得"out"参数可以获得的相同效果?
使值类型的行为类似于引用类型,这不奇怪吗?
是不是有更好的方法从方法返回多个值?
它是一个历史性的东西,意味着C#的第一个版本没有办法实现使用out参数可以实现的东西,但现在有更新的功能,它只是保留在语言中以便向后兼容?
在阅读类似的问题时,我没有发现任何重复.
我很想听到这样的话:"看,这是一个只能通过使用"out"参数语言结构来解决的问题,这里有一个代码示例......".
或者,"看,这曾经是解决以下问题的唯一方法......代码示例......,但是因为C#版本...更好的解决方法就是这样......代码示例......" .
没有意见.
我一直在努力研究C#方法.有三种方法可以将参数传递给C#方法.
值参数:此方法将参数的实际值复制到函数的形式参数中.在这种情况下,对函数内部参数所做的更改对参数没有影响.
引用参数:此方法将对参数的内存位置的引用复制到形参中.这意味着对参数所做的更改会影响参数.
输出参数:此方法有助于返回多个值.
我通过以下示例代码了解了上述类型的传递参数.
using System;
namespace PassingParameterByReference
{
class MethodWithReferenceParameters
{
public void swap(ref int x)
{
int temp = 5;
x = temp;
}
static void Main(string[] args)
{
MethodWithReferenceParameters n = new MethodWithReferenceParameters();
/* local variable definition */
int a = 100;
Console.WriteLine("Before swap, value of a : {0}", a);
/* calling a function to swap the value*/
n.swap(ref a);
Console.WriteLine("After swap, value of a : {0}", a);
Console.ReadLine();
}
} …Run Code Online (Sandbox Code Playgroud) out 上的 msdn 文档说作为 out 传递的参数必须在函数内部分配一个值。来自网站的示例:
class OutExample
{
static void Method(out int i)
{
i = 44;
}
static void Main()
{
int value;
Method(out value);
// value is now 44
}
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,当声明 int "value" 时,它已经被分配了一个默认值 0(因为 int 是一个值类型并且不能为 null。)那么为什么有必要让 "Method" 修改它的值呢?
同样,如果使用“ref”而不是“out”,是否还需要初始化“value”?
有这样的问题'ref' 和 'out' 关键字有什么区别?但没有人想把 2 和 2 放在一起。
我知道这是一个以前被问过的重复问题,但我发现的所有问题一般都是指C#,但我认为Unity不支持.NET 4.6,而不是最新的框架?
我有一个函数,如果bool对于几个类别中的每一个都为真,则传递多个变量.
void CheckData()
{
if (int 1 > int 2)
{
otherScript.Function(var 1, var 2, var 3)
}
}
Run Code Online (Sandbox Code Playgroud)
该函数查询SQL数据库并根据SQL数据定义输入的变量.有一种简单的方法可以返回多个变量的值吗?从我一直在做的研究来看,似乎有一种方法可以在较新版本的.NET中这样做,但是因为它不支持元组而不能使用Unity?
我也读过人们说你可以返回一个数组,然后在函数之外对数据进行排序,但后来我读到其他人说相反,我发现的信息不一致.
有谁可以让我知道实现这一目标的最简单方法?如果需要,我只需硬编码每个单独的变量并手动完成,但我正在努力保持我的代码清洁,所以如果有更好的方法,我想知道在我花费数小时编写不正确的东西之前.
编辑:建议的重复帖子链接显示了如何通过创建另一个类来实现这一点,但我正在寻找一个更简单的解决方案,下面回答.谢谢.
这些关键字应该如何以及何时使用?
它们与C#的目的是否相同?
在C#中,ref和out参数有什么区别?
例:
void method1(ref int p1)
{
//....
}
void method2(out int p2)
{
//....
}
Run Code Online (Sandbox Code Playgroud)
另外,每种方法的使用指南是什么?
在C#ref和out关键字中.
它如何影响内存管理?内存管理ref和out关键字有什么区别吗?