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;
}

個人的に私はコードの臭いを考慮refし、outパラメータを設定します。これは通常、メソッドが複数のことを担当しているか、すべきでないことを実行していることを意味します。あなたの例では、割り当てはメソッドを呼び出すよりもはるかに読みやすくなっています。

于 2012-07-02T09:16:08.973 に答える
2

また、私の記事をチェックすることもできます:文字列の暗号化拡張メソッドについて話した拡張メソッド

あなたはあなたのために仕事をする関数から値を返す必要があります。

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

String.Copyメソッドの呼び出しを試すことができます。

public static void SetString(this string aString, string anotherString )
 {        
      aString = string.Copy(anotherString);       
 } 
于 2012-07-02T09:28:59.160 に答える
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 に答える