gpt4 book ai didi

c# - 使用带有 connection.open 的语句

转载 作者:可可西里 更新时间:2023-11-01 07:46:10 26 4
gpt4 key购买 nike

我正在查看一些代码并与同事讨论。

特别是一段看起来像这样的代码。

    [Test]
public void TestNormalWay()
{
using(var cn = GetConnection())
{
cn.Open();
// do stuff
}
}

问题来了:

"why not move the cn.Open into the GetConnection method."

我说过,如果“打开”抛出异常,则不会调用处置。他的回答是

"So what. The connection wasn't opened so why would it need to get closed (or disposed)?"

对我来说,这只是我不想知道是否需要处理/关闭的问题,所以我会在代码中重复 cn.Open,而不是将其移动到共享函数中。

但是 这很有趣...所以我在SQL Server Connection Pooling (ADO.NET) 上做了一些阅读

我不清楚是否存在调用 cn.Open 并在需要调用 dispose 的地方抛出异常的情况。

所以在我下面的例子中,“TestNormalWay”和“WhyNotDoItThisWay”之间真的有什么区别吗

    protected static DbConnection GetConnection()
{
DbConnection cn = new SqlConnection("SomeConnecitonstring... ");
return cn;
}

protected static DbConnection GetConnectionDangerousVersion()
{
DbConnection cn = new SqlConnection("SomeConnecitonstring... ");
cn.Open(); // this will throw.. .dispose not called
return cn;
}

[Test]
public void TestNormalWay()
{
using(var cn = GetConnection())
{
cn.Open();
// do stuff
}
}

[Test]
public void WhyNotDoItThisWay()
{
using(var cn = GetConnectionDangerousVersion())
{
// do stuff
}
}

最佳答案

您编写代码的方式总是希望在创建连接后立即打开连接,因此没有区别。

但是,您可以多次打开和关闭连接,并且在设计用于执行此操作的代码中存在很大差异。

我可能想编写一些代码,其中我有一个长时间运行的例程,它接受一个连接对象并随着时间的推移打开和关闭它。例程可能不关心连接对象是如何创建的。因此,将创建连接的行为与打开和关闭连接的行为分开是一个优势。

关于资源管理问题,我同意这不是问题。创建 SQL 连接对象本身并不会锁定任何资源,打开它获取池连接的行为。如果打开返回异常,我认为假设连接未打开是合理的。

关于c# - 使用带有 connection.open 的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9316981/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com