首页 > 解决方案 > using 语句是否保留对它接收到的对象的引用?

问题描述

当使用这样的“使用”语句时:

  using (Global.Instance.BusyLifeTrackerStack.GetNewLifeTracker())
  {
    ...

代替

  using (var lt = Global.Instance.BusyLifeTrackerStack.GetNewLifeTracker())
  {
    ...

“使用”语句是否会保留对返回对象的引用,以确保不会过早地对其进行垃圾收集?...如果没有为它声明显式变量(第一个示例代码)?

第二个示例代码显然很好,但第一个?

任何文档和/或对信息的引用将不胜感激。

标签: c#referencegarbage-collectionusingidisposable

解决方案


是的,保留了一个真实的引用,以便Dispose可以在最后调用该方法。当您不需要显式访问using块内的一次性对象时,此模式通常用于在处置中执行某种“副作用”。例如,在 Razor 中using(Html.BeginForm){...}允许处理返回的对象以</form>在末尾输出标签。

C# 中的一个简单示例是:

public class MessageGenerator : IDisposable
{
    public MessageGenerator()
    {
        Console.WriteLine("To whom it may concern,");
    }
    
    public void Dispose()
    {
        Console.WriteLine("Thanks and goodbye.");
    }
}

和这样的用法:

using (new MessageGenerator())
{
    Console.WriteLine("Please give me lots of reputation.");
}

会给出这样的输出:

敬启者,

请给我很多声望

谢谢,再见。


推荐阅读