C#中Dispose和Close的区别

C#中Dispose和Close的区别,第1张

1、功能

Close方法可以关闭一个连接,而Dispose方法不仅关闭一个连接,而且还清理连接所占用的资源。

2、便捷

Close后可以使用Open再次打开数据库连接,而Dispose后不能直接使用Open,而需要重新创建一个SQLConnection对象。使用完数据库,需要关闭与数据库的连接,释放占用的资源。通过调用SqlConnection对象的Close方法或Dispose方法可以关闭数据库连接。

C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性。C#综合了VB简单的可视化 *** 作和C++的高运行效率,以其强大的 *** 作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为,NET开发的首选语言。

C#是面向对象的编程语言。它使得程序员可以快速地编写各种基于MICROSOFT .NET平台的应用程序,MICROSOFT .NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。

扩展资料:

C#数据类型:

1、两个基本类:

一个名叫object的类是所有其他类的基类。而一个名叫string的类也象object一样是这个语言的一部分.作为语言的一部分存在意味着编译器有可能使用它,无论何时在程序中写入一句带引号的字符串,编译器会创建一个string对象来保存它。

2、参数传递:

方法可以被声明接受可变数目的参数.缺省的参数传递方法是对基本数据类型进行值传递。ref关键字可以用来强迫一个变量通过引用传递,这使得一个变量可以接受一个返回值。out关键字也能声明引用传递过程,与ref不同的地方是,它指明这个参数并不需要初始值。

3、索引下标:

一个索引与属性除了不使用属性名来引用类成员而是用一个方括号中的数字来匿名引用(就象用数组下标一样)以外是相似的。

参考资料来源:百度百科-c#

很多人都认为Close()方法内部会调用Dispose()方法,所以并没有本质的区别!实际上这个看法不是很准确,对有

些类来说,的确Close()和Dispose()没有本质区别,但是对有些类来说并非如此!

首先,让我们看看我们最常使用的SqlConnection的Close()方法和Dispose()方法的区别:

SqlConnection类的Dispose()方法是继承于Component类的,源代码是这样的:

public void Dispose() {

Dispose(true)//调用Dispose的一个带参数的重载

GC.SuppressFinalize(this) //请求系统不要调用指定对象的终结器。

}

protected virtual void Dispose(bool disposing) {

if (disposing) {

lock(this) {

if (site != null &&site.Container != null) {

site.Container.Remove(this)

}

if (events != null) {

EventHandler handler = (EventHandler)events[EventDisposed]

if (handler != null) handler(this, EventArgs.Empty)

}

}

}

}

SqlConnection类的Close()方法在MSDN中的说明是这样的:

关闭与数据库的连接。这是关闭任何打开连接的首选方法。 如果 SqlConnection 超出范围,则不会将其关闭。因

此,必须通过调用 Close 或 Dispose 显式关闭该连接。Close 和 Dispose 在功能上等效。如果连接池值

Pooling 设置为 true 或 yes,则基础连接将返回到连接池。另一方面,如果 Pooling 设置为 false 或 no,则

会关闭到服务器的基础连接。

看说明好象是Close()方法和Dispose()方法是类似的,实际上只是在关闭连接这个功能上等效,让我们看看Close

()方法的源代码:

override public void Close() {

IntPtr hscp

Bid.ScopeEnter(out hscp, "<sc.SqlConnection.Close|API>%d#" , ObjectID)

try {

SqlStatistics statistics = null

RuntimeHelpers.PrepareConstrainedRegions()

try {

#if DEBUG

object initialReliabilitySlotValue = Thread.GetData(TdsParser.ReliabilitySlot)

RuntimeHelpers.PrepareConstrainedRegions()

try {

Thread.SetData(TdsParser.ReliabilitySlot, true)

#endif //DEBUG

statistics = SqlStatistics.StartTimer(Statistics)

// The lock here is to protect against the command.cancel / connection.close

race condition

// The SqlInternalConnectionTds is set to OpenBusy during close, once this

happens the cast below will fail and

// the command will no longer be cancelable. It might be desirable to be

able to cancel the close opperation, but this is

// outside of the scope of Whidbey RTM. See (SqlCommand::Cancel) for other

lock.

lock (InnerConnection) {

InnerConnection.CloseConnection(this, ConnectionFactory)

}

// does not require GC.KeepAlive(this) because of OnStateChange

if (null != Statistics) {


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9945676.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存