Resource management vs. memory management
很多开发者对.Net的runtime's GC(运行时垃圾回收器)、Finalizers、IDisposable三者如何具体互相影响的理解很模糊,这可能是由于“资源管理”和“内存管理”之间的概念混淆造成的。
很多开发者头一次听说Dispose模式时抱怨GC没有进行相应的工作,他们认为它应该收集资源,就像你在管理非托管式资源时所做一样。然而事实上,GC并不是用来管理资源的,而是用来管理内存,对于这个目标而言它是出色的。
这是.Net易用性的证明,也是运行时被误解的关键部分。注意,subscriptions(订阅物)不会自动disposed 。一般情况下,IDisposable实例将在离开作用域时返回给你,它没有finalizer且不会被回收,如果你调用Subscribe方法时不保存返回值,将导致你之后无法取消订阅,程序内存泄漏及不必要的进程负担。
Subscribe的扩展方法将会在内部构造在completes或errors时自动detachsubscriptions(订阅物)的行为。但即使有这些行为,仍然需要使用IDisposable实例来明确的终结这些订阅,因为还必须要考虑到infinite sequences(永不终止的队列)的情况。
subscriptions(订阅物)是独立的,所以一个disposable也不会影响到其它的,某些Subscribe扩展方法拥有自动detaching(分离)观测者的能力,但直接管理disposable仍被认为是明确地管理订阅的最好做法,就像你会为其他资源实现IDisposable接口一样。在后面的章节中我们会看到,订阅可能会招致其他资源的成本,例如事件、缓存和线程,因此需要全程提供一个错误管理手段来预防抛出错误,对于这点来说直接管理disposable也是最好实践。
PART 2 - Sequence basics
在上一章中,我们了解了关键类型,并且知道不用我们实现自己的IObserver<T>或IObservable<T>对象,使用Create方法即可。但即使是了解了这些,是否仍然是想要开始写一些RX代码却不知如何开始?在我们有了一个observable sequenc(可观测物队列)之后,要如何从中挑选出想要的数据?我们需要从底层了解创建可观测物队列,并从中获取想要的值。
在第二部分中我们将学习如何构建和查询可观测物队列,而linq是理解和使用RX的基础。深入后,我们又发现函数式编程的概念是深度理解linq和掌握RX的核心。为了支持这种理解,我们把查询操作分为三个主要的种类,每种都有一个其他操作器可以操作的根操作器。这不仅提供了一个深入了解RX的机会,还可以提高你创造一般RX操作器不具备能力的自定义操作器的能力。
Creating a sequence
在上一章中我们使用了第一个扩展方法:Subscribe方法及其重载。我们也看到了第一个工厂方法Subscribe.Create()。我们开始寻找大量的能够丰富RX的IObservable<T>的其他方法。RX库中的公共实例方法很少,但却有大量的公共静态方法,更具体的说,大部分都是扩展方法。由于方法和重载的数量非常多,我们需要将其分类以便于理解。
从我们对关键类型的了解来看,直接(使用new关键字来构造)构造subjects实例乎是明智的,但这里我们将要介绍的第一类方法将会是创建型方法:用于创建IObservable<T>实例的更简单的方法。这些方法通常需要一个seed(种子)来生成sequence(队列):将某个类型的一个实例,或其类型自身作为参数传入。在函数式编程中这被成为anamorphism,或者unfold。
Simple factory methods
Observable.Return
第一个例子我们介绍创建型方法中的Observable.Return<T>(T value)。它接受一个泛型参数T,并在返回一个IObservable<T>后Completed。它unfolded了一个T类型的值到一个observable sequenc(可观测物队列)中:
上面的例子中,工厂方法和ReplaySubject都可以达到同样的效果,但工厂方法只需要一行代码,且支持声明式的函数式编程风格。我们也可以不指定类型为string,因为有类型推断机制可以自动判断:
暂无关于此日志的评论。