比如我定义了以下这样的类
public class A
{
        public int ID
        {
            get;
            set;
        }
}public A NewA=new A();public class B
{
     public A Quote=NewA;
}public B NewB=new B();当我释放NewA整个对象时,怎么使NewB中的Quote引用变为Null?有没有C#现成的机制可用?
目前我采用的是在A类里定义相关释放通知事件,在B类引用时注册通知事件,接到通知后设置Quote为null.

解决方案 »

  1.   

    类是引用传递,Quote指向NewA,NewA为null后,Quote也为null
      

  2.   

    NewA和Quote指向同一地址,NewA释放的的时候Quote也释放了
      

  3.   

    那如果这个引用是在一个集合里呢?比如 List<A> ListQuote,设置为null的话,ListQuote还是会有一个null的项。
      

  4.   

    楼主可以了解一下弱引用WeakReference
      

  5.   

    NewA与Quote是指向同一个对象的两个不同的引用,一个置为null,并不影响另一个
      

  6.   

    我觉得楼主应该学会使用搜索引擎,比如你可以这样public class B
    {
        private WeakReference quote = new WeakReference(NewA);
        public A Quote
        {
            get
            {
                object value = quote.Target;
                return value != null ? (A)value : null;
            }
        }
    }
      

  7.   

    注意,WeakReference需要指向同一个对象的所有正常引用都为null
      

  8.   

    我的问题是怎么实现通知集合删除子项,比如 List<A> ListQuote,当其中的任意子项A为null时,就从ListQuote删除该子项。目前,我觉得除了做事件注册,没有什么好的办法。
      

  9.   

    释放NewA整个对象
    你怎么“释放”。只要还有对象引用,就不可能“释放”,除非CLR有bug。
      

  10.   

    所以说要做到真正的释放,只有通过事件注册的方式,让所有引用者必须注册个Disposing事件,在对象需要释放时,触发该事件,让所有引用者取消引用。但是这样带来个问题就是,万一引用者没有写注册该Disposing事件怎么办?除了强制要求使用必须注册外是否还有其他方法,比如利用.net的一些机制?
      

  11.   

    所以说要做到真正的释放,只有通过事件注册的方式,让所有引用者必须注册个Disposing事件,在对象需要释放时,触发该事件,让所有引用者取消引用。但是这样带来个问题就是,万一引用者没有写注册该Disposing事件怎么办?除了强制要求使用必须注册外是否还有其他方法,比如利用.net的一些机制?你应该定义一个 IsDisposed 属性,当被调用了 Dispose 后,就设置为 true实际上,.NET框架库的很多类就是这么做的。Control.IsDisposed 属性(System.Windows.Forms) - MSDN - Microsoft
    msdn.microsoft.com/zh.../system.windows.forms.control.isdisposed.aspx‎
    当此属性返回true,则控件被释放并且不能再由有效的Windows 控件引用。 即使控件的实例已释放,该实例仍保留在内存中,直到通过垃圾回收将其移除为止。 控件被 ...
    Control.IsDisposed 属性(System.Windows.Forms) - MSDN - Microsoft
    msdn.microsoft.com/.../system.windows.forms.control.isdisposed(v=vs.8...‎
    当该属性返回true 时,控件被释放,不再能作为有效的Windows 控件引用。尽管控件的实例已被释放,但是,它仍保留在内存中,直到通过“垃圾回收”将其从内存中移除 ...
    CommunicationObject.IsDisposed 属性(System ... - MSDN - Microsoft
    msdn.microsoft.com/.../system.servicemodel.channels.communicationobj...‎
    版本信息 .NET Framework. 受以下版本支持:4.5、4、3.5、3.0 .NET Framework Client Profile. 受以下版本支持:4、3.5 SP1. 可移植类库. 受以下版本支持:可移植类库 ...
    ChangeMonitor.IsDisposed 属性(System ... - MSDN - Microsoft
    msdn.microsoft.com/.../system.runtime.caching.changemonitor.isdispose...‎
    获取一个值,该值指示释放ChangeMonitor 类的派生实例。
    AnnotationStore.IsDisposed 属性(System ... - MSDN - Microsoft
    msdn.microsoft.com/.../system.windows.annotations.storage.annotationst...‎
    Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服务器核心角色), Windows Server 2008 R2(支持带SP1 或更 ...
    PrintProperty.IsDisposed 属性(System.Printing ... - MSDN - Microsoft
    msdn.microsoft.com/.../system.printing.indexedproperties.printproperty.i...‎
    Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服务器核心角色), Windows Server 2008 R2(支持带SP1 或更 ...
    PrintProperty.IsDisposed 属性(System.Printing ... - MSDN - Microsoft
    msdn.microsoft.com/.../system.printing.indexedproperties.printproperty.i...‎
    ... void set_IsDisposed (boolean disposing). JScript. 复制. protected function get IsDisposed () : boolean protected function set IsDisposed (disposing : boolean).
    XamlReader.IsDisposed 属性(System.Xaml) - MSDN - Microsoft
    msdn.microsoft.com/.../system.xaml.xamlreader.isdisposed(v=vs.110).as...‎
    Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服务器核心角色), Windows Server 2008 R2(支持带SP1 或更 ...
    PresentationSource.IsDisposed 属性(System ... - MSDN - Microsoft
    msdn.microsoft.com/.../system.windows.presentationsource.isdisposed(v...‎
    当重写在派生类中,获取在其中声明的值对象是否被释放。
    IDisposable.Dispose Method (System) - MSDN - Microsoft
    msdn.microsoft.com/en-us/.../system.idisposable.dispose.aspx‎
    翻译此页
    Use this method to close or release unmanaged resources such as files, streams, and handles held by an instance of the class that implements this interface.随便google,你会发现很多类都是这么处理的。哪怕你不会,看着微软这么用,学也学会了啊。只要你写的程序够多。
      

  12.   

    所以说要做到真正的释放,只有通过事件注册的方式,让所有引用者必须注册个Disposing事件,在对象需要释放时,触发该事件,让所有引用者取消引用。但是这样带来个问题就是,万一引用者没有写注册该Disposing事件怎么办?除了强制要求使用必须注册外是否还有其他方法,比如利用.net的一些机制?你应该定义一个 IsDisposed 属性,当被调用了 Dispose 后,就设置为 true实际上,.NET框架库的很多类就是这么做的。Control.IsDisposed 属性(System.Windows.Forms) - MSDN - Microsoft
    msdn.microsoft.com/zh.../system.windows.forms.control.isdisposed.aspx‎
    当此属性返回true,则控件被释放并且不能再由有效的Windows 控件引用。 即使控件的实例已释放,该实例仍保留在内存中,直到通过垃圾回收将其移除为止。 控件被 ...
    Control.IsDisposed 属性(System.Windows.Forms) - MSDN - Microsoft
    msdn.microsoft.com/.../system.windows.forms.control.isdisposed(v=vs.8...‎
    当该属性返回true 时,控件被释放,不再能作为有效的Windows 控件引用。尽管控件的实例已被释放,但是,它仍保留在内存中,直到通过“垃圾回收”将其从内存中移除 ...
    CommunicationObject.IsDisposed 属性(System ... - MSDN - Microsoft
    msdn.microsoft.com/.../system.servicemodel.channels.communicationobj...‎
    版本信息 .NET Framework. 受以下版本支持:4.5、4、3.5、3.0 .NET Framework Client Profile. 受以下版本支持:4、3.5 SP1. 可移植类库. 受以下版本支持:可移植类库 ...
    ChangeMonitor.IsDisposed 属性(System ... - MSDN - Microsoft
    msdn.microsoft.com/.../system.runtime.caching.changemonitor.isdispose...‎
    获取一个值,该值指示释放ChangeMonitor 类的派生实例。
    AnnotationStore.IsDisposed 属性(System ... - MSDN - Microsoft
    msdn.microsoft.com/.../system.windows.annotations.storage.annotationst...‎
    Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服务器核心角色), Windows Server 2008 R2(支持带SP1 或更 ...
    PrintProperty.IsDisposed 属性(System.Printing ... - MSDN - Microsoft
    msdn.microsoft.com/.../system.printing.indexedproperties.printproperty.i...‎
    Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服务器核心角色), Windows Server 2008 R2(支持带SP1 或更 ...
    PrintProperty.IsDisposed 属性(System.Printing ... - MSDN - Microsoft
    msdn.microsoft.com/.../system.printing.indexedproperties.printproperty.i...‎
    ... void set_IsDisposed (boolean disposing). JScript. 复制. protected function get IsDisposed () : boolean protected function set IsDisposed (disposing : boolean).
    XamlReader.IsDisposed 属性(System.Xaml) - MSDN - Microsoft
    msdn.microsoft.com/.../system.xaml.xamlreader.isdisposed(v=vs.110).as...‎
    Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服务器核心角色), Windows Server 2008 R2(支持带SP1 或更 ...
    PresentationSource.IsDisposed 属性(System ... - MSDN - Microsoft
    msdn.microsoft.com/.../system.windows.presentationsource.isdisposed(v...‎
    当重写在派生类中,获取在其中声明的值对象是否被释放。
    IDisposable.Dispose Method (System) - MSDN - Microsoft
    msdn.microsoft.com/en-us/.../system.idisposable.dispose.aspx‎
    翻译此页
    Use this method to close or release unmanaged resources such as files, streams, and handles held by an instance of the class that implements this interface.随便google,你会发现很多类都是这么处理的。哪怕你不会,看着微软这么用,学也学会了啊。只要你写的程序够多。
    那也只是对象本身对外表示我释放了,不要用我了的意思吧?只要引用者没有使用到该对象,也就不会去检查它的IsDisposed 属性,那么这个对象实际还是存在于内存中。
      

  13.   

    那如果这个引用是在一个集合里呢?比如 List<A> ListQuote,设置为null的话,ListQuote还是会有一个null的项。集合也是引用类型,效果一样的
      

  14.   

    那如果这个引用是在一个集合里呢?比如 List<A> ListQuote,设置为null的话,ListQuote还是会有一个null的项。集合也是引用类型,效果一样的
    请问这个Null项如何去除?
      

  15.   

    那如果这个引用是在一个集合里呢?比如 List<A> ListQuote,设置为null的话,ListQuote还是会有一个null的项。集合也是引用类型,效果一样的
    请问这个Null项如何去除?
    给默认值啊。
      

  16.   

    那如果这个引用是在一个集合里呢?比如 List<A> ListQuote,设置为null的话,ListQuote还是会有一个null的项。集合也是引用类型,效果一样的
    请问这个Null项如何去除?
    给默认值啊。
    你没看懂我的问题。
    ListQuote原来有4个子项,如果其中一个子项本身要释放掉,先设置为Null了,当然引用者ListQuote中的某个子项也变为null,但引用关系还在,那个子项即使设置为null,也是被回收的。所以必须想个办法使ListQuote变为3个子项,把那个Null的欲释放子项从集合里删除。不知道我这样说,你是否明白我的问题了。
      

  17.   

    那如果这个引用是在一个集合里呢?比如 List<A> ListQuote,设置为null的话,ListQuote还是会有一个null的项。集合也是引用类型,效果一样的
    请问这个Null项如何去除?
    给默认值啊。
    你没看懂我的问题。
    ListQuote原来有4个子项,如果其中一个子项本身要释放掉,先设置为Null了,当然引用者ListQuote中的某个子项也变为null,但引用关系还在,那个子项即使设置为null,也是被回收的。所以必须想个办法使ListQuote变为3个子项,把那个Null的欲释放子项从集合里删除。不知道我这样说,你是否明白我的问题了。
    写错了:
    也是不会被回收的