C#使用Swift中的Statement等效语句

时间:2016-12-30 09:10:56

标签: c# swift

我对Swift语言很新,我有一个C#背景。

我想知道在swift语言中是否存在C#using语句的等效代码

using( var a = new MyClass()){
//Code Here
}

2 个答案:

答案 0 :(得分:5)

Swift的自动引用计数保证了确定性的deinitalization(与CLR的垃圾收集器不同),因此您可以在类deinit方法中清理代码。这与C ++中的RAII完全相同。即使抛出异常,此技术仍然有效。

class MyClass() {
    var db = openDBConnection() //example resource

    deinit() {
        db.close()
    }
}

func foo() {
    var a = MyClass()
    print(a) // do stuff with a

    // the (only) reference, a, will go out of scope,
    // thus the instance will be deinitialized.
}

您还可以使用延迟声明:

var a = MyClass()
defer { a.cleanUp() /* cleanup a however you wish */ }

您失去了使用像IDisposable这样的界面的标准化,但是您可以通过执行任何您想要的代码获得通用性。

答案 1 :(得分:1)

刚刚学习Swift并提出了同样的问题。

我能得到的最接近的是:

   if let UOW = (try UnitOfWork() as UnitOfWork?)
   {


   }

这是一个关于可选绑定的攻击,但似乎有效。你需要确保你的班级有一个deinit定义为亚历山大上面提到的。我发现即使我的init抛出异常,只要你退出IF语句的范围,仍然会调用deinit方法。

注意:如果适用,请确保使用弱引用,以确保您的deinit实际被调用!

使用DO块进行范围界定可能更加快速:

do
{
    let UOW = try UnitOfWork()
    // your code here
}

这有利于避免使用伪使用块的“厄运金字塔”(就像你将进入c#)