我正在编写以下获得一个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行处关闭?
答案 0 :(得分:1)
C#中有reference types
和value types
。所有原始类型,例如int
,string
,Datetime
,...都是值类型,这意味着除非您使用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)
传递引用类型对象是通过处理指向该对象的指针来完成的。因此,您无需复制内存块,只需将指针复制到相同的内存即可。就像应对文件的快捷方式,而不是应对文件。