字符串扩展返回C#中该字符串的意外值。

问题描述:

也许问题听起来不好或太简单。但在这种情况下不适合我。字符串扩展返回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

这不可能作为扩展方法。对类变量是按值传递,以分配一个新值的方法传递一个值,你需要使用一个ref参数:

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

我个人认为refout参数代码气味,它通常意味着该方法负责不止一件事或正在做它不应该做的事情。在你的例子中,赋值比调用方法更可读。

+0

“类实例通过引用传递”是不正确的 - 引用是通过值传递。有很大的不同。请阅读http://pobox.com/~skeet/csharp/parameters.html –

+0

@JonSkeet我没有特别说出它(或者确实如此),回答更新。 –

您还可以检查我的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方法,而不是去尝试其他任何东西... –

的在调用一个会改变原始值的函数时.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"); 

你可以尝试调用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。说什么? –