【问题标题】:Problem with understanding reference types理解引用类型的问题
【发布时间】:2011-09-23 08:43:30
【问题描述】:

我从 WCF 服务 ObservableCoolection 获得

MyTypes = e.Result;

ObservableCollection<MyType> MyTypes // it's a property of _myTypes

<telerik:RadGridView x:Name="grdSrL" ItemsSource="{Binding MyTypes}"  SelectedItem="{Binding SelectedMyType, Mode=TwoWay}"

public ShowroomLog SelectedMyType
{
    get { return _selectedMyType; }
    set
    {
        if (_selectedSMyType != value)
        {
            _selectedMyType = value;
            RaisePropertyChanged(SelectedMyTypePropertyName);
        }
    }
}

在我从 Web 服务获取这些集合后,选定的项目由网格设置,然后我这样做:

SelectedMyType = null;

为什么在那之后没有一个集合中的项目不为空?

如果我这样做:

var x = new Car();
var y = x;

y = null;

那么 x 也将为空;

为什么会有不同?

【问题讨论】:

  • "那么 x 也会为空" - 你确定吗?也许是一个快速的控制台应用程序来测试这个假设......
  • 您是否尝试过使用xyCar 的示例?只要Car 被声明为一个类,x 就不像你评论的那样为空,x 仍然是新车。如果您想更好地理解引用类型,我总是发现考虑分离变量包含的对象很有用。那是因为,他们是。您的变量 xy 只是对您创建的 Car 对象的引用。当您说var y = x; 时,您实际上是在创建对同一对象的新引用。当您说y = null; 时,您是在说删除此对象的引用。希望有帮助吗?
  • @user278618 Dispose 仅适用于本身负责非托管(阅读:非.NET)事物的对象。对于独立的纯托管对象,是的,只需停止“查看它”(即确保没有对它的引用),G​​C 会处理它。
  • 在您的情况下@user278618,它将取决于变量的 范围。例如,如果它们是方法中的局部变量,则当方法退出时,变量将移出范围,因此对汽车的引用将被破坏。稍后,GC 将查看您创建的所有对象,找到汽车对象,并注意到不再有任何指向汽车的引用,因此它会销毁汽车。
  • @user278618 - 我不知道这是否有帮助,当然谷歌文档分配的格式没有帮助,但我举了一个简单的例子来说明引用和值类型之间的区别here

标签: .net silverlight telerik reference-type


【解决方案1】:

C# 中的引用类型实际上是对象指针。在您的示例中,xy 是对象指针,而不是对象本身。如果更改指针,则不会更改对象。 x 不会 也如您所说的那样变为空。该假设/示例不正确。

如果您通过任一变量在集合上调用 .Clear(),则指向该集合的两个指针都将显示 0 个条目,但您需要解释您正在尝试做什么,所以我可以用特定的示例。

.Clear() 不会销毁列表中的任何子节点,如果有其他地方引用(例如,被另一个列表)。

【讨论】:

  • 我知道有指针,比如 _selectedMyType 。那么,如果我很好地理解 ObservableCollection 不是指针的集合?
  • ObservableCollection 指针的集合。 (如果孩子是值类型,我认为他们会自动装箱,但我不是 100% 确定)。关键是(不是双关语),如果您更改指针/变量,您不会更改引用同一对象的所有其他指针/变量。
猜你喜欢
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多