C#,像golang那样'Defer Call'吗?

ekf*_*ame 4 c# destructor

golang支持'Defer Call'和c ++,我使用这个技巧(?).

struct DeferCall
{
   DeferCall() {}
   ~DeferCall() { doSomeThing(); }
}

void SomeMethod()
{
    DeferCall deferCall;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能在c#中做到这一点?

我需要像这个golang defer教程

sch*_*tbi 13

您可以使用System.Reactive.Disposables.Disposable来实现此目的

void Function()
{
    string fileName = "InputFile.txt";
    using var defer = Disposable.Create(() => { File.Delete(fileName); });

    WriteFile(fileName);
    ConvertFile(fileName, "OutputFile.txt");
}
Run Code Online (Sandbox Code Playgroud)


Den*_*nis 10

最接近的语言将是try-finally:

try
{
    DoSomething();
}
finally
{
    DoCleanup();
}
Run Code Online (Sandbox Code Playgroud)

最近的框架等价物将是IDisposable+ using:

using (var stream = File.OpenRead("foo.txt"))
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

就个人而言,defer术语让我感到困惑,因为这不是 "延期执行"(现在安排 - 稍后执行,可以通过任务实施),而是某种RAII实施.

PS假设你将继续学习golang:


Mri*_*boj -4

我从这里Defer Call获取GoLang了以下定义

defer 语句将函数调用推送到列表上。保存的调用列表在周围函数返回后执行。Defer 通常用于简化执行各种清理操作的函数。

C# 版本:

选项1:

  • 使用TaskAPI
  • 将你的DeferCall方法包装在Task
  • 在正确的时间执行,或者手动使用Start()方法,或者对于要继续的函数发布,将其包装在另一个任务对象中并使用ContinueWithAPI 执行,这将链接任务一个接一个地执行

选项2:

  • 可以使整个调用链Async-Await,其中所有 postawait关键字都在主调用完成时执行,这是标准的异步实现

  • 我也是一个反对者。很明显,C# 中的 defer-panic-recover 是 finally-throw-catch。这与任务有何关系?您是否在 C# 代码中使用任务来执行清理?为什么您读到“延迟”一词,但从您提到的链接中省略了整个句子? (2认同)