【问题标题】:C# automatically apply ToLower to method string parameter?C# 自动将 ToLower 应用于方法字符串参数?
【发布时间】:2013-03-24 09:02:18
【问题描述】:

有没有办法让 C# 编译器在特定方法参数在方法中使用之前自动将 ToLower()(或任何其他操作方法调用)应用于特定方法参数?

//附加信息:其目的是使用带有不区分大小写键的字典。显然,我的第一种方法是完全错误的,因为我已经找到了一种完全不同的方法来解决字典本身,而不是访问它的键。

我的错!我应该向你提供这些信息。因此,无需进一步回答。无论如何,非常感谢!

在这种特殊情况下更好的方法:c# Dictionary: making the Key case-insensitive through declarations

【问题讨论】:

  • 不,除非您编写自己的 LoweredString 类或增加程序复杂性 X10 以包含方面...
  • 您能提供您的示例代码吗?
  • 您能否详细说明您要做什么?
  • 我不知道您的应用程序是什么,但我认为使用string 作为key 可能是您当前设计的一个缺陷。每当我们提出任何可能的缺陷时,我总是认为这是一个没有经过适当测试的设计缺陷。需要勾选distinct key,通过特定key取值也需要时间。

标签: c# tolower


【解决方案1】:

不,C# 编译器不会为您执行此操作(为什么要针对这样的特定要求对其进行定制?),但是您可以通过编写一个简单的包装器 struct 来完成此操作string

struct LowerCaseString
{
    public LowerCaseString(string value)
    {
        this.value = value.ToLower();
    }

    private readonly string value;

    public static implicit operator LowerCaseString(string value)
    {
        return new LowerCaseString(value);
    }

    public override string ToString()
    {
        return value;
    }

    … // perhaps implement IEquatable<>, IComparable<>, etc.
}

隐式转换运算符允许您编写如下代码:

Foo("Hello world.");

void Foo(LowerCaseString text)
{
    Console.WriteLine(text);
}

虽然这如您所料,但这种方法有一些缺点:

  • 对性能的影响很小(可能可以忽略不计),因为必须在字符串周围实例化包装器对象。

  • 对于您的代码的其他用户来说,存在隐式转换运算符可能并不明显,因此他们最终改写为 new LowerCaseString("Hello world.")。如果您的团队经常使用它,使用 Visual Studio 的对象浏览器查看该类可能会解决此问题。

  • 此包装器不允许您指定用于.ToLower()CultureInfo。你想用CurrentCulture,还是InvariantCulture,还是其他的?

【讨论】:

  • 对于我的第一种抽象问题,这是一个很好的方法。然而,对于我更具体的需求,有更好的方法来实现它。无论如何,我认为,关于始终小写字符串的抽象问题,这是我书中最好的方法。谢谢。
【解决方案2】:

不使用某种 AOP,不。

PostSharp 就是这样一种工具,但它增加了复杂性、隐藏代码和更长的编译时间。

ToLower 直接应用在方法中 的参数上要简单得多,或者使用预先调用ToLower 的方法包装对方法的所有调用。

【讨论】:

    【解决方案3】:

    一些 AOP 工具,例如 PostSharp,可以做到这一点。

    但请确认这是否真的是您想要的,没有更简单、更清洁的方法。

    【讨论】:

    • 是的,我实际上是在寻找一些更清洁、更简单的方法......我猜 PostSharp 有点过于繁重了。
    • 然后给我们一些关于你想要达到的目标的更多细节
    【解决方案4】:

    您可以按照其他人的建议完成此操作 - 通过 AOP。但是,如果情况只是传递小写字符串,这将变得太复杂并且不值得付出努力(在我看来)。

    您应该提供有关此事的更多信息,但我相信有更简单的方法可以实现您的目标。看看内置的字符串比较器类 - 如果您需要小写字符串进行比较,StringComparer.OrdinalIgnoreCase 可能适合您的目的。 如果您需要以小写格式向用户显示字符串,那么这是显示字符串的代码的职责,而不是业务逻辑。

    【讨论】:

      猜你喜欢
      • 2011-03-25
      • 1970-01-01
      • 2015-06-21
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多