使用通过参数传递的对象语句

时间:2013-12-28 11:15:48

标签: c#

在正确使用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();
    }
}

请帮忙。

由于

4 个答案:

答案 0 :(得分:1)

  

我是否可以在参数对象上使用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方法不使用实例变量或覆盖基类方法,你应该考虑让它静止。

答案 1 :(得分:1)

如果一个方法传递了一个实现IDisposable的对象,那么 通常负责管理该对象的生命周期,而不是被调用者。

public double? ProcessFileAndReturnNumberFromStream()
{
    string fileName = "Test.txt";
    Data dat = new Data();

    using (StreamReader sr = new StreamReader(fileName))
    {
        return dat.GetNumberFromStream(sr);  
    }
 }

答案 2 :(得分:1)

传递IDisposable实例的调用者应该是使用using语句的调用者。如果被调用者使用它,则该对象将被置于“拥有”该对象的调用者的直接控制之外。

答案 3 :(得分:0)

这样的API会非常麻烦。

您永远不会知道传递给方法的对象是否放置在方法内部。因此,如果您是创建对象并将其传递给那里的人,那么您也永远不会知道是否应该处置刚刚创建并传递给方法的对象。

我想,虽然这在技术上是可行的,但它会促进糟糕的编程风格。