2012-07-02 30 views
3

也許問題聽起來不好或太簡單。但在這種情況下不適合我。字符串擴展返回C#中該字符串的意外值。

我的問題是: 我創建的字符串的擴展,像

public static void SetString(this string aString, string anotherString) { 

     aString = anotherString ; 

     // process info for that string ... (database, files, etc) 
     } 

如果我稱之爲擴展,如:

string anExistingString = "123"; 
anExistingString.SetString("Other value"); 

Console.Write(anExistingString); 

但返回123而不是Other value ......

我的錯誤在哪裏?

+3

C#不工作這辦法。 IOW,你根本無法做到這一點(你可以用一些技巧)。 – leppie

+0

'anExistingString =「其他值」;'似乎waaaaaaaaaaay比'anExistingString.SetString(「其他值」);'更易讀,更直觀。你不會在C#中使用內置賦值運算符的任何特定原因? –

+0

我不明白需要這樣做,當字符串myString =「其他值」完全相同的事情。沒有必要過於複雜的東西沒有特殊功能。 – CSharpened

回答

3

這不可能作爲擴展方法。對類變量是按值傳遞,以分配一個新值的方法傳遞一個值,你需要使用一個ref參數:

public void SetString(ref string aString, string anotherString) 
{ 
    aString = anotherString; 
} 

我個人認爲refout參數代碼氣味,它通常意味着該方法負責不止一件事或正在做它不應該做的事情。在你的例子中,賦值比調用方法更可讀。

+0

「類實例通過引用傳遞」是不正確的 - 引用是通過值傳遞。有很大的不同。請閱讀http://pobox.com/~skeet/csharp/parameters.html –

+0

@JonSkeet我沒有特別說出它(或者確實如此),回答更新。 –

2

您還可以檢查我的articl:Extension Methods中,我談到了串encyption擴展方法

您需要從會做的工作適合你的函數的返回值..

public static string SetString(this string aString, string anotherString) 
{ 
    return anotherString ; 
} 

string anExistingString = "123"; 
anExistingString = anExistingString.SetString("Other value"); 
+0

能告訴我一個例子嗎?我試着用return,但是...也許我的實現不好...... –

+1

爲什麼要寫anExistingString = anExistingString。SetString(「其他值」);而不是一個ExistingString =「其他值」; –

+0

@Asif - 即時通訊思維相同的方式,這個操作可以完成,而無需編寫擴展方法,但我認爲他想學習什麼extesion方法,而不是去嘗試其他任何東西... –

0

的在調用一個會改變原始值的函數時.net中的默認行爲是返回值並重新分配該值(例如,substring不會更改該值,但會返回更改後的值)。 (現在你可以有一個裁判參數靜態過程,但這是不可能的擴展方法)

public static string SetString(this string aString, string anotherString) {  
     //process logic here 
     return anotherSTring; 
} 

//call 
string anExistingString = "123"; 
anExistingString = anExistingString.SetString("Other value"); 
0

你可以嘗試調用String.Copy方法:

public static void SetString(this string aString, string anotherString) 
{   
     aString = string.Copy(anotherString);  
} 
+0

不工作,他們(誰發佈的答案)對。無法使用擴展名更改原始字符串值 –

+0

http://msdn.microsoft.com/en-us/library/system.string.copy。說什麼? –