字符串扩展返回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
......
我的错误在哪里?
这不可能作为扩展方法。对类变量是按值传递,以分配一个新值的方法传递一个值,你需要使用一个ref
参数:
public void SetString(ref string aString, string anotherString)
{
aString = anotherString;
}
我个人认为ref
和out
参数代码气味,它通常意味着该方法负责不止一件事或正在做它不应该做的事情。在你的例子中,赋值比调用方法更可读。
“类实例通过引用传递”是不正确的 - 引用是通过值传递。有很大的不同。请阅读http://pobox.com/~skeet/csharp/parameters.html –
@JonSkeet我没有特别说出它(或者确实如此),回答更新。 –
您还可以检查我的articl:Extension Methods中,我谈到了串encyption扩展方法
您需要从会做的工作适合你的函数的返回值..
public static string SetString(this string aString, string anotherString)
{
return anotherString ;
}
string anExistingString = "123";
anExistingString = anExistingString.SetString("Other value");
能告诉我一个例子吗?我试着用return,但是...也许我的实现不好...... –
为什么要写anExistingString = anExistingString。SetString(“其他值”);而不是一个ExistingString =“其他值”; –
@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);
}
不工作,他们(谁发布的答案)对。无法使用扩展名更改原始字符串值 –
http://msdn.microsoft.com/en-us/library/system.string.copy。说什么? –
C#不工作这办法。 IOW,你根本无法做到这一点(你可以用一些技巧)。 – leppie
'anExistingString =“其他值”;'似乎waaaaaaaaaaay比'anExistingString.SetString(“其他值”);'更易读,更直观。你不会在C#中使用内置赋值运算符的任何特定原因? –
我不明白需要这样做,当字符串myString =“其他值”完全相同的事情。没有必要过于复杂的东西没有特殊功能。 – CSharpened