繁体   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