C#StringComparer:可选参数默认值

时间:2013-05-16 10:02:36

标签: c# string extension-methods default-value

我正在尝试创建一个方法来检查String是否包含Strings中包含的任何IEnumerable<String>。到目前为止,我的方法是:

public static Boolean ContainsAny(this String Self, IEnumerable<String> Fragments, StringComparer CompareType = StringComparer.CurrentCulture)
{
    foreach (var fragment in Fragments)
    {
        if (Self.Contains(fragment,CompareType))
        {
            return true;
        }
    }
    return false;
}

但是,这不会编译,因为StringComparer.CurrentCulture没有编译时常量,如此错误所示:

> Error 1   Default parameter value for 'CompareType' must be a
> compile-time constant

我的问题是,我可以用于CompareType的可接受的默认值是什么,这会产生相同的行为,就好像它可以默认为StringComparer.CurrentCulture一样?

2 个答案:

答案 0 :(得分:3)

处理非编译时常量的常用技巧是将检查移动到运行时,如下所示:

public static Boolean ContainsAny(
    this String self
,   IEnumerable<String> fragments
,   StringComparer comparerArg = null)
{
    var comparer = comparerArg ?? StringComparer.CurrentCulture;
    ...
}

您使null成为方法签名中的默认值,然后您检查的第一件事是传递的值是null,在这种情况下,您将其替换为StringComparer.CurrentCulture。请注意,为了使这个技巧起作用,null必须不是一个合理地想要传递给您的方法的有效参数,并且您的文档应该说传递null等同于传递{{ 1}}。

答案 1 :(得分:2)

最简单,最干净,最一致的(使用框架)是有重载:

public static Boolean ContainsAny(this String Self, IEnumerable<String> Fragments)
{
    returns ContainsAny(Self, Fragments, StringComparer.CurrentCulture);
}

public static Boolean ContainsAny(this String Self, IEnumerable<String> Fragments, StringComparer CompareType)
{
    foreach (var fragment in Fragments)
    {
        if (Self.Contains(fragment,CompareType))
        {
            return true;
        }
    }
    return false;
}

如果你只想要一个重载,那么可能是:

public static Boolean ContainsAny(this String Self, IEnumerable<String> Fragments, StringComparer CompareType = null)
{
    if (CompareType == null)
        ComapreType = StringComparer.CurrentCulture;

    foreach (var fragment in Fragments)
    {
        if (Self.Contains(fragment,CompareType))
        {
            return true;
        }
    }
    return false;
}

建议:

  1. 使用bool等语言别名而不是Boolean。它推荐并使代码简短。

  2. 在C#中,参数名称以小写字母(camelCase)

  3. 开头
  4. 如果你有Linq,代码就像:

    一样甜蜜
    return Fragments.Any(x => self.Contains(x, compareType));