为什么SqlConnection作为参数传递时使用引用类型?

时间:2019-07-03 22:34:34

标签: c# ado.net

我正在编写以下获得一个SqlConnection参数的函数。

    private void doSomething(SqlConnection cnn)
    {
        //do something
        cnn.Close();
    }

我正在按如下所示调用此方法:

    private void RnD_Load(object sender, EventArgs e)
    {
        //line 1
        SqlConnection cnn = new SqlConnection();
        //line 2
        cnn.ConnectionString = "my connection string";
        //line 3
        cnn.Open();
        //line 4
        doSomething(cnn);
        /* here cnn should be in open state, but it closes as soon as doSomething is done */
        //line 5
        if (cnn.State == ConnectionState.Open)
        {
            Console.Write("open");
        }
        else
        {
            Console.Write("closed");
        }
    }

doSomething函数在完成工作后关闭连接。 但是,为什么在第4行调用doSomething函数后,为什么在第5行关闭cnn的状态呢? 众所周知,默认情况下,C#中的参数是按值传递的。当cnn按值传递时,为什么它在第5行处关闭?

3 个答案:

答案 0 :(得分:1)

C#中有reference typesvalue types。所有原始类型,例如intstringDatetime,...都是值类型,这意味着除非您使用ByRef关键字,否则它们将作为值传递给函数。但是与这些类型不同,从类实例化的所有其他对象都是引用类型,它们始终将作为ByRef参数传递。您可能想知道为什么即使值相同,以下代码也等于false! :

(new Person("John"))==(new Person("John")) // equals to false

答案 1 :(得分:0)

我认为您对按值调用还是按引用进行调用感到困惑。

通过值传递时,doSomething()方法仍然可以自由更改对象的状态,并且这些更改将在使用该对象的RnD_Load()中反映出来。 {em}不能做的doSomething()就是说cnn中的RnD_Load()指向另一个对象(或为空)。

但是,如果您已通过引用传递了cnn(通过在参数中添加ref限定符),则doSomethign()可以说cnn = someNewSqlConnectionObject;和{{1} cnn中的}现在将指向该新对象。

答案 2 :(得分:0)

传递引用类型对象是通过处理指向该对象的指针来完成的。因此,您无需复制内存块,只需将指针复制到相同的内存即可。就像应对文件的快捷方式,而不是应对文件。