c# - 为什么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# 中有reference types
和。value types
所有原始类型,如int
, string
, Datetime
,... 都是值类型,这意味着除非您使用ByRef
关键字,否则它们将作为值传递给函数。但与这些类型不同,从类实例化的所有其他对象都是引用类型,它们总是作为ByRef
参数传递。您可能想知道为什么即使值相同,以下代码也等于 false!:
(new Person("John"))==(new Person("John")) // equals to false
推荐阅读
- java - 无法安装 j-text-utils-0.3.3.jar - 没有主要清单属性
- amazon-s3 - 使用胶水从 ec2 mysql 获取数据到 redshift
- verilog - verilog中是否有一种方法可以从特定地址开始读取ROM数据?
- vba - VBA If Else 在 For Next 循环中
- java - 验证元素被选中;找不到唯一元素
- spring - 将源代码(用于eclipse spring STS)导入intellij
- powershell - 如何将批处理脚本中的条件转换为 PowerShell?
- spring - spring mongodb中的聚合管道
- android - 发布后,该应用程序与您的任何设备都不兼容
- javascript - 为什么 parseInt("BG", 16) 返回 11 而不是 NaN?