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

C# ASP.NET MVC控制器中临时私有变量的使用,c#,asp.net-mvc,C#,Asp.net Mvc,我正在对现有ASP.NET MVC应用程序中的函数进行重构,并在控制器中遇到了以下小递归函数。我对C#和.NET还是有点陌生,所以如果我有一些地方出错,请容忍我 private int _bl; [Session] public void TotalMaterialSubCategories(IEnumerable<Category> materialMasterCats, int i) { foreach (var materialMasterCat in material

我正在对现有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\u bl;
[会议]
公共空间总体材料子类别(IEnumerable materialMasterCats,int i)
{
foreach(materialMasterCats中的var materialMasterCat)
{
_bl=_bl+1;
materialMasterCat.Level=i;
if(materialMasterCat.ChildCategories.Count!=0)
{
TotalMaterialSubCategories(materialMasterCat.ChildCategories.ToList(),i+1);
如果(materialMasterCat.Parent==0)
{
materialMasterCat.SortOrder=\u bl;
_bl=0;
}
}
}
}
我关心的是这个
private int\u bl
语句。在此类中,此变量的唯一引用与此函数关联

我认为行
\u b1=\u b1+1
可能不可靠,因为它不是手动初始化的。尽管如此,我认为由于它是一个
int
,它不能为null或保持“未初始化”,因此它得到了一个默认值0。递归冒泡的样子让我觉得在这个函数调用结束时它也会被设置回0。最后,我非常确定每个独立的web请求都会获得该控制器的一个单独实例,因此它的编写方式应该与预期的一样

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

我相信,因为它是一个int,所以不能为null或左 “未初始化”,因此它的默认值为0;证实 微软文档

试着把
private int\u bl函数内部作为
int\u bl\u bl=\u bl+1对未初始化值的操作。所以,它不会在函数的作用域中自动初始化,但当它是类实例的属性时,它会自动初始化

在这里,您可以阅读有关何时分配值以及何时不分配值的更多信息:这种特殊情况下:

类的实例变量出现 在创建该类的新实例时存在,并且 当没有引用该实例和 实例的析构函数(如果有)已执行。初始值 类的实例变量是 变量的类型。为了确定赋值检查, 类的实例变量被认为是初始赋值的

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

显然,我们看不到所有的代码,但是如果我相信这个(不是变量)只被这个函数引用,那么我会猜测,要么它是其他方法引用它时留下的,而现在这些方法不再存在,在任何单个方法(事件或属性)的执行之外,使用它或由方法使用它来维护状态

递归冒泡的样子让我觉得在这个函数调用结束时它也会被设置回0

它被设置为零

不一定。如果(materialMasterCat.Parent==0)
用于该类的每个实例化,则只有在方法结束后将其设置回零

因为控制器不是静态类,所以创建的每个类都有自己的私有版本的
\u bl
,该版本只能(通常)由类本身访问()

然而,我只是想知道为什么会这样写。这不仅仅是函数的局部变量(用0初始化),有什么原因吗

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

materialMasterCat.SortOrder = _bl;
但是每次调用函数时,它都会递增,因为它存在于类的作用域中,而不是函数中

在MVC控制器中,您可以跨函数依赖局部私有变量吗


私有变量始终可用,直到类被释放为止(通常),这一次被称为对象的私有变量。

您的假设是正确的。在每个请求中,
\u b1
的值将初始化为0。至于他们为什么这样做,只有作者才能告诉你,当然,是的,谢谢你的澄清。你知道为什么它是用私有对象变量编写的,而不是在函数中声明一个变量为
int\u bl=0?它是否更有用或更高效?Erik Philips对此有一个完美的答案。啊,对了,它不知怎么地从我身边溜走了,它使用该字段在递归调用之间保持状态;可能是因为它传递的是
i
,而不是
\u bl
——谢谢。顺便问一下,是否有任何方法可以知道控制器实例何时将被处置,或者用户是否可以期望在HTTP请求之间与同一控制器实例进行交互?控制器实例是为每个HTTP请求创建的。它们不会被重复使用。一旦您将响应发送回客户端,它将被释放。