- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在阅读 Head First Design Patterns 一书,并尽力将代码从他们的 Java 转换为 C#。在这本书讨论了观察者模式之后,它提到 Java 具有内置的类/接口(interface),.NET4 也是如此。所以我开始研究如何正确使用它,除了 Subscribe()
方法外,我已经弄明白了大部分内容。
如果您查看 MSDN Article当您尝试订阅 IObserver 时,该方法返回一个 IDisposable。为什么那是必要的?为什么不只实现一个基于方法参数取消订阅 IObserver 的方法呢? I researched the reason to use an IDisposable interface .我也读过这篇文章,但不太明白其中的区别/它想告诉我什么:
It returns a reference to an IDisposable interface. This enables observers to unsubscribe (that is, to stop receiving notifications) before the provider has finished sending them and called the subscriber's OnCompleted method.
最佳答案
取消订阅所需的信息因事件发布者管理订阅的方式而异。用于事件的方法——将委托(delegate)先前传递给 Add
方法的委托(delegate)传递给 Remove
方法——有点可行,但有一些明显的缺陷。其中:
让事件订阅方法返回一个可用于取消订阅的对象可以避免这些问题。那么最大的问题就变成了应该使用什么类型的对象。我想到了三个选择:
使用委托(delegate)是一个合理的选择。它可以很容易地封装取消订阅所需的任何信息,而用户不必担心该信息可能采用什么形式。使用委托(delegate)将需要分配至少一个额外的堆对象(对于委托(delegate)本身),可能还有两个(第二个是保存取消订阅信息的对象)。使用 IDisposable
本质上与使用委托(delegate)相同,不同之处在于委托(delegate)调用 Dispose
而不是 Invoke
;但是,在许多情况下,IDisposable
在效率方面会稍有优势。使用其他一些接口(interface)也是可行的,但与使用现有的 IDisposable
相比并没有真正的优势。
关于c# - 在 IObservable<T> 接口(interface)中返回 IDisposable 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10625815/
我对这个错误很困惑: Cannot implicitly convert type 'System.Func [c:\Program Files (x86)\Reference Assemblies\
考虑这段代码: pub trait Hello { fn hello(&self); } impl Hello for Any { fn hello(&self) {
问题很简单。是否可以构造这样一个类型 T,对于它下面的两个变量声明会产生不同的结果? T t1 = {}; T t2{}; 我已经研究 cppreference 和标准一个多小时了,我了解以下内容:
Intellij idea 给我这个错误:“Compare (T, T) in Comparator cannot be applied to (T, T)” 对于以下代码: public class
任何人都可以告诉我 : n\t\t\t\t\n\t\t\t 在以下来自和 dwr 服务的响应中的含义和用途是什么. \r\n\t\t\t \r\n\t\t\t
让 T 成为一个 C++ 类。 下面三个指令在行为上有什么区别吗? T a; T a(); T a = T(); T 为不带参数的构造函数提供了显式定义这一事实是否对问题有任何改变? 后续问题:如果
Rust中的智能指针是什么 智能指针(smart pointers)是一类数据结构,是拥有数据所有权和额外功能的指针。是指针的进一步发展 指针(pointer)是一个包含内存地
比如我有一个 vector vector > v={{true,1},{true,2},{false,3},{false,4},{false,5},{true,6},{false,7},{true,8
我有一个来自 .xls 电子表格的数据框,我打印了 print(df.columns.values) 列,输出包含一个名为:Poll Responses\n\t\t\t\t\t。 我查看了 Excel
This question already has answers here: What are good reasons for choosing invariance in an API like
指针类型作为类型前缀与在类型前加斜杠作为后缀有什么区别。斜线到底是什么意思? 最佳答案 语法 T/~ 和 T/& 基本上已被弃用(我什至不确定编译器是否仍然接受它)。在向新向量方案过渡的初始阶段,[T
我正在尝试找到一种方法来获取模板参数的基类。 考虑以下类: template class Foo { public: Foo(){}; ~Foo(){};
这是一个让我感到困惑的小问题。我不知道如何描述它,所以只看下面的代码: struct B { B() {} B(B&) { std::cout ::value #include
为什么有 T::T(T&) 而 T::T(const T&) 更适合 copy ? (大概是用来实现move语义的???) 原始描述(被melpomene证明是错误的): 在C++11中,支持了一种新
在 Java 7 中使用 eclipse 4.2 并尝试实现 List 接口(interface)的以下方法时,我收到了警告。 public T[] toArray(T[] a) { ret
假设有三个函数: def foo[T](a:T, b:T): T = a def test1 = foo(1, "2") def test2 = foo(List(), ListBuffer()) 虽
我对柯里化(Currying)和非柯里化(Currying)泛型函数之间类型检查的差异有点困惑: scala> def x[T](a: T, b: T) = (a == b) x: [T](a: T,
考虑一个类A,我如何编写一个具有与相同行为的模板 A& pretty(A& x) { /* make x pretty */ return x; } A pretty(A&& x) {
Eclipse 表示由于泛型类型橡皮擦,类型参数不允许使用 instanceof 操作。 我同意在运行时不会保留任何类型信息。但是请考虑以下类的通用声明: class SomeClass{ T
在 C++14 中: 对于任何整数或枚举类型 T 以及对于任何表达式 expr: 有没有区别: struct S { T t { expr }; }; 和 struct S { T t = { exp
我是一名优秀的程序员,十分优秀!