2014-01-10 21 views
-1

随着串类,我们能够调用方法此起彼伏这样的:如何.NET串类的工作

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

我想知道它是如何工作的?这是什么类型的操作在.net框架中调用。

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

感谢,

回答

6

每到这个方法返回新的字符串,所以basicaly这是呼吁返回字符串字符串的方法。您可以创建自己的类,创建方法并像这样运行它。

非常重要的是要注意到字符串是不可变的,所以要求例如字符串上的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(); 
+4

除了这些都不是扩展方法,他们只是返回一个新的字符串! –

+0

@ Moo-Juice扩展方法可以返回新字符串!扩展方法确实不需要更改值 – wudzik

+0

!但是OP给出的例子是字符串类的成员,而不是扩展方法。 :) –

0

很简单。字符串是一个不可变的类。这意味着你在它上面进行的每个操作都会转换它的值,因此需要返回一个新的不同的String实例(因为当前的实例不能被更改)。您可以拨打另一个操作...

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

这不一定与不变性。您可以在可变类上编写方法链方法,并且可以编写不带方法链的方法的不可变类。 – Rawling

+0

@Rawling你不能编写一个改变值而不用方法链接的不可变类。这就是字符串。 – i3arnon

6

这没什么特别的。 string类的许多方法都会返回一个字符串,因此您可以在返回的值上调用其他方法。

例如TrimStart()返回一个新的字符串,其中白空间在开始时已被剥离。然后你在那个返回的字符串上调用TrimEnd()

有时这叫做Fluent interfacemethod chaining

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"); 
1

背后你看到什么叫做Method Chaining委托人(或者也是流畅的界面)。

它的工作原理,因为该方法返回相同类型作为其含有式(即TrimStart是String类的功能,并且还返回一个字符串)。但是,这不仅限于Strings。

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

0

简单的返回结果与每一个操作,如果结果是相同类型的,那么你可以调用结果的方法,那么结果的结果的方式等

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

A.SomeMethod().SomeMethod()...