[英]Cannot get rid of CA2202 warning
我已閱讀以下內容的MSDN頁面: https : //msdn.microsoft.com/en-us/library/ms182334.aspx
還有這個答案: https : //stackoverflow.com/a/32554589/2257227
但是以下代碼仍然為我生成2條CA2202警告:
FileStream fileStream = null;
BufferedStream bufferedStream = null;
try
{
fileStream = File.Open(...);
bufferedStream = new BufferedStream(fileStream);
using (StreamReader streamReader = new StreamReader(bufferedStream))
{
...
}
}
finally
{
if (bufferedStream != null)
{
bufferedStream.Dispose();
}
if (fileStream != null)
{
fileStream.Dispose();
}
}
“ bufferedStream.Dispose()”行仍然給出以下兩個警告:
嚴重性代碼說明項目文件行抑制狀態警告CA2202在方法'Loader.UpdateIndex()'中可以多次處理對象'bufferedStream'。 為了避免生成System.ObjectDisposedException,您不應在對象上調用Dispose多次。:行:930 Loader C:\\ Users \\ user \\ Loader \\ Loader.cs 930有效
和
嚴重性代碼說明項目文件行抑制狀態警告CA2202在方法'Loader.UpdateIndex()'中可以多次處理對象'fileStream'。 為了避免生成System.ObjectDisposedException,您不應在對象上調用Dispose多次。:行:930,935 Loader C:\\ Users \\ user \\ Loader \\ Loader.cs 930有效
大概是因為fileStream可以被處置多次? 但是如何將bufferedStream處理一次以上呢?
編輯:我已將@Damien_The_Unbeliever的答案標記為正確。 實際上,您也可以縮小它,因為正如下面提到的那樣,您不需要bufferedReader變量。 這就是我最后得到的。 有點丑陋,但是可以用:
FileStream fileStream = null;
try
{
fileStream = File.Open("iaushdiuh", FileMode.Open);
fileStream = null;
using (StreamReader streamReader = new StreamReader(fileStream))
{
streamReader.ReadLine();
}
}
finally
{
if (fileStream != null)
{
fileStream.Dispose();
}
}
如果您已將這些對象的“所有權”傳遞給其他對象后不使用基礎流,則可以像這樣靜默警告:
FileStream fileStream = null;
BufferedStream bufferedStream = null;
try
{
fileStream = File.Open(...);
bufferedStream = new BufferedStream(fileStream);
fileStream = null;
using (StreamReader streamReader = new StreamReader(bufferedStream))
{
bufferedStream = null;
...
}
}
finally
{
if (bufferedStream != null)
{
bufferedStream.Dispose();
}
if (fileStream != null)
{
fileStream.Dispose();
}
}
您將希望分配為null
在構造函數調用“立即擁有”一次性對象之后立即發生。 這樣,您可以確保如果構造函數throw ,則可以處置內部對象,並且如果構造函數成功,則它將安排發生處置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.