2014-01-10 20 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()...