使用if语句来管理微管理

Tra*_*s J 4 c#

if语句是否应该用于协助堆栈的内存解除分配?

例A:

        var objectHolder = new ObjectHolder();
        if (true)
        {
            List<DefinedObject> objectList;
            using (var sr = new GenericStreamReader<DefinedObject>())
            {
                objectList= sr.Get().ToList();
            }
            if (true)
            {
                var DOF = new DefinedObjectFactory();
                objectHolder.DefinedObjects = DOF.DefineObjects(objectList);
            }
        }
        //example endpoint
Run Code Online (Sandbox Code Playgroud)

例B:

        var objectHolder = new ObjectHolder();
        List<DefinedObject> objectList;
        using (var sr = new GenericStreamReader<DefinedObject>())
        {
         objectList= sr.Get().ToList();
        }
        var DOF = new DefinedObjectFactory();
        objectHolder.DefinedObjects = DOF.DefineObjects(objectList);
        //example endpoint
Run Code Online (Sandbox Code Playgroud)

当示例端点到达时,示例A在堆栈上的占用空间是否比在示例B中达到示例端点时更小?

Eri*_*ert 12

首先,整基于堆栈的分配制度的恰恰是你没有需要优化以任何方式.别担心.抖动完全能够实现本地永远不会被读取或写入,并且如果觉得这是最好的事情,则重新使用它的存储.让抖动完成它的工作; 它不需要你的帮助.(*)

而是编写程序,以便局部变量对读者有意义.那是你应该优化的.

最后,从来没有必要说"if(true){}"来引入一个新的范围.只是介绍一个新的范围.说完全合法:

void M()
{
    { // new scope
    }

    { // another one
    }
} 
Run Code Online (Sandbox Code Playgroud)

(*)有一种情况是抖动需要你的帮助,这就是本地引用堆上包含将由非托管代码使用的资源的对象的情况.抖动不知道非托管代码将使用对象的资源,并且可能决定没有人再使用此对象并提前清理它.然后,当非托管代码使用资源时,对象的终结器可能会释放终结器线程上的资源!一个对象不能保证只是因为一个局部变量保持它而保持活着.如果永远不再读取局部变量,则抖动可以重新使用其存储并告诉垃圾收集器收集引用对象是安全的,这可能会使非托管代码崩溃.您可以使用KeepAlive提示特定对象需要保持活动的抖动而不是被优化掉.


Ale*_*kov 7

if(true) 将在优化构建中编译(唯一的构建,其中变量寿命比整个方法短) - 所以你建议的两个版本之间绝对没有区别.


Dav*_*Yaw 5

根据用法,我假设DefinedObjectFactory是一个类,而不是结构.因此,堆栈上唯一的东西就是引用DefinedObjectFactory.实际对象在堆上,由垃圾收集器控制.

您可能保存的唯一堆栈空间是单个指针的空间,因此不值得.