在 ASP.NET MVC 控制器中使用临时私有变量

我正在对现有 ASP.NET MVC 应用程序中的函数进行一些重构,并在控制器中遇到了以下小递归函数。我对 C# 和 .NET 还是有点陌生,所以如果我做错了什么,请多多包涵。


private int _bl;

[Session]

public void TotalMaterialSubCategories(IEnumerable<Category> materialMasterCats, int i)

{

    foreach (var materialMasterCat in materialMasterCats)

    {

        _bl = _bl + 1;

        materialMasterCat.Level = i;

        if (materialMasterCat.ChildCategories.Count != 0)

        {

            TotalMaterialSubCategories(materialMasterCat.ChildCategories.ToList(), i + 1);

            if (materialMasterCat.Parent == 0)

            {

                materialMasterCat.SortOrder = _bl;

                _bl = 0;

            }

        }

    }

}

令我担心的是这private int _bl句话。在这个类中,对这个变量的唯一引用与这个函数相关联。


我认为该线路_b1 = _b1 + 1可能不可靠,因为它没有手动初始化。尽管如此,我相信因为它是一个int,所以它不能为空或“未初始化”,所以它的默认值是 0;MS Docs 证实了这一点。递归看起来像冒泡的方式让我认为在这个函数调用结束时它也会被设置回 0。最后,我很确定每个独立的 Web 请求都会获得这个控制器的一个单独实例,所以看起来就像它的编写方式一样,它应该按预期运行。


然而,我只是有点想知道为什么会这样写。有没有理由认为这不仅仅是函数的局部变量,用 0 初始化?您可以跨控制器中的函数依赖局部私有变量吗?另外,我的任何假设/决定是否不正确?


MM们
浏览 210回答 2
2回答

阿晨1998

令我担心的是这个私有的 int _bl 语句。在这个类中,对这个变量的唯一引用与这个函数相关联。显然我们不能看到所有的代码,但是如果我相信你这个Field(不是变量)只被这个函数引用,那么我会猜测它要么在其他方法可能已经引用它时被遗留下来,而现在这些方法不再存在,使用它或由方法使用它来维护超出任何单个方法(事件或属性)执行的状态。递归看起来像冒泡的方式让我认为在这个函数调用结束时它也会被设置回 0。在调用构造函数之前它被设置为零&nbsp;。不必要。它只是&nbsp;设置回零的方法结束后if (materialMasterCat.Parent == 0)&nbsp;这个类的每个实例。因为控制器不是静态类,每个类创建都有它自己的私有版本_bl,只能(通常)由类本身访问(私有访问修饰符)。然而,我只是有点想知道为什么会这样写。有没有理由认为这不仅仅是函数的局部变量,用 0 初始化?因为当这段代码运行时,它们的值都会是 1:materialMasterCat.SortOrder&nbsp;=&nbsp;_bl;但是发生的事情是每次调用函数时,它都会递增,因为它存在于类的作用域中,而不是函数作用域中。例如您可以跨 MVC 控制器中的函数依赖局部私有变量吗?私有变量始终可用,直到类被释放(通常),这个时间被称为对象的生命周期。

一只萌萌小番薯

我相信因为它是一个 int,所以它不能为空或“未初始化”,所以它的默认值是 0;由 MS Docs 证实尝试将private int _bl;函数内部放置为 as&nbsp;int _bl;,您将看到编译错误,因为您无法_bl = _bl + 1;对未初始化的值执行操作。因此,它不会在函数范围内自动初始化,但是当它是类实例的属性时会自动初始化。您可以在此处阅读有关何时分配值以及何时未分配值的更多信息:https&nbsp;:&nbsp;//docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/variables这种特殊情况属于:类的实例变量在创建该类的新实例时开始存在,并在没有对该实例的引用并且实例的析构函数(如果有)已执行时停止存在。类的实例变量的初始值是变量类型的默认值(Default values)。为了明确赋值检查的目的,类的实例变量被认为是初始赋值的。
打开App,查看更多内容
随时随地看视频慕课网APP