覆盖字符串的方括号运算符?

时间:2016-12-08 10:46:02

标签: c# override overloading

我尝试更改方括号运算符的行为。 现在我的问题是,如果它甚至可以做到这一点。

我知道我可以用这样的东西为String创建一个扩展方法:

public static class StringExtension
{
    public static char Substring(this string value, int position)
    {
        //do something
    }
}

但是如何覆盖方括号运算符? 这不会起作用:

public static class StringExtension
{
    public static char this[this string value, int position]
    {
        //do something
    }
}

怎么做呢。或者甚至可能吗?

1 个答案:

答案 0 :(得分:2)

让我们一次处理一个概念。

The square bracket operators用于索引聚合对象:

  • 阵列
  • 对象的索引器属性

此外,它们用于表示属性,但这与此答案无关。

现在,字符串不是数组,因此字符串对象具有this[...]属性。

您的问题:“如何覆盖方括号运算符?”有这个答案:简单地说,你可以覆盖任何其他属性,提供,你可以:

  1. 继承自声明它的类型
  2. 覆盖它,因为它是虚拟的
  3. 实际上是因为你可以在构造对象而不是原始基类型时使用新的后代类型来获得效果
  4. 对于字符串,标准都是禁止的:

    1. 您不能从字符串继承,它是密封类型,并且主要包含用于性能考虑的外部代码
    2. 由于类型是密封的,因此虚拟成员没有意义
    3. 在大型代码中构造字符串时,不能替换System.String类型的使用。
    4. 对于字符串,覆盖这个?不,不能做。

      然后,您展示了一个示例,它与扩展方法的语法类似。

      在继续之前回顾一下:

      • 覆盖,我们讨论继承和多态(基类中的虚拟成员)
      • 扩展使用扩展方法的内容,您可以为现有类型提供额外的方法,而无需修改所述类型

      是的,您肯定可以向字符串添加扩展方法,但是您无法提供扩展属性(尚未)

      新的Roslyn编译器项目有很多为它建议的功能,包括Extension Everything功能,可以解决这个问题。但是,它尚未决定,也没有计划或实施。

      你可以创建一个普通的扩展方法,你无法重新定义,覆盖或扩展[...]运算符所做的事情。

      public static class StringExtension
      {
          public static char CharAt(this string value, int position)
          {
              //do something
          }
      }
      

      用法:

      string s = "Test";
      char c = s.CharAt(2);
      
相关问题