C# 中何时使用“using”块?如何在 C# 中使用“using”块?

2023-12-05

我在大多数样本中看到SqlCommand像这样使用

using (SqlConnection con = new SqlConnection(CNN_STRING))
{
    using (SqlCommand cmd = new SqlCommand("Select ID,Name From Person", con))
    {
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds);           
        return ds;
    }
}

我知道我们为什么要使用using陈述。但SqlCommand不包括Close()方法所以我们真的应该在一个using陈述?


因为它还实现了IDisposable.

using 语句的目的是当控制到达 using 结束时,它将处理 using 块的对象并释放内存。它的目的不仅是为了自动关闭连接,基本上它会处理连接对象,并且显然连接也因此而关闭。

它的目的是释放我们在Using语句中使用的资源。

根据MSDN:

通常,当您使用IDisposable对象,您应该在 using 语句中声明并实例化它。 using 语句调用Dispose以正确的方式在对象上使用方法,并且(当您如前面所示使用它时)它也会导致对象本身超出范围Dispose叫做。在 using 块中,对象是只读的,不能修改或重新分配。

using 语句确保Dispose即使在调用对象的方法时发生异常,也会被调用。您可以通过将对象放入 try 块中然后调用来获得相同的结果Dispose in a finally堵塞;事实上,这就是编译器翻译 using 语句的方式。前面的代码示例在编译时扩展为以下代码(请注意额外的花括号来创建对象的有限范围):

NOTE:

您可以实例化资源对象,然后将变量传递给 using 语句,但这不是最佳实践。在这种情况下,在控制离开 using 块后,对象仍保留在范围内,即使它可能不再有权访问其非托管资源。换句话说,它将不再被完全初始化。如果您尝试在 using 块之外使用该对象,则可能会导致引发异常。因此,通常最好在 using 语句中实例化对象并将其范围限制在 using 块内。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 中何时使用“using”块?如何在 C# 中使用“using”块? 的相关文章

随机推荐

  • 如何从 Android 调用 RESTful Web 服务?

    我使用 Jersey Framework 和 Java 在 Netbean IDE 中编写了一个 REST Web 服务 对于用户需要提供用户名和密码的每个请求 我知道这种身份验证不是最佳实践 使用如下的curl命令 curl u user
  • Mongodb身份验证[重复]

    这个问题在这里已经有答案了 如何通过官方 C 驱动程序使用 mongodb 进行身份验证 除了内部成员之外 我找不到任何用于身份验证的 API 方法 应使用以下连接字符串格式在连接字符串中指定身份验证凭据 mongodb username
  • ChartJS 3 不显示图例

    我正在使用 ChartJS 3 7 即使我通过了options plugins legend display a true 图例不显示 如何让图例显示 看起来较新版本的 ChartJS 要求您注册要使用的各个元素 您需要专门注册图例 imp
  • 使用 Google 登录的 OAuth2 Spring 安全性不起作用

    我在下面的链接中找到了一个关于使用 Spring security 进行第三方登录的非常好的教程 它包含前端和后端代码 https www callicoder com spring boot security oauth2 social
  • 使用多个数据库运行 Laravel 队列

    我有 Laravel 5 项目 这是多租户项目 因此我有一个包含多个数据库的文件夹项目 当我使用php artisan queue listen 它仅适用于当前的数据库设置 我用database队列驱动程序 因此每个租户都有自己的通知表 如
  • 纠正缺少 ASP.Net MVC 控制器的 404 消息

    我有一个 MVC 2 应用程序 它应该始终提供 漂亮 的 404 页面 然而目前我得到了一个低级别的 Net sitename 应用程序中的服务器错误 我有一个基本控制器 它有一个NotFound将呈现漂亮的 404 页面的操作 处理缺失的
  • 如何使用 Selenium 为 Firefox 和 Chrome 禁用推送通知?

    我想在通过 Selenium Webdriver 启动 Firefox 浏览器时禁用通知 我发现这个答案 但它已被弃用 并且在 Firefox 上对我不起作用 但它在 Chrome 上完美工作 我将这种依赖关系用于我的pom xml
  • ORA-22275: 指定的 LOB 定位器无效

    我有一个巨大的 Oracle 函数 用于计算 6 个表中的数据 create or replace FUNCTION STATISTICS FUNCTION NAMEIN IN VARCHAR2 RETURN CLOB AS LAST 60
  • 从标准库中重新定义函数是否违反了单一定义规则?

    include
  • 如何使用razor自定义EditorFor CSS

    我有这门课 public class Contact public int Id get set public string ContaSurname get set public string ContaFirstname get set
  • Xcode 8 为 iOS 10 生成损坏的 NSManagedObject 子类

    我最近将我的 iOS 应用程序项目更新到了 iOS 10 现在我尝试更改应用程序的核心数据模型 但 Xcode 生成的新 NSManagedObject 子类已损坏 我还尝试修复子类手册 但这不起作用 核心数据模型的最低工具版本设置为 Xc
  • 使用 React 定期重新加载 iframe 的最佳方法是什么?

    我正在使用 React 构建一个网页 这意味着我无法直接操作 DOM 我尝试通过更新 url 状态来重新加载 iframe 但这似乎不会重新加载页面 这是我尝试过的状态代码 componentDidMount function setInt
  • 在主选项卡栏控制器之前显示登录视图控制器

    我正在创建一个带有需要登录的标签栏控制器的 iPad 应用程序 因此 在启动时 我想显示一个 LoginViewController 如果登录成功 则显示选项卡栏控制器 这就是我实现初始测试版本的方式 省略了一些典型的标头内容等 AppDe
  • Eclipse 编辑器中当前选定代码的 AST?

    我需要在 Eclipse 的 java 编辑器中获取当前选择的 AST 基本上我想将选定的java代码转换为其他形式 可能是其他语言或XML等 所以我想 我需要获得 AST 来进行选择 目前我能够以简单文本的形式进行选择 对于这样的问题有什
  • 使用OpenGL绘制图像

    如何使用开放的 OpenGL OpenTK 在地图 GMap Net 上绘制视频 图像 来自无人机的视频 我的问题是如何在地图上绘制视频图像 因为视频可以在地图上以不同角度观看 并且图像在地图上应该是梯形而不是四边形 I copied im
  • 使用 ref setAccessibilityFocus 不起作用

    我正在使用ref支柱连同findNodeHandle在一堆组件上以便能够触发AccessibilityInfo setAccessibilityFocus 然而 它并不总是按预期工作 有时参考是null虽然componentDidMount
  • 将所有列(表中)的所有零(如果有)更改为...例如 1

    我有一个包含 18 列 均为整数 和 1040 行的表 如果任何值为零 我想将其更改为 1 我正在使用 Postgresql 做这个的最好方式是什么 我无法想出一个简单的更新语句 而且我是数据库新手 关于我应该看什么来学习如何实现这样的事情
  • AspectJ - 使用类型间声明创建全局记录器字段

    我想创建一个类型间声明 在每个类中声明一个 静态最终 Logger 实例 构造函数应该传递给封闭类Klazz class value Aspect public class LoggerAspect public interface Log
  • 安装 Gulp 后:“找不到命令‘gulp’”

    安装后gulp js通过 npm 我收到了no command gulp found运行时出错gulp来自安装到的同一目录的命令 当查看下方时node modules bin 目录 我可以看到gulp在那里可执行 我的npm安装有问题吗 这
  • C# 中何时使用“using”块?如何在 C# 中使用“using”块?

    我在大多数样本中看到SqlCommand像这样使用 using SqlConnection con new SqlConnection CNN STRING using SqlCommand cmd new SqlCommand Selec