构造函数是否可以取消创建自己的对象
本文关键字:创建 自己的 对象 取消 是否 构造函数 | 更新日期: 2023-09-27 17:52:54
我正在使用以下语句。
IEnumerable<Stuff> output = list.Entities.Select(
element => new Stuff(element));
有时元素不需要包含,所以我添加了一个条件。
IEnumerable<Stuff> output = list.Entities.Where(
element => IsDecent(element)).Select(
element => new Stuff(element));
现在,我突然想到,跳过检查器并创建一个新的Stuff以生成nada(返回null或根本不返回任何内容(可能会更整洁,因此省略了不雅元素的添加。或者在满足这样的条件时自动调用析构函数。当然,检查需要在其他地方执行,即在Stuff的构造函数中执行。
- 有可能吗
- 是否推荐
- 它是否被广泛应用
您应该使用现在正在使用的代码。从可用性的角度来看,Where
和Select
要好得多,而Select
有时会将项目映射到null
(或其他一些"非真实项目"占位符(,而这些项目本来就不应该在那里。你只需要去掉或忽略那些无效的项目。
你在做两件事;将项目筛选为符合条件的项目,然后将每个项目映射到另一种类型的项目。您的代码应该反映您正在做这两件事的事实。
否,除了从new返回构造的对象之外,不可能返回任何内容。您可以从构造函数抛出,从而阻止创建特定对象,但必须处理此类异常。
我不建议在创建对象时尝试阻止构建/销毁对象——通常情况下,对象的构建有望成功。不按照其他答案中的建议调用构造函数是一种更干净的方法。
有可能吗?
是的,这是可能的。但需要条件验证(Where子句将转换为Select子句(
是否推荐?
我不能推荐也不能不推荐。但从代码审查的角度来看,它看起来有缺陷和不可靠。
它是否被广泛应用?
未被广泛应用。空对象模式更为人所知。
- 是的
- No'ish(根据一些额外的utlra超级特殊情况,它可能是最好的方法(
- 从没见过。不过我觉得很酷
既然您询问,请注意new Nullable<int>()
返回null
。
但我想重复一下Servy所说的——您当前的代码很好。不要把它复杂化!
我认为您拥有的可能是最好的。但如果你打算将它们组合在一起,你可以使用这样的扩展方法:
static class Extensions {
public static IEnumerable<U> SelectWhere<T, U>(
this IEnumerable<T> @this,
Predicate<T> filter,
Func<T, U> map)
{
foreach (T element in @this) {
if (filter(element)) yield return map(element);
}
}
}
你会这样使用它:
list.Entities.SelectWhere(IsDecent, element => new Stuff(element))