avatar
弱问c# using, try有啥用# DotNet - 窗口里的风景
S*e
1
本人低手,完全靠抄抄改改过日
C# 连接数据库很多人的程序
用using, try
我发现不用也可以
请高人说说为啥要用这两个
谢谢
avatar
a*a
2
Using 是为用完了及时释放和数据库的连接(等Garbage Collector 来释放资源不如手
动来得迅速)。try是怕连接失败吧。
avatar
y*7
3
using其实就是一个short版的try final 在final里,会call被wrap的object的Dispose
方法。其实就是让你可以少code一点。
所有资源的释放,还是走的GC。所以一般来说不是caller可以控制的。
try 是用来抓exception,如果你这里不抓,就会bubble up。而如果bubble up的时候
,你的object hold了其他资源(如IO口,DB connection什么的),会造成resource
leak
avatar
S*e
4
谢谢
释放链接就是
con.Close();吗?
也就是using不用这个就能释放是吧?

【在 a*****a 的大作中提到】
: Using 是为用完了及时释放和数据库的连接(等Garbage Collector 来释放资源不如手
: 动来得迅速)。try是怕连接失败吧。

avatar
S*e
5
谢谢
对于简单的数据库应用
假设就是往里面insert一行
在真正的网站应用中,除非服务器down掉
应该不会出现exception吧

Dispose

【在 y*****7 的大作中提到】
: using其实就是一个short版的try final 在final里,会call被wrap的object的Dispose
: 方法。其实就是让你可以少code一点。
: 所有资源的释放,还是走的GC。所以一般来说不是caller可以控制的。
: try 是用来抓exception,如果你这里不抓,就会bubble up。而如果bubble up的时候
: ,你的object hold了其他资源(如IO口,DB connection什么的),会造成resource
: leak

avatar
a*a
6
我怎么记得如果实现了IDisposible,并调用object.Dispose(),则会释放资源。并不是
所有资源都走GC.

Dispose

【在 y*****7 的大作中提到】
: using其实就是一个short版的try final 在final里,会call被wrap的object的Dispose
: 方法。其实就是让你可以少code一点。
: 所有资源的释放,还是走的GC。所以一般来说不是caller可以控制的。
: try 是用来抓exception,如果你这里不抓,就会bubble up。而如果bubble up的时候
: ,你的object hold了其他资源(如IO口,DB connection什么的),会造成resource
: leak

avatar
d*d
7
这个取决于具体的IDisposible.Dispose是怎么实现的

【在 a*****a 的大作中提到】
: 我怎么记得如果实现了IDisposible,并调用object.Dispose(),则会释放资源。并不是
: 所有资源都走GC.
:
: Dispose

avatar
s*o
8
I think it depends on implementation. Dispose() is more for releasing
unmanaged resources.

【在 a*****a 的大作中提到】
: 我怎么记得如果实现了IDisposible,并调用object.Dispose(),则会释放资源。并不是
: 所有资源都走GC.
:
: Dispose

avatar
c*t
9
用了using 就不再需要 .close()

【在 S****e 的大作中提到】
: 谢谢
: 对于简单的数据库应用
: 假设就是往里面insert一行
: 在真正的网站应用中,除非服务器down掉
: 应该不会出现exception吧
:
: Dispose

avatar
y*7
10
分几层说吧:
1. using会在complie的时候自动扩展成try finally。如果被wrap的object implement
了IDisposal interface,就会在finally 里call这个object的dispose() method.然后
,using的任务完成了‘
2. 在dispose method里,具体的实现来完成具体的工作。例如是db connection的话,
dispose会call close把链接关掉(大多数的情况下其实是把connection返回给pool)
。这样,从caller的角度来看,你已经把resource release了。
3. resource 分成manager的和unmanager的。manager一般就是.NET的object,
unmanage的一般是各种resource的handler,如db的链接,io的链接。对于manage的,一
般就是把他mark成没有reference了,这样下次GC运行的时候就可以清掉了。 好像有个
method叫GC.Supress什么,这个好像是主动运行GC。这块我也不是非常清楚,不过,好
像也还是一个suggestion,GC动不动,里面还有算法的。
4. 对于unmanage的resource,一般是通过一个.net的object wrapper来管理。当你
call dispose的时候,这个object的dispose method 负责call具体的resource的close
method来清理内存什么的。
5.有时候你可能会用到destructor。这个应该是极不推荐的,具体的可以看看CLR via
C#。那里有很好的例子
avatar
y*7
11
不一定,比如说定义了一个foreign key,但插入的数据违反了这个key,就会有
SqlException

【在 S****e 的大作中提到】
: 谢谢
: 对于简单的数据库应用
: 假设就是往里面insert一行
: 在真正的网站应用中,除非服务器down掉
: 应该不会出现exception吧
:
: Dispose

avatar
v*n
12
一点小更正:using里面的type必须实现IDisposable
avatar
a9
13
显式gc需要调用Gc.Collection()

时候
resource

【在 a*****a 的大作中提到】
: 我怎么记得如果实现了IDisposible,并调用object.Dispose(),则会释放资源。并不是
: 所有资源都走GC.
:
: Dispose

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。