构造函数是否可以取消创建自己的对象

本文关键字:创建 自己的 对象 取消 是否 构造函数 | 更新日期: 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的构造函数中执行。

  1. 有可能吗
  2. 是否推荐
  3. 它是否被广泛应用

构造函数是否可以取消创建自己的对象

您应该使用现在正在使用的代码。从可用性的角度来看,WhereSelect要好得多,而Select有时会将项目映射到null(或其他一些"非真实项目"占位符(,而这些项目本来就不应该在那里。你只需要去掉或忽略那些无效的项目。

你在做两件事;将项目筛选为符合条件的项目,然后将每个项目映射到另一种类型的项目。您的代码应该反映您正在做这两件事的事实。

否,除了从new返回构造的对象之外,不可能返回任何内容。您可以从构造函数抛出,从而阻止创建特定对象,但必须处理此类异常。

我不建议在创建对象时尝试阻止构建/销毁对象——通常情况下,对象的构建有望成功。不按照其他答案中的建议调用构造函数是一种更干净的方法。

有可能吗?

是的,这是可能的。但需要条件验证(Where子句将转换为Select子句(

是否推荐?

我不能推荐也不能不推荐。但从代码审查的角度来看,它看起来有缺陷和不可靠。

它是否被广泛应用?

未被广泛应用。空对象模式更为人所知。

  1. 是的
  2. No'ish(根据一些额外的utlra超级特殊情况,它可能是最好的方法(
  3. 从没见过。不过我觉得很酷

既然您询问,请注意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))