C#编译器和优化程序会破坏此代码吗?

乔钦·范·威利克(Jochen van Wylick)

在函数内给出以下C#代码:

....
var documentCollection =
    client.CreateDocumentCollectionQuery("dbs/" + database.Id)
        .Where(c => c.Id == DocumentCollectionName)
        .AsEnumerable()
        .FirstOrDefault();

if (documentCollection == null)
{
    documentCollection =
        await
        client.CreateDocumentCollectionAsync(
            "dbs/" + database.Id,
            new DocumentCollection { Id = DocumentCollectionName });
}

return client;

注意:我不会返回documentCollection,我只是需要对其进行初始化(如果尚未初始化CreateDocumentCollectionAsync调用)。所以-在ifblock之后,documentCollection成为未使用的变量。

现在-ReSharper建议将其优化为:

var documentCollection =
    client.CreateDocumentCollectionQuery("dbs/" + database.Id)
        .Where(c => c.Id == DocumentCollectionName)
        .AsEnumerable()
        .FirstOrDefault()
    ?? await
        client.CreateDocumentCollectionAsync(
            "dbs/" + database.Id,
            new DocumentCollection { Id = DocumentCollectionName });

并且现在指示这documentCollection是一个未使用的变量。

我的问题: C#代码优化或“发布”版本会完全删除这行代码并导致CreateDocumentCollectionAsync永不触发吗?

C#优化课程告诉我,在函数中不需要“释放”时,“释放”将立即构建垃圾收集变量,而调试构建则不这样做(出于调试目的)。

我现在想知道它是否如此急切,甚至可以优化未使用的变量分配(在后台触发操作)。

帕特里克·霍夫曼

不,编译器和JIT都不会优化您的方法调用。

有一个的JIT编译器做什么列表if (false) { ... }例如,它确实优化了离开块或未使用的变量分配。它不仅可以优化您的方法调用。如果是这样,则对void方法的每次调用也都应该消失。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章