4

これはC#での関数宣言ですか?

void foo(string mystring)

Cのこれと同じ:

void foo(char *)

つまり、C#では、呼び出された関数はバックグラウンドでポインターを受け取りますか?

4

11 に答える 11

12

この特定の例では、次のようになります。

void foo(const char *);

.Net文字列は不変であり、参照によって渡されます。ただし、一般に、C#はバックグラウンドでオブジェクトへのポインターまたは参照を受け取ります。

于 2008-09-15T17:01:19.497 に答える
5

C#の舞台裏にはポインターがありますが、それらはC ++のスマートポインターに似ているため、生のポインターはカプセル化されます。char *は、実際にはSystem.Stringと同じではありません。これは、charへのポインターは通常、文字配列の開始を意味し、C#文字列は長さフィールド文字配列を持つオブジェクトであるためです。ポインタは、 wchar_t配列のようなものを指す外部構造を指しているため、UnicodeをサポートするためにC#文字列とワイド文字を使用した間接参照があります。

于 2008-09-15T17:03:08.307 に答える
5

いいえ。C#(および他のすべての.NET言語)では、文字列はファーストクラスのデータ型です。単なる文字の配列ではありません。それらの間で前後に変換することはできますが、それらは同じように動作しません。Stringクラスで使用できる文字列操作メソッド(「Substring()」や「StartsWith」など)は多数ありますが、これらは一般に配列には適用されません。文字の配列は単なるインスタンスです。

于 2008-09-15T17:06:14.633 に答える
4

基本的に、はい。C#では、文字列(実際にはSystem.String)は参照型であるため、foo()が呼び出されると、ヒープ内の文字列へのポインターを受け取ります。

于 2008-09-15T17:00:28.733 に答える
3

値型(int、doubleなど)の場合、関数は値のコピーを受け取ります。他のオブジェクトの場合、これは元のオブジェクトを指す参照です。

文字列は不変であるため、特別です。技術的には、参照を渡すことを意味しますが、実際には、値型とほとんど同じように動作します。

refキーワードを使用して、値型に参照を強制的に渡すことができます。

public void Foo(ref int value) { value = 12 }
public void Bar()
{
    int val = 3;
    Foo(ref val);
    // val == 12
}
于 2008-09-15T17:02:41.803 に答える
1

c#文字列のnoはユニコードです。C#では、ポインターではなく参照と呼ばれます。

于 2008-09-15T17:01:50.807 に答える
1

つまり、メソッドが文字スペースの内容にアクセスできるようになるのであれば、答えは「はい」です。

于 2008-09-15T17:02:18.293 に答える
1

はい、文字列は動的なサイズであるため、バックグラウンドでヒープメモリが必要です。

しかし、それらは同じではありません。

cでは、ポインタは他の場所でも使用できる文字列を指しているため、それを変更すると他の場所にも影響します。

于 2008-09-15T17:02:27.310 に答える
1

基本的に列挙型、ブール値、および組み込み数値型をカバーする「値型」ではないものはすべて、「参照渡し」で渡されます。これは、参照渡しまたはポインター渡しの C/C++ メカニズムとほぼ同じです。構文的にも意味的にも、C/C++ の参照渡しと本質的に同じです。

ただし、C# では文字列は不変であるため、参照によって渡されたとしても、新しい文字列を作成せずに文字列を編集することはできません。

また、値型か参照型かに関係なく、C# では引数を "const" として渡すことはできないことに注意してください。

于 2008-09-15T17:27:57.733 に答える
1

これらはセマンティックな意味では確かに同等ですが (つまり、コードは文字列で何かを行っています)、C# は Java と同様に、ポインターを日常的な使用から完全に除外し、ネイティブ OS 関数への移行などの領域にポインターを追いやります。 SafeFileHandle など、これらをうまくまとめるフレームワーク クラスがあります。

簡単に言うと、C# のポインターについて考えるのをやめてください。

于 2008-09-15T17:50:53.123 に答える
0

私の知る限り、C# のすべてのクラス (他のクラスについては不明) は参照型です。

于 2008-09-15T17:12:56.897 に答える