سؤال

يتم إنشاء GUIDS باستخدام new الكلمة الرئيسية التي تجعلني أعتقد أنها نوع مرجعي.

هل هذا صحيح؟

Guid uid = new Guid();

هل تخزين GUIDS على الكومة؟

هل كانت مفيدة؟

المحلول

يمكنك رؤية تعريف GUID بنفسك:

public struct Guid ...

أو يمكنك اختباره مثل هذا:

bool guidIsValueType = typeof(Guid).IsValueType;

يتم إنشاء GUID باستخدام الكلمة الرئيسية الجديدة التي تجعلني أعتقد أنها نوع مرجعي.

يمكن أن تحتوي الهياكل على مُنشئين أيضًا ، على سبيل المثال new DateTime(2012, 12, 23).

نصائح أخرى

GUID هو نوع القيمة.

نرى MSDN. لاحظ أن GUID هو أ بنية. جميع الهياكل أنواع القيمة.

يتم إنشاء GUID باستخدام الكلمة الرئيسية الجديدة التي تجعلني أعتقد أنها نوع مرجعي.

توقف عن التفكير في ذلك. يمكن أن تحتوي أنواع القيمة على مُنشئين أيضًا. إنه أمر قانوني تمامًا ، رغم أنه غريب ، أن نقول

int x = new int();

هذا هو نفسه تعيين صفر إلى x.

هل هذا صحيح؟

لا.

هل تخزين GUID على كومة؟

نعم. يتم تخزين GUIDS أيضا على المكدس.

لاحظ أن التحليل أدناه يفترض أن تنفيذ CLI هو Microsoft "سطح المكتب" أو "Silverlight" CLR يعمل على Windows. ليس لدي أي فكرة عن الإصدارات الأخرى من CLI ، وماذا يفعلون على أجهزة Mac ، وهلم جرا. إذا كنت بحاجة إلى معرفة ما إذا كان يتم تخزين قطعة كبيرة من الذاكرة على المكدس في التطبيقات الأخرى ، فسيتعين عليك أن تسأل شخصًا خبيرًا في تلك التطبيقات.

يتم تخزين GUID على المكدس في ظل الظروف التالية:

(1) عندما تكون GUID نتيجة "مؤقتة" لحساب مستمر أو يتم استخدامها كوسيطة لطريقة ما. على سبيل المثال ، إذا كان لديك طريقة استدعاء M (New Guid ()) ، فسيتم تخصيص التخزين المؤقت لـ New Guid على المكدس.

(2) عندما يكون GUID هو متغير محلي وهو (أ) ليس في كتلة التكرار ، (ب) ليس متغيرًا خارجيًا مغلقًا لطريقة مجهولة أو تعبير lambda.

في جميع المواقف الأخرى ، لا يتم تخزين GUID على المكدس. يتم تخزين GUID على الكومة عندما يكون حقلًا من نوع مرجعي ، أو عنصر من صفيف ، أو محلي مغلق لأسلوب مجهول أو تعبير Lambda ، أو محلي في كتلة Iterator.

يمكن أيضًا تخزين GUID في كومة GC ولا المكدس. قد يتم تخزين GUID في ذاكرة غير مُدارة بالكامل ، يتم الوصول إليها عبر حساب مؤشر غير آمن.

أشعر بالفضول لسبب اهتمامك بقدر ما إذا كانت أجزاء GUID على المكدس أو على الكومة. ما الفرق الذي يحدثه؟

انها في الواقع GUID. يتم إنشاء جميع الأنواع باستخدام new الكلمة الرئيسية. يمكنك تحديد أنواع المرجع من أنواع القيمة بما إذا كانت أ صف دراسي, واجهه المستخدم, ، أو مندوب (جميع الأنواع المرجعية) ، أو أ بنية أو التعداد (أنواع القيمة).

نوع القيمة ، انظر المثال أدناه:

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