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

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

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

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

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

        }

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

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

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

【问题讨论】:

    标签: c# .net


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2019-10-03
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多