在正确使用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();
}
}
请帮忙。
由于
答案 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会非常麻烦。
您永远不会知道传递给方法的对象是否放置在方法内部。因此,如果您是创建对象并将其传递给那里的人,那么您也永远不会知道是否应该处置刚刚创建并传递给方法的对象。
我想,虽然这在技术上是可行的,但它会促进糟糕的编程风格。