3

也许这个问题听起来不好或太简单了。但在这种情况下不适合我。

我的问题是:我为字符串创建了一个扩展,比如

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...

我的错误在哪里?

4

4 回答 4

3

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

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

就我个人而言,我认为refout参数是一种代码气味,它通常意味着该方法负责不止一件事,或者正在做不应该做的事情。在您的示例中,赋值比调用方法更具可读性。

于 2012-07-02T09:16:08.973 回答
2

您也可以查看我的文章:Extension Methods其中我谈到了字符串加密扩展方法

您需要从将为您完成工作的函数返回值..

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

string anExistingString = "123";
anExistingString = anExistingString.SetString("Other value");
于 2012-07-02T09:16:36.690 回答
0

当调用会更改原始值的函数时,.net 中的默认行为是返回值并重新分配该值(例如,子字符串不会更改值,但会返回更改后的值)。(现在你可以有一个带有ref参数的静态过程,但使用扩展方法是不可能的)

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

 //call
string anExistingString = "123";
anExistingString  = anExistingString.SetString("Other value");
于 2012-07-02T09:20:57.037 回答
0

您可以尝试调用String.Copy方法:

public static void SetString(this string aString, string anotherString )
 {        
      aString = string.Copy(anotherString);       
 } 
于 2012-07-02T09:28:59.160 回答