簡體   English   中英

在通過參數傳遞的對象上使用語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM