加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 基础.NET – 如何“存储/解析”引用

发布时间:2020-12-15 23:56:24 所属栏目:百科 来源:网络整理
导读:请注意以下代码: 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.ToSt
请注意以下代码:

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);
    }
}

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

我假设这是因为当我将控制栏添加到foo时,foo.Controls.Add()会解析参考栏,而不是仅仅存储引用本身.

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

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

解决方法

Jon Skeet的答案很好(当然),但我只想强调一点:

引用类型的变量(例如bar和foo)不包含对象,它们包含对象的引用.

所以第一次通过test()方法时,bar包含一个对其中包含1的Control的引用.并且该引用被添加到foo.

第二次通过test()方法,bar包含对不同Control的引用,其中包含2.并且该引用不会添加到foo中.

为什么第二次它是一个不同的参考?因为在test()的开头你说bar = new Control();它存储对bar中新控件的引用.从那时起,bar与它之前提到的Control无关,尽管在foo的Controls集合中仍然存在对该控件的引用.

如果您想更改代码以使其表现出您的预期,您可以这样做:

Control foo = null;
Control bar = new Control();
int i = 0;

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

void test()
{
    i++;
    bar.Controls.Clear()
    bar.Controls.Add(new LiteralControl(i.ToString()));
    if (foo == null)
    {
        foo = new Control();
        foo.Controls.Add(bar);
    }
}

在这种情况下,我们只在bar中存储一个新的引用,所以当完成所有操作时,它仍应匹配我们添加到foo的引用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读