【问题标题】:How does .net string class works [duplicate].net 字符串类如何工作 [重复]
【发布时间】:2014-01-29 07:10:03
【问题描述】:

使用字符串类,我们可以像这样一个接一个地调用方法:

originalString.TrimStart().TrimEnd().Replace("Hello","Hi")

我想知道它是如何工作的?以及在 .net 框架中这种操作称为什么。

如果你能给我一个创建这样一个类的例子,我将不胜感激。

谢谢,

【问题讨论】:

    标签: c# string function class methods


    【解决方案1】:

    上述方法均返回字符串。所以这只是类型问题。

    你可以像这样创建自己的类-

    类定义

    public class FooString
        {
    
            public FooString Test1()
            {
                return this;
            }
    
            public FooString Test2()
            {
                return this;
            }
    
            public FooString Test3(string someString)
            {
                return this;
            }
    
        }
    

    方法调用

    FooString test = new FooString();
    test.Test1().Test2().Test3("Some string");
    

    【讨论】:

      【解决方案2】:

      每次操作只返回结果,如果结果是同一类型,则可以调用结果的方法,然后调用结果的方法等。

      public class A
      {
          public A SomeMethod();
          ...
      }
      
      A.SomeMethod().SomeMethod()...
      

      【讨论】:

        【解决方案3】:

        这个方法中的每一个都返回新的字符串,所以基本上这是在返回字符串的字符串上调用的方法。您可以创建自己的类,创建方法并像这样运行它。

        非常重要的是要注意字符串是不可变的,因此调用例如字符串上的Trim 不会改变它。

        public string Trim()
        {
          return this.TrimHelper(2);
        }
        

        这就是Trim 的样子,没有魔法只是简单的方法。

        如果你的类不是不可变的,最好的方法是为你的类创建扩展方法。你可以阅读更多关于扩展方法here

        普通方法示例

        public class Test
        {
            public int Prop {get;set;}
        
            public Test DoStuf()
            {
                Prop=1;
                return this;
            }
        
            public Test DoOtherStuff()
            {
               return new Test();
            }
        }
        

        并使用它:

        var test = new Test();
        test.DoStuff().DoOtherStuff();
        

        【讨论】:

        • 除了这些不是扩展方法,它们只是返回一个新字符串!
        • @Moo-Juice 扩展方法可以返回新字符串!扩展方法不需要改变值
        • 确实!但是OP给出的示例是字符串类的成员,而不是扩展方法。 :)
        • @Moo-Juice 好的,我的错误,已更正。感谢您的关注
        • 其实,OP 正在询问如何创建这样的东西的示例,因此扩展方法将是一个不错的选择。
        【解决方案4】:

        您所看到的背后的主体称为Method Chaining(或也称为流利界面)。

        之所以有效,是因为该方法返回与其包含类型相同的类型(即,TrimStart 是 String 类上的一个函数,并且还返回一个 String)。然而,这不仅限于字符串。

        我能想到的最好的现代示例之一是 jQuery(在维基百科文章中提到)。

        【讨论】:

          【解决方案5】:

          这没什么特别的。 string 类的很多方法都返回一个字符串,所以你可以在返回值上调用其他方法。

          例如TrimStart() 返回一个新字符串,其中的空格在开始时已被去除。然后在返回的字符串上调用TrimEnd()

          有时这称为Fluent interfacemethod chaining

          【讨论】:

            【解决方案6】:

            这很简单。 String 是一个不可变的类。这意味着您对其执行的每一个转换其值的操作都需要返回一个新的不同的 String 实例(因为当前的实例无法更改)。您可以在其上调用另一个操作等等...

            string newString = originalString.Replace("Hello","Hi") // new instance
            int length = newString.Length // a simple property.
            

            【讨论】:

            • 这不一定与不变性有关。您可以在可变类上编写方法链方法,也可以编写没有方法链方法的不可变类。
            • @Rawling 你不能编写一个不可变的类来改变没有方法链的值。这就是字符串。
            猜你喜欢
            • 2013-05-02
            • 1970-01-01
            • 2014-04-22
            • 2015-03-29
            • 2021-04-28
            • 1970-01-01
            • 2012-01-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多