2


0

C#の文字列のような不変の型へのポインタを格納する方法はありますか? 実行方法:Instance1.SomeFunction(out MyString);

そして、Instance1内にMyStringへのポインタを格納しますか。

4 Answer


0


私はしばらくの間C#のポインタと戦ってきましたが、選択肢がないことに驚きました。 C#でポインタやポインタ引数を扱うときには、あらゆる種類の不明瞭な障害に遭遇します。

  • あなたは、文字列でさえも、マネージ型へのネイティブポインタを作成することはできません。

  • 後で使うために不変のout / ref-argumentsを保存することはできません。

  • "null"が文字列型のデフォルトの状態であっても、オプションの/ NULL可能なout / ref-argumentsを持つことはできません。

  • あなたはラムダ式の中で渡された/ ref-argumentsを使用することはできません。

私が最近見つけたかなりきちんとした解決策、そしてこの投稿の理由も:

void Test(){string ret = ""; SomeFunction(a => ret = a); }

void SomeFunction(string_ptr str){str( "文字列値の設定"); }

void string_ptr(string a)をデリゲートします。


0


このクラスをポインタとして使用してください(注意:未テストのメモ帳コード。修正が必要な場合があります)。

パブリッククラスBox {public Box(T value){this.Value = value; }

パブリックT値{get;セット; }

public static暗黙演算子T(Box box){return box.Value;} }}

例えば、

public void Test(){ボックス番号= new Box(10); Boxテキスト= new Box( "PRINT \"こんにちは、world!\ "");

Console.Write(number); Console.Write( ""); Console.WriteLine(テキスト);

F1(数字、テキスト)。

Console.Write(number); Console.Write( ""); Console.WriteLine(テキスト); Console.ReadKey(); }

void F1(ボックス番号、ボックステキスト){number.Value = 10; text.Value = "GOTO 10"; }

出力すべき

10プリント「こんにちは、世界!」 20後藤10


0


質問者の答えに関して、何が悪いのでしょう。

クラスProgram {static void Main(){string str = "asdf"; MakeNull(参照文字列); System.Diagnostics.Debug.Assert(str == null); }

static void MakeNull(参照文字列s){s = null; }

}


0


わかりました、私は私の問題に対する別の部分的な解決策を見つけました。 ref / out引数にnull値を設定したい場合は、オーバーロードを使用できます。

void Test(){string ret1 = ""、ret2 = ""; SomeFunction(ref ret1、ref ret2); SomeFunction(null、ref ret2); SomeFunction(ref ret1、null); SomeFunction(null、null); }

string null_string = "null";

void SomeFunction(参照文字列ret1、参照文字列ret2){if(ret1!= null_string)ret1 = "ret 1"; if(ret2!= null_string)ret2 = "ret 2"; }

// Additional overloads, to support null ref arguments
void SomeFunction(文字列ret1、参照文字列ret2){Debug.Assert(ret1 == null); SomeFunction(null_string、ret2); void SomeFunction(参照文字列ret1、文字列ret2){Debug.Assert(ret2 == null);} SomeFunction(ret1、null_string); void SomeFunction(文字列ret1、文字列ret2){Debug.Assert(ret1 == null)