实用性的两个类都是一次性的。
我理解使用块的功能。但我不确定它能够或需要使用的所有方式。
例如这是正确的吗?
using (MyClass myClass = new MyClass(params))
{
myClass.name = "Steve";
SecondClass myClassSecond = new SecondClass(params);
myClassSecond.name = "George";
myClassSecond.msg = "Hello Man in the Yellow Hat";
}
上述两个类都被处理掉了吗?
或者我在使用声明中是否需要两者?
using (MyClass myClass = new MyClass(params))
{
myClass.name = "Steve";
using (SecondClass myClassSecond = new SecondClass(params))
{
myClassSecond.name = "George";
myClassSecond.msg = "Hello Man in the Yellow Hat";
}
}
以上是否正确,或者是否有更好的方法来使用多个using语句?
答案 0 :(得分:3)
你的第二个例子是正确的,假设SecondClass确实是不可能的。如果是第一个例子则不正确,因为mySecondClass不会被处理掉。如果一段代码控制一次性实例的生命周期,它应该总是处理它。
仅供参考我更喜欢这种风格在同一个区块中处理多个对象,因为我觉得它更具可读性。
using (MyClass myClass = new MyClass(params))
using (SecondClass myClassSecond = new SecondClass(params))
{
myClassSecond.name = "George";
myClassSecond.msg = "Hello Man in the Yellow Hat";
}
两个usings
共享相同的范围,并按声明的相反顺序进行处理。
答案 1 :(得分:3)
当您使用实现IDisposable
接口的任何内容时,使用块非常方便。 MSDN:
[using Statement]定义范围,在该范围之外将放置一个或多个对象。
所以,这些实际上相当于
IDisposable resource = new Whatever();
try {
// whatever
}
finally {
resource.Dispose();
}
using
的主要优点是:它会在离开using
块时自动处理对象,因此(1)您不会忘记这样做;(2)它会进行清理例外情况。
简短规则:
using
块中执行此操作。 IDisposable
,在构造函数中实例化资源,在Dispose
中进行清理。答案 2 :(得分:3)
using
语句允许程序员指定何时使用资源的对象应该释放它们。 IDisposable
接口。Dispose
方法,该方法应释放对象的资源。以下是显示使用using语句的示例:
using System;
//Object of this class will be given to using hence IDisposable
class C : IDisposable
{
public void UseLimitedResource()
{
Console.WriteLine("Using limited resource...");
}
//Dispose() Method
void IDisposable.Dispose()
{
Console.WriteLine("Disposing limited resource.");
}
}
class Program
{
static void Main()
{
using (C c = new C()) //Object of Class defined above
{
c.UseLimitedResource();
//Object automatically disposed before closing.
}
Console.WriteLine("Now outside using statement.");
Console.ReadLine();
}
}
在以下情况下可以退出using语句:
using
语句的结尾或哪种方法适当?
正如你所说的那样
实用性方面的两个类都是一次性的
。然后你的第二种方法是合适的。那就是:
using (MyClass myClass = new MyClass(params))
{
myClass.name = "Steve";
using (SecondClass myClassSecond = new SecondClass(params))
{
myClassSecond.name = "George";
myClassSecond.msg = "Hello Man in the Yellow Hat";
}
}
答案 3 :(得分:2)
使用块不会自动处理实现IDisposable
的任何子对象。如果您希望它们被丢弃,您必须使用块包裹内部一次性物品。但是,你有一些不同的选择。
您可以使用块嵌套多个,并且它们在最内部到最外部进行评估。有一种更好的方法可以做到这一点,但以下示例有效:
using (MyClass myClass = new MyClass(parameters))
{
using (SecondClass myClassSecond = new SecondClass(parameters))
{
myClassSecond.name = "George";
myClassSecond.msg = "Hello Man in the Yellow Hat";
}
}
如果声明是连续的,并且您不需要在两者之间执行任何操作,则以下语法更简洁:
using (MyClass myClass = new MyClass(parameters))
using (SecondClass myClassSecond = new SecondClass(parameters))
{
myClassSecond.name = "George";
myClassSecond.msg = "Hello Man in the Yellow Hat";
}
如果你需要在声明之间做一些事情,那么你的后一个例子是正确的:
using (MyClass myClass = new MyClass(parameters))
{
myClass.name = "Steve";
using (SecondClass myClassSecond = new SecondClass(parameters))
{
myClassSecond.name = "George";
myClassSecond.msg = "Hello Man in the Yellow Hat";
}
}
答案 4 :(得分:0)
我的经验法则是......如果它实现了idisposable,我会使用一个使用块。
总是比抱歉更安全。
要回答你的问题,我会选择第二种选择。
答案 5 :(得分:0)
简单的答案是,如果类有一个dispose方法,请使用。
http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx
如果没有,则不需要。
http://msdn.microsoft.com/en-us/library/system.random.aspx
我一直希望在MSDN文档中更多的是你。在一天结束时,它是实现IDisposable的类,但实际上我想要的是页面上某种巨大的图标,以某种方式说。 '注意假人!你必须自己管理!'
答案 6 :(得分:0)
using
块纯粹是一种处理IDisposable对象的语法简单方法。如果您了解using
的作用,那么您应该了解它是如何使用的。
请参阅此问题以确切了解using
块的内容:
Uses of "using" in C#
答案 7 :(得分:0)
这取决于这些类是什么以及它们如何处置它们使用的任何资源。 using
语句与try/finally
块(无catch
)基本相同,它在finally
块中处理其资源(通过调用.Dispose()
on有问题的对象。)
所以,首先,如果有问题的类没有实现IDisposable
那么这是一个没有实际意义的点,你不能在using
块中使用它在这种情况下。如果它 实现IDisposable
,那么由于某种原因它可能会这样做,并且当你完成它时应该在该对象上调用.Dispose()
。在这些情况下,谨慎地将其包裹在using
块中以保证处置。 (好吧,“保证”就会执行finally
块。这通常是 的情况,除非发生了更糟糕的事情。)
答案 8 :(得分:0)
我喜欢在我创建的类中实现IDisposable
,如果他们使用大量资源,或者我将其创建为文件处理或网络资源的包装器。
在我使用的类对象中,我认为如果有问题的对象打开文件,创建网络连接等,使用using
块调用很重要。
一些开发人员会编写一个实现IDisposable
的类,这样他们就可以将代码置于更清晰的using
块中,但我认为这会滥用创建Disposable的原因。