![](/img/trans.png)
[英]c# using lambda to check if an object is of a certain dynamic type (passed via a parameter)
[英]Using statement on object passed via parameter
尋求正確使用 C# using 語句的最佳輸入。 我可以在參數對象上使用using
語句,如以下不常見的示例代碼片段(即,多層應用程序)?
盡管代碼片段與我認為 using 語句應該在“Business”類的ProcessFileAndReturnNumberFromStream()
方法中的不同。
為什么在通過參數傳遞的對象上使用 using 語句是一種不常見的做法? 請更正或詳細說明缺陷?
using System;
using System.IO;
class Data
{
public double? GetNumberFromStream(StreamReader sr)
{
double? number;
try
{
using (sr)
{
number = Convert.ToDouble(sr.ReadToEnd());
return number;
}
}
finally
{
number = null;
}
}
}
class Business
{
public double? ProcessFileAndReturnNumberFromStream()
{
string fileName = "Test.txt";
StreamReader sr = new StreamReader(fileName);
Data dat = new Data();
return dat.GetNumberFromStream(sr);
}
}
class GUI
{
static void Main()
{
Business bus = new Business();
double? number = bus.ProcessFileAndReturnNumberFromStream();
Console.WriteLine(number);
Console.ReadKey();
}
}
請幫忙。
謝謝
如果向方法傳遞了一個實現IDisposable
的對象,則管理該對象的生命周期通常是調用者的責任,而不是被調用者。
public double? ProcessFileAndReturnNumberFromStream()
{
string fileName = "Test.txt";
Data dat = new Data();
using (StreamReader sr = new StreamReader(fileName))
{
return dat.GetNumberFromStream(sr);
}
}
傳遞 IDisposable 實例的調用者應該是使用using
語句的調用者。 如果被調用者使用它,對象將在“擁有”對象的調用者的直接控制之外被釋放。
我可以在參數對象上使用 using 語句,如以下不常見的示例代碼片段(即,多層應用程序)?
你可以,但這樣做通常很奇怪。 通常,創建StreamReader
任何內容都希望“擁有”它並在完成后處理它。 您的ProcessFileAndReturnNumberFromStream
方法更常見的是:
using (StreamReader sr = new StreamReader(fileName))
{
Data dat = new Data();
return dat.GetNumberFromStream(sr);
}
(雖然我個人會使用File.OpenText
而不是顯式構造StreamReader
。)
您的GetNumberFromStream
方法將不需要using
語句。 它也根本不需要try/finally
塊 - 這是一個奇怪的實現,因為它永遠不會返回 null,要么......
同樣奇怪的是,您正在創建Data
的新實例,然后什么都不做——因為您的GetNumberFromStream
方法不使用實例變量或覆蓋基類方法,您應該考慮將其設為靜態。
這樣的API會非常麻煩。
您永遠不會知道傳遞給方法的對象是否在方法內部處理。 因此,如果這是您創建對象並將其傳遞到那里,您也永遠不會知道是否應該處理您剛剛創建並傳遞給方法的對象。
我想,雖然這在技術上是可行的,但它會促進糟糕的編程風格。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.