c# - 如何实例化对象并将其传递给 "using" block 声明中的方法

标签 c# .net idisposable

我正在使用一个实现 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/

相关文章:

C# 内存使用过多

c# - 我可以在 LINQ 语句中包含方法调用吗?

c# - 具有底层字节类型的枚举在开关中失败

c# - 使用 ? 时出现 CA2213 警告。 (空条件运算符)调用 Dispose

c# - C# DataTable 中 DataColumn 的约束?

C# 搜索一个大单词列表

c# - 如何正确实现 IDisposable

c# - 数组索引器签名返回对象 - 它是否装箱?

C# - 字符串问题中的字符串?

c# - KerberosRequestorSecurityToken 的 .Net 核心等效项是什么?