c# – 基础.NET – 如何“存储/解析”引用
请注意以下代码:
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的引用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |