سؤال

هذا السؤال مستوحى من إجابة جون سكيت:هل هناك ما يعادل c# لمناطق تعديل الوصول الخاصة بـ c++

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

هل هناك أفكار أخرى حول كيفية التعامل مع ترتيب الحقول داخل ملف التعليمات البرمجية الخاص بك وما هو التأثير الذي قد يحدثه ذلك؟

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

المحلول

فيما يلي مثال كلاسيكي من مواصفات لغة C# (القسم 10.5.5)

class Test
{
    static int a = b + 1;
    static int b = a + 1;
    static void Main() {
        Console.WriteLine("a = {0}, b = {1}", a, b);
    }
}

هذا برنامج صالح تمامًا وكما هو مكتوب (أ = 1، ب =2).ومع ذلك، إذا قمت بتبديل ترتيب الحقول، فسيتم أيضًا تبديل القيم.

نصائح أخرى

نعم، هذا مهم عند التفاعل مع تعليمات برمجية غير مُدارة.

كنت أفكر في المقام الأول في ترتيب التهيئة، نعم - خاصة بالنسبة للحقول الثابتة.على سبيل المثال (مع الحقول العامة فقط من أجل بساطة العرض التوضيحي):

using System;

class First
{
    static int a = 10;
    public static int b = CalculateB();
    static int c = 5;

    static int CalculateB()
    {
        return a*c;
    }
}

class Second
{
    static int a = 10;
    static int c = 5;
    public static int b = CalculateB();

    static int CalculateB()
    {
        return a*c;       
    }
}

class Test
{
    static void Main()
    {
        Console.WriteLine("First.b: {0}, Second.b: {1}",
                          First.b, Second.b);
    }
}

يتم تعريف ترتيب التهيئة في المواصفات ليكون الترتيب النصي الذي يتم به الإعلان عن المتغيرات - ولكنه يصبح غير محدد عندما يكون هناك متغيران في ملفات مختلفة تساهم في فئة جزئية.

جواب مهرداد هو شيء جيد آخر:من المحتمل جدًا أن يتأثر أي شيء يكون فيه التصميم المادي مهمًا بأمر الإعلان.

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

يمكنك استخدام (إساءة الاستخدام؟) ترتيب الحقول كبيانات وصفية لفصلك والتي يمكنك قراءتها من خلال التفكير.

على سبيل المثال، إذا كان لديك فئة تمثل بروتوكول شبكة بمعرف الحقول، و PORT، و XOR، وبهذا الترتيب، يمكنك تعريفها على النحو التالي:

class MyProtocol {
    int ID;
    int PORT;
    int XOR;
}

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

لست متأكدًا مما إذا كانت فكرة جيدة الاعتماد على هذا.

أعتقد أن XmlSerializer يقوم بتسلسل الأعضاء بالترتيب الذي يظهرون به في الملف المصدر.

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