我有以下扩展方法来帮助我检查和实例化对象(如果它们为空)。前两个工作正常,但不是很有用。
public static bool IsNull<T>(this T t)
{
return ReferenceEquals(t, null);
}
public static T NewIfNull<T>(this T t, Func<T> createNew)
{
if (t.IsNull<T>())
{
return createNew();
}
return t;
}
public static void Ensure<T>(this T t, Func<T> createNew)
{
t = t.NewIfNull<T>(createNew);
}
最终我想做一些类似的事情
IList<string> foo;
...
foo.Ensure<IList<string>>(() => new List<string>());
然而 Ensure 方法并没有达到预期的效果,这是设置foo
到一个实例List<string>
如果它为空,则基本上将其设置为自身,否则。
如果您现在知道我可以调整 Ensure 方法来实现此目的,我将不胜感激。
谢谢,汤姆
你需要区分objects and 变量。对象永远不能为空——变量的值可以。你并不是想改变一个对象的某些东西(wouldwork) - 您正在尝试更改调用者变量的值。
但是,默认情况下参数是按值传递的,这意味着您的扩展方法会更改范围(方法内声明的变量),但这对caller's多变的。通常您可以将参数更改为ref
实现按引用传递语义,但扩展方法不能有ref
or out
第一个参数。
正如其他人所说,使用空合并运算符 (??) http://msdn.microsoft.com/en-us/library/ms173224.aspx是一个更好的选择。请注意,在此表达式中:
foo = foo ?? new List<string>();
新列表是not建造除非foo
一片空白。的右手操作数??
除非需要,否则不会进行评估。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)