对方法参数前面的 out 关键字有些疑惑?

Posted

技术标签:

【中文标题】对方法参数前面的 out 关键字有些疑惑?【英文标题】:Some doubts about the out keyword in front of a method paramether? 【发布时间】:2014-03-11 13:55:35 【问题描述】:

我是C#的新手(我来自Java),我有以下疑问。

在一个类中我有这个方法的声明:

public List<DataModel.MaliciousCode.MaliciousSmall> getList(DataModel.MaliciousCode.MaliciousSmall model, out int totalRecords)
        

        .............................................
        .............................................
        .............................................

        

我的疑问与参数列表中的 out 关键字有关。

看了官方文档了解到这个参数是通过引用传递的(并且可能没有初始化)。

那么究竟是什么意思呢?这意味着在 C# 中我有指针?

【问题讨论】:

【参考方案1】:

out 表示当此方法将被调用时,参数totalRecords 从该方法中分配一些值,并且该值将可供调用者使用。

out parameter modifier (C# Reference)

out 关键字导致参数通过引用传递。这是 类似于 ref 关键字,除了 ref 要求变量是 在通过之前初始化。要使用 out 参数, 方法定义和调用方法必须显式使用 out 关键字。

例如,如果你这样调用你的方法:

int totalRecords; //just declaration no initialization 
var list = getList(new MaliciousSmall(), out totalRecords);
Console.WriteLine(totalRecords);// value from method. 

在方法调用结束时,totalRecords 将在方法内部分配一些值。 方法getList 必须为totalRecords 分配/初始化一些值。如果在方法中没有为其分配任何值,则会发生编译时错误。这就是为什么out 参数在方法调用中使用之前可能或许多未初始化的原因。

【讨论】:

好的,但它与经典 C 指针(或指针作为内存地址的经典概念)之类的东西有关吗? @AndreaNobili,不是真的,C# 中的指针在unsafe 代码的上下文中使用。 refout 用于通过引用传递。但与 C 不同的是,您不能使用它们的地址并在安全代码中进行操作。由于Managed Code 的性质,概念相似,但并不完全相同。【参考方案2】:

在您的方法中,out int totalRecords 在返回方法之前必须根据其类型分配给任何正确的值。

即使totalRecords 可能会在调用此方法之前分配给一个值(不鼓励),但totalRecords 仍然必须在它从方法中出来之前分配给一个值,并且其他变量不能进行任何值计算或在赋值之前对其进行操作,这与ref等其他参数修饰符不同。

对我来说,我可能会使用方法返回值作为方法过程的指示,而out 变量则用于必须从方法中得出的其他结果,但可以忽略方法范围之外的初始化值。 安全地处理多个返回值out

参考this post 接受的答案,明显的区别是“你可以在指针上说++,但不能在refout 。”并且ref 非常接近指针,但没有退出。

当我们检查 C# 中 ref 、 out 和指针之间的 Generated CIL Code 差异时,我们可以看到 this。

【讨论】:

以上是关于对方法参数前面的 out 关键字有些疑惑?的主要内容,如果未能解决你的问题,请参考以下文章

解决方法参数传递中的疑惑

解决方法参数传递中的疑惑

out 和 ref + params 的理解

ref、val 和 out 对方法参数的含义是啥?

ref 与 out

C#中关键字ref和out的区别