ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C# 使用 using 确保对象被处理

2022-05-29 08:31:46  阅读:152  来源: 互联网

标签:语句 FS C# SW FileStream 确保 using byte


C# 使用 using 语句确保对象引用的外部资源被释放

问题

当一个对象的工作完成或者超出作用域时,您需要采用一种方式确保一些处理得到执行。

解决方法

使用 using 语句,代码片段如下所示。

using System;
using System.IO;
using(FileStream FS = new FileStream("Test.txt", FileMode.Create))
{
FS.WriteByte((byte)1);
FS.WriteByte((byte)2);
FS.WriteByte((byte)3);
{
SW.WriteLine("some text.");
}
}

代码讲解

using ()语句非常易于使用,并且可以避免编写多余代码的麻烦。如果解决方案中没有使用 using 语句,将会如下所示。

FileStream FS = new FileStream("Test.txt", FileMode.Create);
try
{
FS.WriteByte((byte) 1);
FS.WriteByte((byte) 2);
FS.WriteByte((byte) 3);
StreamWriter SW = new StreamWriter(FS);
try
{
SW.WriteLine("some text.");
}
finally
{
if(SW != null)
{
((IDisposable) SW).Dispose();
}
}
}
finally
{
if(FS != null)
{
((IDisposable) FS).Dispose();
}
}

关于 using 语句,需要注意以下几点。
• 存在一个 using 指令,如下所示。应将其与 using 语句区分开。这可能会使初次接触这一语言的开发人员混淆。
using System.IO;
• using 语句的子句中定义的变量都必须具有相同的类型,并且必须具有一个初始化器。不过,因为可以在单个代码块前使用多个 using 语句,所以这并不是一个重大的限制。
• using 子句中定义的变量在 using 语句体中被认为是只读的。这可以阻止开发人员在尝试处置变量最初引用的对象时无意中将变量转变成引用不同的对象,避免引发问题。
• 不应该在 using 块外声明变量,然后在 using 子句内初始化它。
下面的代码说明了最后一点。

FileStream FS;
using(FS = new FileStream("Test.txt", FileMode.Create))
{
FS.Writebyte((byte)1);
FS.Writebyte((byte)2);
FS.Writebyte((byte)3);
using(StreamWriter SW = new StreamWriter(FS))
{
SW.WriteLine("some text.");
}
}

对于这段示例代码来说,不会有任何问题。但是,要考虑到变量 FS 是可以在 using 块外使用的。实际上,可以将这段代码修改为下面这样。

FileStream FS;
using(FS = new FileStream("Test.txt", FileMode.Create)) 
{
	FS.Writebyte((byte)1);
	FS.Writebyte((byte)2);
	FS.Writebyte((byte)3);
	using(StreamWriter SW = new StreamWriter(FS)) 
	{
		SW.WriteLine("some text.");
	}
}
FS.Writebyte((byte)4);

这段代码可以编译,但会在这个代码段的最后一行上引发一个 ObjectDisposedException ,因为已经对 FS 对象调用了 Dispose 方法。对象此时还没有被垃圾回收,仍然以被处置过的状态存在于内存中。

参考

标签:语句,FS,C#,SW,FileStream,确保,using,byte
来源: https://www.cnblogs.com/netlog/p/16322841.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有