首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于本例中的引用类型,我遗漏了什么?

关于本例中的引用类型,我遗漏了什么?
EN

Stack Overflow用户
提问于 2010-12-02 04:58:37
回答 3查看 106关注 0票数 0

我有以下代码,我创建了一个对象,并通过一系列窗体将其传递给用户控件。

代码语言:javascript
复制
public class MyObject
{
   public List<AnObject> Objects {get; set;}
}

表格1:

代码语言:javascript
复制
private void MyObject _myObject = new MyObject{Objects = new List<AnObject>()};

...

Form2 form2 = new Form2(ref _myObject);
form2.Show();

表格2:

代码语言:javascript
复制
public Form2(ref MyObject myObject)
{
    UserControl1 myControl = new UserControl1();
    myControl.Objects = myObjects.Objects
}

UserControl1

代码语言:javascript
复制
public List<AnObject> Objects {get; set;}
...

Objects.Add(new myObject());

当我向UserControl1中的对象添加一个新的myObject()时,它不会更新我在Form1上的原始列表。我正在通过引用传递myObject。当我将Form2的AnObject列表赋给UserControl1时,我唯一能想到的就是以某种方式拆开我的值。我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-02 05:04:50

  1. ref对此示例一无所知。如果没有引用,您将传递列表的引用,就像您想要的那样(它将由两个表单共享)。(需要引用关键字的代码-这是非常少见的代码)
  2. List<T>没有关于其更改的通知。因此,当您以一种形式更改其内容时,另一种形式并不知道它。考虑使用ObservableCollection并在控件中订阅其CollectionChanged事件。
票数 4
EN

Stack Overflow用户

发布于 2010-12-02 05:01:38

ref甚至不应该是必要的。

当我向UserControl1中的对象添加新的myObject()时,它不会更新我在Form1上的原始列表

它应该做到这一点。最好发布准确的代码,这部分告诉我代码没有被复制/粘贴:

代码语言:javascript
复制
public Form2(ref MyObject myObject)
{
    UserControl1 myControl = new UserControl1();
    myControl.Objects = myObjects.Objects  // extra 's'
}

因此,我们现在正在寻找代码中的一个小问题,它是真实内容的不精确副本。无可救药。

票数 2
EN

Stack Overflow用户

发布于 2010-12-02 05:04:07

无论如何,.NET中的对象都是引用类型。在这种情况下,只有当您希望在同一参数中传回不同的对象而不是返回新对象时,才需要使用ref。对于您在这里所做的事情,ref是完全不必要的。(与之形成对比的是,struct是值类型,因此ref做了一些更有可能有用的事情)类似地,由于对象已经是值类型,所以这里没有装箱或取消装箱的概念。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4329073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档