c# - D 的作用域失败/成功/退出是否必要?

标签 c# c++ d

当使用具有 try/catch/finally 的语言时,D 的失败/成功/退出范围语句仍然有用吗? D 似乎没有 finally 这可以解释为什么在 D 中使用这些语句。但是对于像 C# 这样的语言,它有用吗?我正在设计一种语言,所以如果我看到很多专业人士,我会添加它。

最佳答案

scope(X) 不是必需的,就像 for 一样,只要您有 if转到

下面是我今天写的一些代码的转述示例:

sqlite3* db;
sqlite3_open("some.db", &db);
scope(exit) sqlite3_close(db);

sqlite3_stmt* stmt;
sqlite3_prepare_v2(db, "SELECT * FROM foo;", &stmt);
scope(exit) sqlite3_finalize(stmt);

// Lots of stuff...

scope(failure) rollback_to(current_state);
make_changes_with(stmt);

// More stuff...

return;

将此与使用 try/catch 进行对比:

sqlite3* db;
sqlite3_open("some.db", &db);
try
{
    sqlite3_stmt* stmt;
    sqlite3_prepare_v2(db, "SELECT * FROM foo;", &stmt);
    try
    {
        // Lots of stuff...
        try
        {
            make_changes_with(stmt);

            // More stuff...
        }
        catch( Exception e )
        {
            rollback_to(current_state);
            throw;
        }
    }
    finally
    {
        sqlite3_finalize(stmt);
    }
}
finally
{
    sqlite3_close(db);
}

代码变成了spaghetti ,将错误恢复传播到整个商店,并为每个尝试 block 强制缩进。在我看来,使用 scope(X) 的版本更具可读性和更容易理解。

关于c# - D 的作用域失败/成功/退出是否必要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1247778/

相关文章:

c# - 在 SQL Server 2008 R2 Express 中使用 ServiceStack.OrmLite 的 Unicode 字符串

C# 音频文件分析 API/库?

multithreading - x86 上的字撕裂

c# - 使停靠控件可见时更改 Z 顺序

c# - 为什么这段代码是有效的 C# 代码?

c++ - 如何使用 <windows.h> C++ 获取当前目录名称

c++ - 我有一个服务器在套接字上监听,有什么好方法可以通过多个线程来服务 CPU 绑定(bind)请求?

c++ - 我想确定动态链接库使用了多少内存

string - 在不分配内存的情况下在 D 中创建字符串?

d - 为什么 std.algorithm.fill 不接受字符数组?