[英]Wrap Observable.FromEventPattern with Observable.Create
這之間的區別(取自GitHub 上的 RxCookbook ):
public static IObservable<TProperty> OnPropertyChanges<T, TProperty>(this T source, Expression<Func<T, TProperty>> property)
where T : INotifyPropertyChanged
{
return Observable.Create<TProperty>(o=>
{
var propertyName = property.GetPropertyInfo().Name;
var propertySelector = property.Compile();
return Observable.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>(
handler => handler.Invoke,
h => source.PropertyChanged += h,
h => source.PropertyChanged -= h)
.Where(e => e.EventArgs.PropertyName == propertyName)
.Select(e => propertySelector(source))
.Subscribe(o);
});
}
還有這個(我自己寫的):
public static IObservable<TProperty> OnPropertyChanges<T, TProperty>(this T source, Expression<Func<T, TProperty>> property)
where T : INotifyPropertyChanged
{
var propertyName = property.GetPropertyInfo().Name;
var propertySelector = property.Compile();
return Observable.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>(
handler => handler.Invoke,
h => source.PropertyChanged += h,
h => source.PropertyChanged -= h)
.Where(e => e.EventArgs.PropertyName == propertyName)
.Select(e => propertySelector(source));
}
我認為在第二個代碼塊中,當OnPropertyChanges
被調用時, propertyName
和propertySelector
將被評估,並且在第一個塊中,每當有人訂閱可觀察對象時,這些變量將被評估。 但是,我無法弄清楚第一個塊是否/為什么比第二個更可取,以及為什么第一個塊的作者決定使用Observable.Create
。
來自GitHub上第一塊代碼的作者的回答:
我對此的立場是調用返回 IObservable 的方法不應該做任何事情。 應該調用任何副作用或處理的是對該返回值的訂閱。
如果訂閱成本需要在多個訂閱之間分攤,則應應用 Rx 中的各種多播選項。
在這種特定情況下,這個論點很弱,但是它會混淆模式並為其他方法打開大門,無需訂閱即可“工作”。 我認為這是一個非常常見的錯誤,也是競爭條件和資源泄漏的根源(想想打開連接、啟動計時器等)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.