首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在“`using`”语句中内联创建的所有对象是否都会被释放?

在“`using`”语句中内联创建的所有对象是否都会被释放?
EN

Stack Overflow用户
提问于 2014-02-18 12:32:38
回答 3查看 3.2K关注 0票数 11

这可能在其他地方得到回答,但在进行了一些搜索之后,我在正常的using上下文之外并没有找到太多关于这个主题的内容。

我很好奇是否所有在using块中创建的对象都会和原始对象一样被释放。

这里是上下文:

通常我会做这样的事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using (var conn = new SqlConnection(connectionString))
using (var cmd = new SqlCommand(commandText, conn))
{
    //Do everything I need to here
}

我知道conncmd在这一点上都超出了范围,并且因为可爱的using关键字而被释放。

我很好奇,同样的处置规则是否适用于以下声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using (var cmd = new (SqlCommand(commandText, new SqlConnection(ConnectionString)))
{
   //Do everything I need here
}

SqlConnection超出作用域并由于与对象关联而被释放时,using语句中内联创建的cmd对象会被释放吗?

另外,哪一种在语法上是首选的?我个人认为第二个更干净,但我知道可读性也可能在这里发挥。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-18 12:34:26

对于第二段代码,当流离开Dispose块时,不会在SqlConnection实例上调用using,除非SqlCommand.Dispose()在内部这样做(不,它没有)。

根据规范(8.13),将using (ResourceType resource = expression) statement转换为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    ResourceType resource = expression;
    try {
        statement;
    }
    finally {
        if(resource != null)
            ((IDisposable)resource).Dispose();
    }
}

在您的代码中,resourceSqlCommand,这是调用Dispose的一个。

票数 10
EN

Stack Overflow用户

发布于 2014-02-18 12:35:10

不是的。

using语句只应用于语句中直接声明的资源,而不应用于初始化程序中的其他分配。

对于每个资源,您需要一个单独的using语句。

票数 4
EN

Stack Overflow用户

发布于 2014-02-18 12:41:15

根据MSDN,此代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using (var temp = obj)
{
    // ...
}

翻译为(包括额外的花括号以限制范围):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    var temp = obj;
    try
    {
        // ...
    }
    finally
    {
        if (temp != null)
            ((IDisposable)temp).Dispose();
    }
}

如您所见,如果您将obj替换为new SqlCommand(commandText, new SqlConnection(ConnectionString)),那么只有SqlCommand才会得到正确的处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    SqlCommand temp = new SqlCommand(commandText,
        new SqlConnection(ConnectionString));
    try
    {
        // ...
    }
    finally
    {
        if (temp != null)
            ((IDisposable)temp).Dispose();
    }
}

因此,除非已释放的SqlConnection这样做,否则SqlCommand不会被释放。但是它没有,也不应该:它没有创建对象,因此它也不能破坏它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21864676

