Какая разница между этим (взято из RxCookbook на GitHub ):
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));
}
Я думаю, что во втором блоке кода propertyName
и propertySelector
будут оцениваться при вызове OnPropertyChanges
, а в первом блоке эти переменные будут оцениваться каждый раз, когда кто-то подписывается на наблюдаемое. Однако я не могу понять, является ли / почему первый блок предпочтительнее второго, и почему автор первого блока решил использовать Observable.Create
.