intが値型であることは知っていますが、値型の配列とは何ですか?参照タイプ?値のタイプ?何かをチェックするために、配列を関数に渡したいです。配列の参照を渡すだけなので、配列を渡すだけですか、それともrefとして渡す必要がありますか?
intが値型であることは知っていますが、値型の配列とは何ですか?参照タイプ?値のタイプ?何かをチェックするために、配列を関数に渡したいです。配列の参照を渡すだけなので、配列を渡すだけですか、それともrefとして渡す必要がありますか?
回答:
配列は、複数のアイテムを単一のコレクションとして扱うことができるメカニズムです。Microsoft®.NET共通言語ランタイム(CLR)は、1次元配列、多次元配列、およびギザギザの配列(配列の配列)をサポートしています。すべての配列型は、暗黙的にSystem.Arrayから派生します。それ自体はSystem.Objectから派生します。つまり、 すべての配列は常に マネージヒープに割り当てられる参照型であり、アプリの変数には配列自体ではなく配列への参照が含まれます。
参照型と値型の最も簡単なテストは、参照型がであってもnull、値型がそうでないことです。
配列(intなどの値型でも)はC#の参照型です。
http://msdn.microsoft.com/en-us/library/aa288453(VS.71).aspx:
C#では、配列は実際にはオブジェクトです。System.Arrayは、すべての配列型の抽象基本型です。
まず、Arrayが参照型であることをお伝えします。どうして?ここで一例を説明します。
例:
int val = 0; // this is a value type ok
int[] val1 = new int[20] // this is a reference type because space required to store 20 integer value that make array allocated on the heap.
また、参照型はnullにすることができますが、値型はできません。
スタックに格納されている値の型とヒープに格納されている参照の型
outまたはrefを使用して、配列を関数に渡すことができます。初期化メソッドのみが異なります。
それが参照型または値型であるかどうかをテストして確認します。
// we create a simple array of int
var a1 = new int[]{1,2,3};
// copy the array a1 to a2
var a2 = a1;
// modify the first element of a1
a1[0]=2;
// output the first element of a1 and a2
Console.WriteLine("a1:"+a1[0]); // 2
Console.WriteLine("a2:"+a2[0]); // 2
//**************************
// all the two variable point to the same array
// it's reference type!
//**************************
オンラインでテストできます:https : //dotnetfiddle.net/UWFP45
//配列への参照は値で渡されます。これが混乱の原因です:-) ...
int[] test = { 1, 2, 3, 4 };
modifContenuSansRef(test);
Console.WriteLine(test[0]); // OK --> 99 le contenu du tableau est modifié
modifTailleSansRef(test);
Console.WriteLine(test.Length); // KO --> 4 La taille n'est pas modifiée
}
static void modifContenuSansRef(int[] t)
{
t[0] = 99;
}
static void modifTailleSansRef(int[] t)
{
Array.Resize(ref t, 8);
}
配列は常に参照型です。配列にintのような値型またはstringのような参照型が含まれることは問題ではありません。たとえば、配列を宣言する場合
int[] integers=new int[10];
integers変数自体には、ヒープに常駐する配列への参照のみが含まれます。
また、変数がnullであるかどうかという事実に依存するだけで、参照型と値の型が異なる可能性があると多くの人が言及しています。私はc#では現在値型もnullにすることができることを述べたいと思います
例えば
int? integer=null
また、タイプが参照であるか、値が変数がnullであるかどうかというファクトにのみ依存していることを識別するのは良い方法ではありません。
洞察のほんの少し:
たとえば、intは単一の整数をint[]表し、整数の配列を表します。
特定の次元で配列を初期化するには、newキーワードを使用して、型名の後に角括弧でサイズを指定します。
//create a new array of 32 ints.
int[] integers = new int[32];
すべての配列は参照型であり、参照セマンティクスに従います。したがって、このコードでは、個々の要素がプリミティブ値型であるにもかかわらず、integers配列は参照型です。後で書く場合:
int[] copy = integers;
これにより、変数のコピー全体が同じ配列を参照するように割り当てられます。新しい配列は作成されません。
C#の配列構文は柔軟で、初期化せずに配列を宣言できるため、プログラムの後半で配列のサイズを動的に変更できます。この手法では、基本的にnull参照を作成し、後でその参照を、newキーワードで要求された動的に割り当てられたメモリロケーションに向けます。
int[] integers;
integers = new int[32];
ありがとうございました。