J'ai pensé à le nul de la propagation de problème .NET, ce qui conduit souvent à laide, répété code comme ceci:
Tentative n ° 1 code habituel:
string activeControlName = null;
var activeForm = Form.ActiveForm;
if (activeForm != null)
{
var activeControl = activeForm.ActiveControl;
if(activeControl != null)
{
activeControlname = activeControl.Name;
}
}
Il y a eu quelques discussions sur StackOverflow sur un Peut-être<T> monade, ou en utilisant une sorte de "si ce n'null" méthode d'extension:
Tentative n ° 2, la méthode d'extension:
// Usage:
var activeControlName = Form.ActiveForm
.IfNotNull(form => form.ActiveControl)
.IfNotNull(control => control.Name);
// Definition:
public static TReturn IfNotNull<TReturn, T>(T instance, Func<T, TReturn> getter)
where T : class
{
if (instance != null ) return getter(instance);
return null;
}
Je pense que c'est mieux, cependant, il y a un peu de désordre syntaxique-ness avec la répétition de "IfNotNull" et les lambdas. Je suis en train de réfléchir à cette conception:
Tentative n ° 3, Peut-être<T> avec la méthode d'extension
// Usage:
var activeControlName = (from window in Form.ActiveForm.Maybe()
from control in window.ActiveControl.Maybe()
select control.Name).FirstOrDefault();
// Definition:
public struct Maybe<T> : IEnumerable<T>
where T : class
{
private readonly T instance;
public Maybe(T instance)
{
this.instance = instance;
}
public T Value
{
get { return instance; }
}
public IEnumerator<T> GetEnumerator()
{
return Enumerable.Repeat(instance, instance == null ? 0 : 1).GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
public static class MaybeExtensions
{
public static Maybe<T> Maybe<T>(this T instance)
where T : class
{
return new Maybe<T>(instance);
}
}
Ma question est: est-ce un mal d'abus de méthodes d'extension? Est-il mieux que l'ancienne habitude null chèques?