質問

ガイドは、を使用して作成されます new キーワードは、それが参照タイプだと思うようになります。

これは正しいです?

Guid uid = new Guid();

ガイドはヒープに保存されていますか?

役に立ちましたか?

解決

あなたは自分自身のガイドの定義を見ることができます:

public struct Guid ...

または、次のようにテストすることもできます。

bool guidIsValueType = typeof(Guid).IsValueType;

GUIDは、リファレンスタイプだと思う新しいキーワードを使用して作成されます。

たとえば、構造体にはコンストラクターもあります new DateTime(2012, 12, 23).

他のヒント

GUIDは値タイプです。

見る MSDN. 。 GUIDはaです struct. 。すべての構造体はです 値タイプ.

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は、まったく管理されていないメモリに保存され、安全でないポインター算術を介してアクセスできます。

ガイドのビットがスタック上にあるのか、ヒープにあるのかと同じように気にする理由について興味があります。どんな違いがあるの?

それは実際です ガイド. 。すべてのタイプは、を使用して構築されます new キーワード。値タイプから参照タイプを識別できます。 クラス, インターフェース, 、 また 委任 (すべての参照タイプ)、またはa struct また 列挙 (値タイプ)。

その値タイプ、以下の例を参照してください:

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
*/
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top