C#传递ref类型参数问题

时间:2009-08-15 04:43:30

标签: c# .net visual-studio-2008 datatable ado.net

假设我有以下代码片段,即goo call foo,goo和foo创建的DataTable只会调用Rows.Add。然后goo将使用来自foo的DataTable实例的更新数据。

我的问题是,在我的场景中,与使用和不使用ref参数进行比较的任何差异或好处?

我使用的是C#+ .Net 3.5 + VSTS2008。

    void foo (ref DataTable dt)
    {
        // call Row.Add on dt
    }

    void goo()
    {
        DataTable dt1 = ...; // create a new instance of DataTable here
        foo (ref dt1);
        // read updated content of DataTable by foo here
    }

5 个答案:

答案 0 :(得分:4)

如果您打算更改dt指向的内容,则只能使用ref。例如,如果您想用不同的 DataTable(或从DataTable派生的类型)替换它。

在这种情况下,您只是使用 dt,因此没有理由使用ref。由于DataTable是一个类,因此所做的任何更改都将在foo之外显示。

答案 1 :(得分:3)

除非您打算获取其他对象,否则不需要ref参数。 DataTable是一个引用对象,因此您实际传递的是指向指针的指针。如果你打算让被调用的函数对你的实例进行更改,你就不需要参考。

答案 2 :(得分:2)

在这种情况下,使用ref或非ref参数之间绝对没有区别。在这种情况下,ref param允许你做的唯一事情是“dt = new DataTable()”并且它会影响主函数。

最好只在需要时使用ref参数,否则会产生更加混乱的代码。

答案 3 :(得分:0)

我看到的唯一区别/好处是,如果您没有通过引用传递代码,代码会更清晰。

答案 4 :(得分:0)

其他人已经回答,但如果您想了解更多信息,可能需要阅读article on parameter passing in C#

(每个人都是对的 - 如果你只是想改变对象中的数据,你可以通过值传递参数。如果你想改变调用者变量引用的对象,那么然后你通过引用传递。)