GUIDは、new
キーワードを使用して作成されているため、参照型であると思われます。
これは正しいです?
Guid uid = new Guid();
GUIDはヒープに格納されていますか?
GUIDの定義は自分で確認できます。
_public struct Guid ...
_
または、次のようにテストできます。
_bool guidIsValueType = typeof(Guid).IsValueType;
_
GUIDは、参照型であると思わせる新しいキーワードを使用して作成されます。
構造体には、new DateTime(2012, 12, 23)
などのコンストラクターも含めることができます。
Guidは値型です。
[〜#〜] msdn [〜#〜] を参照してください。 Guidは struct であることに注意してください。すべての構造体は 値型 です。
GUIDは、参照型であると思わせる新しいキーワードを使用して作成されます。
それを考えるのをやめなさい。値型にもコンストラクターを含めることができます。奇妙ではありますが、言うことは完全に合法です
int x = new int();
これは、xにゼロを割り当てるのと同じです。
これは正しいです?
いいえ。
GUIDはヒープに保存されていますか?
はい。 GUIDもスタックに格納されます。
以下の分析では、CLIの実装がWindowsで実行されているMicrosoftの「デスクトップ」または「Silverlight」CLRであると想定していることに注意してください。 CLIの他のバージョンが何をするのか、Macで何をするのかなどはわかりません。特定のメモリの塊が他の実装でスタックに格納されているかどうかを知る必要がある場合は、それらの実装の専門家である誰かに尋ねる必要があります。
GUIDは、次の状況でスタックに格納されます。
(1)GUIDが進行中の計算の「一時的な」結果である場合、またはメソッドの引数として使用されている場合。たとえば、メソッド呼び出しM(new Guid())がある場合、新しいGuidの一時ストレージがスタックに割り当てられます。
(2)Guidが(a)イテレーターブロックにないローカル変数である場合、(b)無名メソッドまたはラムダ式の閉じられた外部変数ではない場合。
他のすべての状況では、GUIDはスタックに保存されません。 Guidは、参照型のフィールド、配列の要素、無名メソッドまたはラムダ式のクローズドオーバーローカル、またはイテレーターブロックのローカルである場合にヒープに格納されます。
GUIDは、GCヒープにもスタックにも格納できません。 GUIDは、安全でないポインタ演算を介してアクセスされる、完全に管理されていないメモリに格納される場合があります。
GUIDのビットがスタックにあるのか、ヒープにあるのかを気にする理由が気になります。どんな違いがあるの?
その値型。以下の例を参照してください。
using System;
public class Program
{
public static void Main()
{
Guid a1 = new Guid();
Console.WriteLine(a1);
Guid b1 = a1;
Console.WriteLine(b1);
a1 = Guid.NewGuid();
Console.WriteLine(a1);
Console.WriteLine(b1);
}
}
/* OUTPUT
00000000-0000-0000-0000-000000000000
00000000-0000-0000-0000-000000000000
164f599e-d42d-4d97-b390-387e8a80a328
00000000-0000-0000-0000-000000000000
*/