首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# StringComparer:可选参数默认值

C# StringComparer:可选参数默认值
EN

Stack Overflow用户
提问于 2013-05-16 18:02:36
回答 2查看 339关注 0票数 1

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

代码语言:javascript
复制
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不是编译时间常量,如以下错误所示:

代码语言:javascript
复制
> Error 1   Default parameter value for 'CompareType' must be a
> compile-time constant

我的问题是,我可以为CompareType使用的可接受的缺省值是多少,它的行为与将其缺省为StringComparer.CurrentCulture的行为是一样的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-16 18:06:05

最简单、最干净、最一致的(对于框架)是重载:

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
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。C#参数名称中的
  2. 以小写字母(CamelCase)开头
  3. 如果你有Linq,代码就像:

compareType)); Fragments.Any(x => self.Contains(x,return

票数 2
EN

Stack Overflow用户

发布于 2013-05-16 18:05:46

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

代码语言:javascript
复制
public static Boolean ContainsAny(
    this String self
,   IEnumerable<String> fragments
,   StringComparer comparerArg = null)
{
    var comparer = comparerArg ?? StringComparer.CurrentCulture;
    ...
}

您在方法签名中将null设为默认值,然后首先检查传递的值是否为null,在这种情况下,您可以将其替换为StringComparer.CurrentCulture。请注意,为了让这个技巧起作用,null不能是人们合理地希望传递给您的方法的有效参数,并且您的文档应该说明传递null等同于传递StringComparer.CurrentCulture

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16584460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档