代码之家  ›  专栏  ›  技术社区  ›  Lovethenakedgun

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

  •  3
  • Lovethenakedgun  · 技术社区  · 6 年前

    我正在对现有ASP.NET MVC应用程序中的函数进行一些重构,并在控制器中遇到下面的小递归函数。我对C#amp;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; corroborated by the MS Docs . 递归看起来像泡泡一样让我觉得在这个函数调用结束时它也会被设置回0。最后,我非常确定每个独立的web请求都得到了这个控制器的一个单独实例,所以看起来就像这样写的,它应该按预期的那样工作。

    不过,我只是想知道为什么会这样写。这不是函数的局部变量,用0初始化的原因吗?你能在控制器的函数中依赖局部私有变量吗?另外,我的任何假设/决定是否不正确?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Erik Philips    6 年前

    我所关心的是这份私人声明。在这个类中,对这个变量的唯一引用与这个函数相关联。

    显然我们看不到所有的代码,但是如果我相信你 Field (不变量)仅由该函数引用,然后我推测,当其他方法可能引用它时,它被遗留下来,现在这些方法不再存在,使用它或方法使用它来保持状态超出任何单一方法(事件或属性)的执行。

    递归看起来像泡泡一样让我觉得在这个函数调用结束时它也会被设置回0。

    它是 设为零 before the constructor is called .

    不一定。它是 只有 归零 方法结束后 if (materialMasterCat.Parent == 0) 对于这个类的每个实例化 .

    因为控制器不是静态类,所以每个创建的类都有自己的私有版本 _bl 只能(通常)由类本身访问( private access modifer ).

    不过,我只是想知道为什么会这样写。这不是函数的局部变量,用0初始化的原因吗?

    因为当这段代码运行时,它们的值都是1:

    materialMasterCat.SortOrder = _bl;
    

    但发生的是每次调用函数时,函数都在递增,因为它存在于类的作用域中,而不是函数。 scope .

    For Example

    你能在MVC控制器的函数中依赖本地私有变量吗?

    在释放类之前(通常),私有变量始终可用,这一次称为 Lifetime 一个物体的。

        2
  •  2
  •   Erndob    6 年前

    我相信既然它是一个int,它就不能是null或left “未初始化”,因此它的默认值为0;由 MS文档

    试着把 private int _bl; 函数的内部 int _bl; 您将看到由于无法执行 _bl = _bl + 1; 对未初始化值的操作。所以,它不会在函数范围内自动初始化,但当它是类实例的属性时,它会自动初始化。

    当一个值被赋值或不在这里时,您可以阅读更多内容: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/variables 这种特殊情况可归结为:

    类的实例变量 当创建该类的一个新实例时, 当没有对该实例和该实例的引用时,它就不存在了。 实例的析构函数(如果有)已执行。初始值 类的实例变量是 变量的类型。为了明确任务检查, 类的实例变量被认为是初始分配的。