我正在使用一个实现 IDisposable 的外部类和一个填充该类实例的外部方法。
我正在寻找一种巧妙的方法来将一次性对象封装在“using”语句中,但无法计算出语法。
假设该类是...
class Something : IDisposable
函数是...
void PopulateSomething(Something theObject)
我可以做到这一点...
Something myObject = new Something();
PopulateSomethingObject(myObject);
x = myObject.SomeNumber;
myObject.Dispose();
或者我也可以这样做...
Something myObject = new Something();
using(myObject)
{
x = myObject.SomeNumber;
}
但以上都不是很好,因为处理后我可以愚蠢地写出这样的东西
x = myObject.SomeNumber; // which will throw an exception
我想我可以做到这一点......
using(Something myObject = new Something())
{
PopulateSomethingObject(myObject);
x = myObject.SomeNumber();
}
但是我想相信像下面这样的事情是可能的,但我无法弄清楚语法......
using (Something myObject => PopulateSomethingObject(myObject = new Something()))
{
x = myObject.SomeNumber();
}
我想这是一个理论问题,因为我在这里并没有真正的问题,但我很想知道这是否可能。即实例化对象并将其传递给“using(...){} block 声明中的方法。
最佳答案
这是你可以做的
private Something CreateAndPopulate()
{
var myObject = new Something();
PopulateSomethingObject(myObject);
return myObject;
}
然后像这样使用它:
using (var myObject = CreateAndPopulate())
{
x = myObject.SomeNumber();
}
更新1
另一种方法是为 Something
编写扩展,例如
public static class SomethingExtension
{
public static Something Populate(this Something someObj, Action<Something> actionToPopulate)
{
actionToPopulate.Invoke(someObj);
return someObj;
}
}
然后在一行中使用它,例如:
using (var myObject = new Something().Populate(PopulateSomethingObject))
{
x = myObject.SomeNumber();
}
更新2 最后,单行方法可能看起来很复杂
using (var myObject = new Func<Something>(() =>
{
var myNewObject = new Something();
PopulateSomethingObject(myNewObject);
return myNewObject;
}).Invoke())
{
//x = myObject.SomeNumber();
}
关于c# - 如何实例化对象并将其传递给 "using" block 声明中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36620680/