对方法参数前面的out关键字有疑问

本文关键字:out 关键字 有疑问 前面 方法 参数 | 更新日期: 2023-09-27 17:49:34

我对 c#很陌生(我来自Java),我有以下疑问

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

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

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

阅读官方文档,我明白这个参数是通过引用传递的(并且它可以不初始化)。

到底是什么意思?这意味着在c#中我有指针?

对方法参数前面的out关键字有疑问

out意味着当这个方法被调用时,参数totalRecords 从方法中分配一些值,并且该值将可供调用者使用。

out参数修饰符(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参数在使用方法调用之前可能或许多没有初始化的原因。

在你的方法中,out int totalRecords必须在方法返回之前根据它的类型被赋给任何正确的值。

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

对于我来说,我可能会使用方法返回值作为方法进程的指示,并且out变量上的其他结果必须从方法中出来,但方法范围之外的初始化值可以忽略。使用out

安全地处理多个返回值

参考这篇文章的接受答案,明显的区别是"你可以在指针上说++,但不能在上说refout ."和ref非常接近指针但不能。。

当我们检查c#中ref, out和指针之间的生成的CIL代码差异时,我们可以看到这个