سؤال

هل من الممكن في C# إلى البنية مع عضو متغير وهي فئة النوع ؟ إذا كان الأمر كذلك أين الحصول على المعلومات المخزنة على كومة كومة ، أو كليهما ؟

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

المحلول

نعم يمكنك.المؤشر إلى الصف متغير عضو يتم تخزين على المكدس مع بقية البنية قيم و الطبقة سبيل المثال يتم تخزين البيانات على كومة.

البنيات يمكن أن تحتوي أيضا على تعريفات فئة أعضاء في (الطبقات الداخلية).

هنا بعض مجدية حقا رمز على الأقل يجمع ويعمل على إظهار أنه من الممكن:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MyStr m = new MyStr();
            m.Foo();

            MyStr.MyStrInner mi = new MyStr.MyStrInner();
            mi.Bar();

            Console.ReadLine();
        }
    }

    public class Myclass
    {
        public int a;
    }

    struct MyStr
    {
        Myclass mc;

        public void Foo()
        {
            mc = new Myclass();
            mc.a = 1;
        }

        public class MyStrInner
        {
            string x = "abc";

            public string Bar()
            {
                return x;
            }
        }
    }
}

نصائح أخرى

فئة محتوى يحصل المخزنة على كومة.

في إشارة إلى فئة (وهو تقريبا نفس المؤشر) يتم تخزينه مع البنية المحتوى.حيث البنية تخزين المحتوى يعتمد على ما إذا كان متغير محلي, طريقة المعلمة أو عضو فئة ، وما إذا كان محاصر أو القبض عليه من قبل الإغلاق.

إذا كان أحد مجالات البنية هي فئة نوع هذا المجال إما الاستمرار الهوية من كائن فئة أو آخر null referece.إذا كانت فئة الكائن في السؤال هو غير قابل للتغيير (مثلا ، string), تخزين هويتها فعال أيضا تخزين محتوياته.إذا كانت فئة الكائن في السؤال هي قابلة للتغيير, ومع ذلك, تخزين الهوية سوف يكون وسيلة فعالة لتخزين محتويات إذا و فقط إذا كان المرجع لن تقع في أيدي من أي رمز قد يتحور مرة واحدة يتم تخزينها في مجال.

وبصفة عامة ، ينبغي تجنب تخزين قابلة للتغيير أنواع فئة داخل الهيكل إلا في إحدى حالتين ينطبق:

  1. ما أحد مهتم في الحقيقة هوية كائن الفئة بدلا من محتواه.على سبيل المثال ، يمكن للمرء تحديد `FormerControlBounds` الهيكل الذي يحمل الحقول من نوع `السيطرة` و `المستطيل` ، ويمثل `حدود` التي تتحكم في بعض هذه اللحظة في الوقت المناسب ، بغرض التمكن لاحقا من استعادة السيطرة على موقفه السابق.الغرض من السيطرة الميدانية لن تكون لعقد نسخة من سيطرة الدولة ، بل للتعرف على التحكم في الموقف الذي ينبغي استعادتها.عموما البنية يجب تجنب الوصول إلى أي قابلة للتغيير أعضاء الكائن الذي يحمل إشارة ، ما عدا في الحالات حيث أنه من الواضح أن مثل هذا الوصول هو إشارة إلى الحالي قابلة للتغيير الدولة الكائن في المسألة (مثلا ، في `CaptureControlPosition` أو `RestoreControlToCapturedPosition` أو أسلوب `ControlHasMoved` الملكية).
  2. الميدان هو " خاص " فقط الأساليب التي قرأتها تفعل ذلك لغرض دراسة خصائصه دون تعريض الكائن نفسه إلى خارج الرمز الوحيد أساليب الكتابة فإنه سيتم إنشاء كائن جديد ، تنفيذ كافة الطفرات التي من أي وقت مضى أن يحدث ذلك ، ومن ثم تخزين إشارة إلى هذا الكائن.يمكن للمرء على سبيل المثال تصميم `البنية التي تصرف مثل الكثير من صفيف ، ولكن مع قيمة دلالات ، من خلال وجود البنية عقد مجموعة في المجال من خلال وجود كل محاولة لكتابة مجموعة إنشاء مجموعة جديدة مع البيانات من النظام القديم ، تعديل مجموعة جديدة ، وتخزين تعديل مجموعة إلى هذا الميدان.لاحظ أنه على الرغم من مجموعة نفسها ستكون قابلة للتغيير نوع كل مجموعة سبيل المثال أن يكون من أي وقت مضى المخزنة في الحقل سيكون فعال غير قابل للتغيير لأنه لن يكون الوصول إليها من قبل أي رمز قد يتحور ذلك.

علما أن السيناريو رقم 1 هو شائع جدا مع عامة أنواع ؛ على سبيل المثال ، فإنه من الشائع جدا أن يكون القاموس الذي "القيم" هي هويات قابلة للتغيير الكائنات ؛ تعداد هذا القاموس العودة حالات KeyValuePair الذي Value مجال أن يحمل قابلة للتغيير نوع.

السيناريو رقم 2 هو أقل شيوعا.هناك للأسف لا يوجد طريقة لمعرفة المترجم أن البنية أساليب أخرى من الملكية واضعي تعديل البنية واستخدامها وهكذا ينبغي أن يكون ممنوعا في القراءة فقط سياقه ، واحد يمكن أن يكون لها البنية التي تصرف مثل List<T>, ولكن مع قيمة دلالات ، وشملت Add طريقة لكن محاولة الاتصال Add على للقراءة فقط البنية سبيل المثال من شأنه أن يولد وهمية رمز بدلا من المحول البرمجي خطأ.كذلك تحور الطرق والممتلكات واضعي على مثل هذه البنيات عموما أداء ضعيف نوعا ما.هذه البنيات يمكن أن تكون مفيدة عندما الوجود غير قابل للتغيير المجمع على خلاف ذلك-قابلة للتغيير الطبقة ؛ إن مثل هذه البنية أبدا محاصر الأداء غالبا ما يكون أفضل من فئة.إذا كان محاصر تماما مرة واحدة (مثلا ، قبل أن يلقي إلى واجهة نوع) ، الأداء عموما سوف تكون قابلة للمقارنة إلى فئة.إذا كان محاصر مرارا الأداء يمكن أن تكون أسوأ بكثير من فئة.

انها على الارجح ليس الممارسة الموصى بها للقيام بذلك:انظر http://msdn.microsoft.com/en-us/library/ms229017(مقابل.85).aspx

أنواع المراجع يتم تخصيص كومة الذاكرة الإدارة التعامل معها من قبل هواة جمع القمامة.

أنواع قيمة توزع على كومة أو مضمنة وهي deallocated عندما يخرجون من نطاق.

في عام ، القيمة أنواع أرخص وتخصيص تخصيص.ومع ذلك ، إذا تم استخدامها في الحالات التي لا تتطلب كبير كمية من الملاكمة و علبته ، وأداء ضعيف مقارنة أنواع المراجع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top