gpt4 book ai didi

c# - 返回一个用于 using block 的 Disposable 对象

转载 作者:行者123 更新时间:2023-11-30 19:07:37 30 4
gpt4 key购买 nike

如何在我的函数中返回一次性对象以确保它在 using block 中正常工作?在我的函数中,我想对一次性对象进行操作并考虑错误,这使事情变得复杂。

到目前为止,我有类似于以下代码的内容:

DBHandle GetDB()
{
/* // I can't do this, because the using block would dispose of my object within this function
using( var db = DatabaseObj.GetHandle() )
{
db.Open();
return db;
}
*/
var db = DatabaseObj.GetHandle();
try
{
db.Open();
return db;
}
catch (Exception ex)
{
db.Dispose();
throw ex;
}
}

// In other code:
using( var obj = GetDB() ){ /* ... */ }

编辑:Posted a more general question与此类似,以免混淆答案和讨论。

最佳答案

提示:从 using-block 返回一次性对象时,请记住在执行返回语句时完成对 Dispose() 的调用!!!

因此从 using block 中返回的对象在从函数中出来时就已经被释放了。

例子见下面的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class MyDisposable : IDisposable
{
public void DoSomething()
{
Console.WriteLine(" In DoSomething");
}

#region IDisposable Members

public void Dispose()
{
Console.WriteLine(" In Dispose");
}

#endregion
}

class Program
{
static void Main(string[] args)
{
Console.WriteLine("Starting Main\n");

Console.WriteLine("Before NormalMethod");
NormalMethod();
Console.WriteLine("After NormalMethod\n");

Console.WriteLine("Before ReturningMethod");
MyDisposable m = ReturningMethod();
m.DoSomething(); // Here the object already has been disposed!
Console.WriteLine("After ReturningMethod\n");

}

private static void NormalMethod()
{
using (MyDisposable myDisposable = new MyDisposable())
{
Console.WriteLine(" In NormalMethod");
}
return;
}

private static MyDisposable ReturningMethod()
{
using (MyDisposable myDisposable = new MyDisposable())
{
Console.WriteLine(" In ReturningMethod");
return myDisposable;
}
}
}
}

这将产生以下输出:

enter image description here

关于c# - 返回一个用于 using block 的 Disposable 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4220039/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com