изменить 2015 Этот вопрос и его ответы больше не актуальны. Он был задан до появления С# 6, который имеет нулевой передатчик (?.), Который устраняет хакерские обходные пути, обсуждаемые в этом вопросе и последующих ответах. Начиная с 2015 года, в С# вы должны теперь использовать Form.ActiveForm?.ActiveControl?.Name.
Я думал о проблеме распространения NULL в .NET, что часто приводит к уродливому, повторяемому коду, подобному этому:
Попытка # 1 обычный код:
string activeControlName = null;
var activeForm = Form.ActiveForm;
if (activeForm != null)
{
var activeControl = activeForm.ActiveControl;
if(activeControl != null)
{
activeControlname = activeControl.Name;
}
}
Было несколько обсуждений в StackOverflow о возможностях <T> monad, или используя какой-либо метод расширения "если не нуль":
Попытка # 2, метод расширения:
// 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;
}
Я думаю, что это лучше, однако, есть немного синтаксической беспорядка с повторяющимися "IfNotNull" и лямбдами. Я сейчас рассматриваю этот дизайн:
Попытка # 3, Maybe <T> с расширением
// 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);
}
}
Мой вопрос: это злое злоупотребление методами расширения? Это лучше, чем старые обычные нулевые проверки?