GUIDは値タイプまたは参照タイプと見なされますか?
-
23-09-2019 - |
質問
ガイドは、を使用して作成されます new
キーワードは、それが参照タイプだと思うようになります。
これは正しいです?
Guid uid = new Guid();
ガイドはヒープに保存されていますか?
解決
あなたは自分自身のガイドの定義を見ることができます:
public struct Guid ...
または、次のようにテストすることもできます。
bool guidIsValueType = typeof(Guid).IsValueType;
GUIDは、リファレンスタイプだと思う新しいキーワードを使用して作成されます。
たとえば、構造体にはコンストラクターもあります new DateTime(2012, 12, 23)
.
他のヒント
GUIDは、リファレンスタイプだと思う新しいキーワードを使用して作成されます。
それを考えるのをやめなさい。バリュータイプにはコンストラクターもあります。奇妙ではありますが、言うのは完全に合法です
int x = new int();
これは、ゼロをxに割り当てるのと同じです。
これは正しいです?
いいえ。
GUIDはヒープに保存されていますか?
はい。ガイドはスタックにも保存されます。
以下の分析では、CLIの実装は、Windowsで実行されているMicrosoft "デスクトップ"または「Silverlight」CLRであることを前提としています。 CLIの他のバージョンが何をしているのか、彼らがMacで何をしているのかなどはわかりません。特定のメモリの塊が他の実装のスタックに保存されているかどうかを知る必要がある場合は、それらの実装の専門家である人に尋ねる必要があります。
GUIDは、次の状況に基づいてスタックに保存されます。
(1)GUIDが進行中の計算の「一時的な」結果であるか、方法の引数として使用されている場合。たとえば、メソッドコールM(new GUID())がある場合、新しいGUIDの一時ストレージがスタックに割り当てられます。
(2)GUIDがローカル変数である場合、(a)イテレーターブロックではない場合、(b)匿名メソッドまたはラムダ式の閉鎖外の変数ではありません。
他のすべての状況では、GUIDはスタックに保存されません。 GUIDは、参照タイプのフィールド、配列の要素、匿名メソッドまたはラムダ式の閉鎖ローカル、またはイテレーターブロック内のローカルである場合、ヒープに保存されます。
GUIDは、GCヒープもスタックも保存できません。 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
*/