"using" 在 C# 中 - 从 using 语句中调用的辅助函数是否使用包含的 IDisposable 对象?

"using" in C# - do helper functions called from within a using statement use the included IDisposable object?

我正在使用 ObjectARX C#.Net 框架为 AutoCAD 2021 开发插件应用程序。我正在尝试重构它/使代码更容易理解,因为我很快就会回到学校,而且我目前是我工作地点唯一的全职编码员。

我正在考虑用辅助函数替换我的代码块,以便它可以在未来的 AutoCAD 项目中重复使用,但它目前依赖于 IDisposable“事务”对象来运行。

如果我从事务“using”语句中调用函数,它会自动使用事务本身吗?或者,我需要将交易对象传递给函数吗?

编辑:在此处包含一些示例代码。

using (Transaction trans0 = destDB.TransactionManager.StartTransaction())
{
    //Setup for CSV Export, following code reads control panel, may be replaced with helper function that reads control panel
    int grain = -1;
    int thickness = 0;
    int aCounter = 0;
    int bCounter = 0;
    String material = "NOTINITIALIZED";
    //End setup

    BlockTable destBT = trans0.GetObject(destDB.BlockTableId, OpenMode.ForRead) as BlockTable;
    BlockTableRecord destBTR = trans0.GetObject(destBT[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
    List<Entity> Containers = new List<Entity>();
    List<Entity> Selectors = new List<Entity>();
    List<Entity> SelectorFrames = new List<Entity>();
    foreach (ObjectId id1 in destBTR)
    {
        Entity en = trans0.GetObject(id1, OpenMode.ForRead) as Entity;
        if ((en.Layer.Equals("MDF")) || (en.Layer.Equals("PFM")) || (en.Layer.Equals("x")) || (en.Layer.Equals("y") || (en.Layer.Equals("ng"))))
        {
            SelectorFrames.Add(trans0.GetObject(id1, OpenMode.ForRead) as Entity);
        }
        if (en.Layer.Equals("selector"))
        {
            Selectors.Add(trans0.GetObject(id1, OpenMode.ForRead) as Entity);
        }
        if (en.Layer.Equals("Container"))
        {
            Containers.Add(trans0.GetObject(id1, OpenMode.ForRead) as Entity);
        }
        if (en.Layer.Equals("tCounter"))
        {
            thickness++;
        }
        if (en.Layer.Equals("aCounter"))
        {
            aCounter++;
        }
        if (en.Layer.Equals("bCounter"))
        {
            aCounter++;
        }
    }
    foreach (Entity selector in Selectors)
    {
        using (Trimmer trimmer = new Autodesk.AutoCAD.ExportLayout.Trimmer())
        {
            foreach (Entity sFrame in SelectorFrames)
            {
                trimmer.Trim(selector, sFrame);
                if (trimmer.EntityCompletelyInside)
                {
                    if (sFrame.Layer.Equals("x"))
                    {
                        grain = 1;
                    }
                    else if (sFrame.Layer.Equals("y"))
                    {
                        grain = 2;
                    }
                    else if (sFrame.Layer.Equals("ng"))
                    {
                        grain = 0;
                    }
                    else
                    {
                        material = sFrame.Layer;
                    }
                }
            }
        }
    }
    ... some code that's in the same scope but not related to this proposed helper function ...
}

对于大多数事情,答案是“否”:using 只会影响您正在处理的对象的生命周期。

但是,交易是一种特殊情况。创建和处理事务会导致某些状态信息与当前执行上下文相关联,并且已经编写了许多库来检测和尊重该状态。因此,如果您的代码调用一个方法,然后执行数据库访问,那么数据库访问很可能会在该事务的范围内执行。

您可以找到有关其工作原理的更多详细信息here。诸如创建新事务范围时如何设置静态 Transaction.Current 属性 之类的事情,事务管理器如何确定参与哪些事务操作,以及如果有必要,您可以如何抑制当前事务范围需要在当前活动的任何事务之外执行的代码。