为什么 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 types
和value types
。所有基本类型,如 int
、string
、Datetime
、...都是值类型,这意味着除非你使用 ByRef
关键字,否则它们将作为值传递给函数。但与这些类型不同的是,从 类 实例化的所有其他对象都是引用类型,它们始终将作为 ByRef
参数传递。您可能想知道为什么即使值相同,以下代码也等于 false! :
(new Person("John"))==(new Person("John")) // equals to false
传递引用类型对象是通过复制指向该对象的指针来完成的。所以你不复制内存块,你只是复制指向同一内存的指针。这就像复制文件的快捷方式而不是复制文件。
我正在编写以下获取一个 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 types
和value types
。所有基本类型,如 int
、string
、Datetime
、...都是值类型,这意味着除非你使用 ByRef
关键字,否则它们将作为值传递给函数。但与这些类型不同的是,从 类 实例化的所有其他对象都是引用类型,它们始终将作为 ByRef
参数传递。您可能想知道为什么即使值相同,以下代码也等于 false! :
(new Person("John"))==(new Person("John")) // equals to false
传递引用类型对象是通过复制指向该对象的指针来完成的。所以你不复制内存块,你只是复制指向同一内存的指针。这就像复制文件的快捷方式而不是复制文件。