【问题标题】:should libgit2sharp Repository be explicitly disposed?应该明确处置 libgit2sharp 存储库吗?
【发布时间】:2015-07-16 05:36:30
【问题描述】:

是否应该明确处置 libgit2sharp Repository 对象?

如果不总是通过Repository.Dispose() 执行清理,可能的负面后果是什么?非 GC 的 Repository 对象能否保留对各种 .git 文件的锁定?

最好将 Repository 对象包装在 using 语句中吗?

var localRepo = new Repository("{local repo path}", new RepositoryOptions());
using (localRepo) {
    // checkout
    // etc.
}

【问题讨论】:

    标签: git repository dispose using-statement libgit2sharp


    【解决方案1】:

    建议使用Repository

    确实,这种类型包含指向非托管资源的指针(本机内存、指向.git 目录下的文件句柄的间接指针……)。

    Dispose() 将确保正确释放/释放这些资源。

    但是,如果调用者忘记这样做,则已经实施了一些安全网。 Repository 类型定义了一个 finalizer 来处理这个问题。

    请记住,这个终结器运行的时间是不可预测的(如文档中所述“在它被垃圾收集回收之前”)。

    因此,建议您自行控制存储库的处置。

    【讨论】:

    • 我在源代码中没有看到终结器,是我遗漏了什么吗?我想在 PowerShell 脚本中使用 LibGit2Sharp,所以我不太担心在 GC 收集对象时是否会延迟清理,只要它最终运行
    • @felixfbecker 终结器不再需要。请参阅提交 3a7ec78
    • 有趣,你能解释一下那个安全手柄的作用吗?你觉得不在 PowerShell 中 dispose 可以吗?
    • @felixfbecker 我相信这会成为一个令人惊叹的 StackOverflow 问题。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多