基础.NET - 如何"存储/解析"引用

max*_*axp 3 c# asp.net pointers reference

请注意以下代码:

Control foo = null;
Control bar = null;
int i = 0;

protected void Page_Load(object sender, EventArgs e)
{
    test();
    test();
    Page.Controls.Add(foo);
}

void test()
{
    i++;
    bar = new Control();
    bar.Controls.Add(new LiteralControl(i.ToString()));
    if (foo == null)
    {
        foo = new Control();
        foo.Controls.Add(bar);
    }
}
Run Code Online (Sandbox Code Playgroud)

在尝试上面的代码时,我很惊讶地看到打印的结果是'1'(不是'2').

我假设这是因为当我添加控件barfoo,foo.Controls.Add()解析引用bar,而不是仅存储引用本身.

1)任何人都可以确认是这种情况,还是可能详细说明?

2)我有一种感觉,如果我被允许这样做foo.Controls.Add(ref bar);会显示'2',但显然语法是非法的.如果没有重大的重构,是否可能出现这种情况?

Jon*_*eet 6

打电话给

foo.Controls.Add(bar);
Run Code Online (Sandbox Code Playgroud)

使用当前值bar.这指的是Control包含LiteralControl文本"1"的a.

现在,稍后,您将更改值bar以引用完全不同的控件...但这对已存储的内容没有任何影响foo.Controls.即使你可以通过bar引用传递给Add方法,这实际上也没有任何区别.

强烈建议,如果您不确定.NET中的引用,参数等是如何工作的,那么您使用控制台应用程序来检查您的理解.它们易于使用,调试等.

您可能还想阅读有关参数传递值/引用类型的文章.