复制
相关文章
Contact Manager Web API 示例[2] Web API Routing
联系人管理器web API是一个Asp.net web api示例程序,演示了通过ASP.NET Web API 公开联系信息,并允许您添加和删除联系人,示例地址http://code.msdn.microsoft.com/Contact-Manager-Web-API-0e8e373d。 Contact Manager Web API 示例[1]CRUD 操作 已经做了一个基本的介绍,本文主要介绍Web API Routing。 如果你已经熟悉 ASP.NET MVC,你会发现 Web API Routi
张善友
2018/01/22
9740
Contact Manager Web API 示例[2] Web API Routing
联系人管理器web API是一个Asp.net web api示例程序,演示了通过ASP.NET Web API 公开联系信息,并允许您添加和删除联系人,示例地址http://code.msdn.microsoft.com/Contact-Manager-Web-API-0e8e373d。 Contact Manager Web API 示例[1]CRUD 操作 已经做了一个基本的介绍,本文主要介绍Web API Routing。 如果你已经熟悉 ASP.NET MVC,你会发现 Web API Routi
张善友
2018/01/22
1K0
使用OAuth 2.0访问谷歌的API
谷歌的API使用的OAuth 2.0协议进行身份验证和授权。谷歌支持常见的OAuth 2.0场景,如那些Web服务器,安装,和客户端应用程序。
拿我格子衫来
2022/01/24
4.6K0
使用OAuth 2.0访问谷歌的API
Contact Manager Web API 示例[1]CRUD 操作
联系人管理器web API是一个Asp.net web api示例程序,演示了通过ASP.NET Web API 公开联系信息,并允许您添加和删除联系人,示例地址http://code.msdn.microsoft.com/Contact-Manager-Web-API-0e8e373d . 下面的文章以这个示例讲解ASP.NET Web API的各方面知识: 1、CRUD操作: CURD 是 "Create, Read, Update, Delete" (新增、读取、更新、删除) 的简写,这四个动作是数据
张善友
2018/01/22
9290
Contact Manager Web API 示例[4] 异常处理(Exception Handling)
联系人管理器web API是一个Asp.net web api示例程序,演示了通过ASP.NET Web API 公开联系信息,并允许您添加和删除联系人,示例地址http://code.msdn.microsoft.com/Contact-Manager-Web-API-0e8e373d。 Contact Manager Web API 示例[1]CRUD 操作 已经做了一个基本的介绍, Contact Manager Web API 示例[2] Web API Routing 介绍Web API Rout
张善友
2018/01/22
8190
[CORS:跨域资源共享] 同源策略与JSONP
Web API普遍采用面向资源的REST架构,将浏览器最终执行上下文的JavaScript应用Web API消费者的重要组成部分。“同源策略”限制了JavaScript的跨站点调用,这必然导致Web API不能垮域提供资源。如果Web API仅限于为“同源客户端”提供资源,那么它都对不起自己的名字,因为Web本身是一个开放的协议。那么ASP.NET Web API通过怎样的方式来实现跨域资源共享呢? 同源策略 浏览器是访问Internet的工具,也是客户端应用的宿主,它为客户端应用提供一个寄宿和运行的环境。
蒋金楠
2018/01/15
1.1K0
[CORS:跨域资源共享] 同源策略与JSONP
使用谷歌标准api时protobuf生成遇到的问题
在vscode时新增proto文件时,按下sr会出现一个快捷生成CRUD服务的例子
天地一小儒
2022/12/28
1.9K0
使用谷歌标准api时protobuf生成遇到的问题
API,打开“共享之门”的最好钥匙
我们经常听到开发人员讨论API。API与APP一词看上去很相似,对于APP我们很熟悉,即是应用程序Application的缩写,随着智能手机的普及这一词成了手机软件的代称。但是API又是什么呢? AP
BestSDK
2018/03/01
1K0
API,打开“共享之门”的最好钥匙
C#调用腾讯云文本翻译API,使用V3签名报错。
"Error":{"Code":"AuthFailure.SignatureFailure","Message":"The provided credentials could not be validated. Please check your signature is correct."
用户9018380
2021/09/20
2K0
Contact Manager Web API 示例[3] 分页和查询(Paging and Querying)
联系人管理器web API是一个Asp.net web api示例程序,演示了通过ASP.NET Web API 公开联系信息,并允许您添加和删除联系人,示例地址http://code.msdn.microsoft.com/Contact-Manager-Web-API-0e8e373d。 Contact Manager Web API 示例[1]CRUD 操作 已经做了一个基本的介绍, Contact Manager Web API 示例[2] Web API Routing 介绍Web API Rout
张善友
2018/01/22
1.4K0
点击加载更多

相似问题

List vs ArrayList vs Dictionary vs Hashtable vs Stack vs Queue?

30

innerText vs innerHTML vs label vs text vs textContent vs outerText

665

.c vs .cc vs .cpp vs .hpp vs .h vs .cxx

64

Exec vs ExecWait vs ExecShell vs nsExec::Exec vs nsExec::ExecToLog vs nsExec::ExecToStack vs ExecDos vs ExeCmd

25

bundler vs RVM vs gem vs RubyGems vs gemsets vs system ruby

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文