![](/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.