لماذا يظهر لي هذا الخطأ أثناء إنشاء وإرجاع بنية جديدة؟

StackOverflow https://stackoverflow.com/questions/297471

سؤال

أحصل على خطأ عندما أقوم بتجميع هذا الرمز:

using System;

public struct Vector2
{
    public event EventHandler trigger;

    public float X;
    public float Y;

    public Vector2 func()
    {
        Vector2 vector;
        vector.X = 1;
        vector.Y = 2;
        return vector;  // error CS0165: Use of unassigned local variable 'vector'
    }
}

أهلاً!

يقول المترجم:"استخدام المتغير المحلي غير المعين 'المتجه'" ويشير إلى القيمة المرجعة.يبدو لي أن Vector2 أصبح نوعًا مرجعيًا (بدون عضو الحدث فإنه يعمل بشكل طبيعي).ماذا يحدث؟

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

المحلول

في C#، لا تزال بحاجة إلى إنشاء بنية "جديدة" لاستدعاء مُنشئ ما لم تكن قيد التهيئة الجميع الحقول.لقد تركت "مشغل" عضو EventHandler غير معين.

حاول إما تعيين "المشغل" أو استخدام:

Vector2 vector = new Vector2()

الكائن الجديد هو لا المخصصة على الكومة، لا تزال مخصصة على مكدس الوظائف.

يقتبس MSDN:

عند إنشاء كائن بنية باستخدام المشغل الجديد ، يتم إنشاؤه و يسمى المنشئ المناسب.على عكس الفصول ، يمكن أن تكون الهياكل إنشاء مثيل دون استخدام الجديد المشغل. إذا لم تستخدم الجديد ال ستبقى الحقول غير معينة و ال لا يمكن استخدام الكائن حتى كل من تتم تهيئة الحقول.

نصائح أخرى

وقد أوضح

وآخرون طرق جولة هذا، ولكن أعتقد أنه من الجدير بالذكر أن مشكلة كبيرة أخرى مع التعليمات البرمجية: لديك بنية قابلة للتغيير. تلك هي الى حد كبير <م> دائما فكرة سيئة. لا بد أن يكون مجرد البداية للعديد من القضايا التي سوف تصل الى اذا واصلتم على هذا النحو.

أنا <م> بشدة ننصح إما جعله غير قابل للتغيير أو جعله فئة.

وروب ووكر لديها استجابة أفضل، منذ أن بدأ من مستندات وثم مسبب إلى رمز (في حين ذهبت العكس).

إذا تجميع نموذج التعليمات البرمجية مع الحقل الزناد علق بها، ثم قم بتشغيل ILASM للحصول على MSIL الناتجة عن ذلك، سترى أنه لا يوجد شفرة تشغيل initobj لناقلات المتغير المحلي.

وعدم وجود initobj على ما يرام عندما هيكل Vector2 يحتوي فقط على أنواع القيمة. انهم الذاكرة فقط الخام بعد كل شيء. ومع ذلك، إذا كان هيكل Vector2 يحتوي أيضا إشارة، فإنه يجب تهيئة من أجل منع وجود مرجع كائن غير مهيأ.

في أجل تجنب العودة كائن unitialized جزئيا، تحتاج إلى إرسال إلى معالج الأحداث trigger صراحة، أو تهيئة الكائن بأكمله عن طريق عملية جديدة. ومع ذلك، في أي حال من الأحوال هو هيكل تحولت إلى نوع مرجع.

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