对方法参数前面的 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 代码的上下文中使用。ref
和 out
用于通过引用传递。但与 C 不同的是,您不能使用它们的地址并在安全代码中进行操作。由于Managed Code 的性质,概念相似,但并不完全相同。【参考方案2】:
在您的方法中,out int totalRecords
在返回方法之前必须根据其类型分配给任何正确的值。
即使totalRecords
可能会在调用此方法之前分配给一个值(不鼓励),但totalRecords
仍然必须在它从方法中出来之前分配给一个值,并且其他变量不能进行任何值计算或在赋值之前对其进行操作,这与ref
等其他参数修饰符不同。
对我来说,我可能会使用方法返回值作为方法过程的指示,而out
变量则用于必须从方法中得出的其他结果,但可以忽略方法范围之外的初始化值。 安全地处理多个返回值out
参考this post 接受的答案,明显的区别是“你可以在指针上说++,但不能在ref
或out
。”并且ref
非常接近指针,但没有退出。
当我们检查 C# 中 ref 、 out 和指针之间的 Generated CIL Code 差异时,我们可以看到 this。
【讨论】:
以上是关于对方法参数前面的 out 关键字有些疑惑?的主要内容,如果未能解决你的问题,请参考以下文章