これはC#での関数宣言ですか?
void foo(string mystring)
Cのこれと同じ:
void foo(char *)
つまり、C#では、呼び出された関数はバックグラウンドでポインターを受け取りますか?
これはC#での関数宣言ですか?
void foo(string mystring)
Cのこれと同じ:
void foo(char *)
つまり、C#では、呼び出された関数はバックグラウンドでポインターを受け取りますか?
この特定の例では、次のようになります。
void foo(const char *);
.Net文字列は不変であり、参照によって渡されます。ただし、一般に、C#はバックグラウンドでオブジェクトへのポインターまたは参照を受け取ります。
C#の舞台裏にはポインターがありますが、それらはC ++のスマートポインターに似ているため、生のポインターはカプセル化されます。char *は、実際にはSystem.Stringと同じではありません。これは、charへのポインターは通常、文字配列の開始を意味し、C#文字列は長さフィールドと文字配列を持つオブジェクトであるためです。ポインタは、 wchar_t配列のようなものを指す外部構造を指しているため、UnicodeをサポートするためにC#文字列とワイド文字を使用した間接参照があります。
いいえ。C#(および他のすべての.NET言語)では、文字列はファーストクラスのデータ型です。単なる文字の配列ではありません。それらの間で前後に変換することはできますが、それらは同じように動作しません。Stringクラスで使用できる文字列操作メソッド(「Substring()」や「StartsWith」など)は多数ありますが、これらは一般に配列には適用されません。文字の配列は単なるインスタンスです。
基本的に、はい。C#では、文字列(実際にはSystem.String)は参照型であるため、foo()が呼び出されると、ヒープ内の文字列へのポインターを受け取ります。
値型(int、doubleなど)の場合、関数は値のコピーを受け取ります。他のオブジェクトの場合、これは元のオブジェクトを指す参照です。
文字列は不変であるため、特別です。技術的には、参照を渡すことを意味しますが、実際には、値型とほとんど同じように動作します。
ref
キーワードを使用して、値型に参照を強制的に渡すことができます。
public void Foo(ref int value) { value = 12 }
public void Bar()
{
int val = 3;
Foo(ref val);
// val == 12
}
c#文字列のnoはユニコードです。C#では、ポインターではなく参照と呼ばれます。
つまり、メソッドが文字スペースの内容にアクセスできるようになるのであれば、答えは「はい」です。
はい、文字列は動的なサイズであるため、バックグラウンドでヒープメモリが必要です。
しかし、それらは同じではありません。
cでは、ポインタは他の場所でも使用できる文字列を指しているため、それを変更すると他の場所にも影響します。
基本的に列挙型、ブール値、および組み込み数値型をカバーする「値型」ではないものはすべて、「参照渡し」で渡されます。これは、参照渡しまたはポインター渡しの C/C++ メカニズムとほぼ同じです。構文的にも意味的にも、C/C++ の参照渡しと本質的に同じです。
ただし、C# では文字列は不変であるため、参照によって渡されたとしても、新しい文字列を作成せずに文字列を編集することはできません。
また、値型か参照型かに関係なく、C# では引数を "const" として渡すことはできないことに注意してください。
これらはセマンティックな意味では確かに同等ですが (つまり、コードは文字列で何かを行っています)、C# は Java と同様に、ポインターを日常的な使用から完全に除外し、ネイティブ OS 関数への移行などの領域にポインターを追いやります。 SafeFileHandle など、これらをうまくまとめるフレームワーク クラスがあります。
簡単に言うと、C# のポインターについて考えるのをやめてください。
私の知る限り、C# のすべてのクラス (他のクラスについては不明) は参照型です。