构造函数可以无效创建自己的对象吗?

时间:2013-01-14 19:11:45

标签: c#

我正在使用以下声明。

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. 是否广泛应用?

6 个答案:

答案 0 :(得分:4)

您应该使用您现在使用的代码。从可用性的角度来看,WhereSelect 很多更好,然后Select有时将项目映射到null(或其他一些) “不是真正的项目”占位符,当他们不应该首先在那里。你只需要在路上摆脱或忽略这些空项目。

你做了两件事;将项目过滤到满足条件的项目,然后将每个项目映射到另一种类型的项目。你的代码应该反映出你正在做这两件事。

答案 1 :(得分:1)

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

我不建议在创建对象时阻止构造/销毁对象 - 通常构建对象应该会成功。不像其他答案中建议的那样调用构造函数是更清晰的方法。

答案 2 :(得分:0)

  

有可能吗?

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

  

是否推荐?

我无法推荐或不推荐。但从代码审查的角度来看,它看起来很麻烦和狡猾。

  

它被广泛应用吗?

未见广泛应用。 Null object pattern更为人所知。

答案 3 :(得分:0)

  1. No'ish(取决于一些额外的特殊情况,可能是最好的方法)。
  2. 从未见过它。但是很酷的想法。

答案 4 :(得分:0)

您提问,请注意new Nullable<int>()返回null

但我想重复what Servy said - 您当前的代码很好。不要过于复杂!

答案 5 :(得分:-1)

我认为你所拥有的可能是最好的。但是如果你开始组合它们,你可以使用这样的扩展方法:

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))