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

Why does SqlConnection use reference type when passed as parameter?

我正在编写以下获取一个 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 函数在完成工作后关闭连接。 但令我头疼的是,为什么 cnn 的状态在第 4 行调用 doSomething 函数后在第 5 行关闭? 我们都知道C#中的参数默认是按值传递的。当 cnn 按值传递时,为什么它会在第 5 行关闭?

我认为您对按值调用与引用调用的含义感到困惑。

按值传递时,doSomething() 方法仍然可以自由更改对象的状态,这些更改将在使用该对象时反映在 RnD_Load() 中。 doSomething() 不能 做的是说 RnD_Load() 中的 cnn 现在指向不同的对象(或 null)。

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

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

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

传递引用类型对象是通过复制指向该对象的指针来完成的。所以你不复制内存块,你只是复制指向同一内存的指针。这就像复制文件的快捷方式而不是复制文件。