首页 > 解决方案 > 为什么SqlConnection作为参数传递时使用引用类型?

问题描述

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

标签: c#ado.net

解决方案


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

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

推荐阅读