【问题标题】:IQueryable & ref keyword (adding a where clause)IQueryable & ref 关键字(添加 where 子句)
【发布时间】:2016-01-29 11:45:13
【问题描述】:
IQueryable<SomeType> cases;

如果我想在 case 查询中添加 where 子句,我有两个选择,但我不知道哪个更好。

可能是:

cases = SomeFunction(cases);
...
private IQueryable<SomeType> SomeFunction(IQueryable<SomeType> cases)
{
  return cases.Where(whatever);
}

SomeFunction(ref cases)
...
private void SomeFunction(ref IQueryable<SomeType> cases)
{
cases = cases.Where(whatever);
}

【问题讨论】:

  • 不要使用参考。使用第一个。
  • 另外,使用第一个选项,您甚至可以通过将SomeFunction 作为IQueryable&lt;SomeType&gt; 的扩展方法来链接这些调用。

标签: c# parameters iqueryable ref


【解决方案1】:

我会说第一个更好,因为它允许“流畅”的使用和链接,例如:

IQueryable<SomeType> cases = ...;
(SomeCondition ? SomeFunction(cases) : cases).Where(...).OrderBy(...) etc.

【讨论】:

    【解决方案2】:

    我会使用不带 ref 的版本,因为它使调用者可以灵活地保留原始查询,而无需在调用您的函数之前获取其参考的副本。

    您的调用者可能想要编写如下代码:

    var cases = CreateQueryToFindCases();
    var casesFilterdBySomthing = FilterBySomething(cases);
    

    而不是

    var cases = CreateQueryToFindCases();
    var casesFilterdBySomthing = cases;
    FilterBySomething(ref casesFilterdBySomthing );
    

    他们甚至可能想要嵌套这样的函数调用,而这对于 ref 传递的参数来说是不容易做到的:

    var casesFilterdBySomthing = FilterBySomething(CreateQueryToFindCases());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-21
      • 2022-12-19
      • 1970-01-01
      • 2015-07-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多