سؤال

الهدف من صحة الثبات هو أن تكون قادرًا على تقديم عرض لمثيل لا يمكن للمستخدم تغييره أو حذفه.يدعم المترجم ذلك من خلال الإشارة إلى متى يتم كسر الثبات من داخل دالة const، أو محاولة استخدام دالة غير const لكائن const.لذلك، بدون نسخ النهج const، هل هناك منهجية يمكنني استخدامها في C# لها نفس الغايات؟

أنا على دراية بالثبات، ولكن هذا لا ينطبق حقًا على كائنات الحاوية على سبيل المثال لا الحصر.

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

المحلول

لقد واجهت هذه المشكلة عدة مرات أيضًا وانتهى بي الأمر باستخدام الواجهات.

أعتقد أنه من المهم التخلي عن فكرة أن لغة C# هي بأي شكل من الأشكال، أو حتى تطور لـ C++.إنهما لغتان مختلفتان تشتركان في نفس بناء الجملة تقريبًا.

عادةً ما أعبر عن "صحة const" في C# من خلال تحديد طريقة عرض للقراءة فقط للفئة:

public interface IReadOnlyCustomer
{
    String Name { get; }
    int Age { get; }
}

public class Customer : IReadOnlyCustomer
{
    private string m_name;
    private int m_age;

    public string Name
    {
        get { return m_name; }
        set { m_name = value; }
    }

    public int Age
    {
        get { return m_age; }
        set { m_age = value; }
    }
}

نصائح أخرى

للاستفادة من جنون const-craziness (أو النقاء في مصطلحات البرمجة الوظيفية)، ستحتاج إلى تصميم فئاتك بطريقة تجعلها غير قابلة للتغيير، تمامًا مثل فئة String في لغة C#.

يعد هذا الأسلوب أفضل بكثير من مجرد وضع علامة على كائن للقراءة فقط، لأنه مع الفئات غير القابلة للتغيير يمكنك تمرير البيانات بسهولة في بيئات متعددة المهام.

أردت فقط أن أشير لك إلى أن العديد من حاويات System.Collections.Generics لديها طريقة AsReadOnly والتي ستعيد لك مجموعة غير قابلة للتغيير.

لا يحتوي C# على مثل هذه الميزة.يمكنك تمرير الوسيطة حسب القيمة أو حسب المرجع.المرجع نفسه غير قابل للتغيير ما لم تحدد ذلك المرجع المعدل.لكن البيانات المرجعية ليست غير قابلة للتغيير.لذلك عليك توخي الحذر إذا كنت تريد تجنب الآثار الجانبية.

شبكة MSDN:

تمرير المعلمات

الواجهات هي الحل، وهي في الواقع أقوى من "const" في لغة C++.const هو حل واحد يناسب الجميع للمشكلة حيث يتم تعريف "const" على أنها "لا تقوم بتعيين الأعضاء أو الاتصال بشيء يحدد الأعضاء".يعد هذا اختصارًا جيدًا للثبات في العديد من السيناريوهات، ولكن ليس جميعها.على سبيل المثال، ضع في اعتبارك دالة تحسب قيمة بناءً على بعض الأعضاء ولكنها تقوم أيضًا بتخزين النتائج مؤقتًا.في C++، يعتبر ذلك غير ثابت، على الرغم من أنه من وجهة نظر المستخدم هو ثابت بشكل أساسي.

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

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

    public class Customer
    {
    private readonly string m_name;
    private readonly int m_age;

    public Customer(string name, int age)
    {
        m_name = name;
        m_age = age;
    }

    public string Name
    {
        get { return m_name; }
    }

    public int Age
    {
        get { return m_age; }
    }
  }

وبدلاً من ذلك، يمكنك أيضًا إضافة نطاق الوصول إلى الخصائص، على سبيل المثال.الحصول على الجمهور ومجموعة محمية؟

    public class Customer
    {
    private string m_name;
    private int m_age;

    protected Customer() 
    {}

    public Customer(string name, int age)
    {
        m_name = name;
        m_age = age;
    }

    public string Name
    {
        get { return m_name; }
        protected set { m_name = value; }
    }

    public int Age
    {
        get { return m_age; }
        protected set { m_age = value; }
    }
  }
  • ال مقدار ثابت يمكن استخدام الكلمة الأساسية لتجميع ثوابت الوقت مثل الأنواع والسلاسل البدائية
  • ال يقرأ فقط يمكن استخدام الكلمة الأساسية لثوابت وقت التشغيل مثل أنواع المراجع

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

أنظر أيضا C# الفعال:50 طريقة محددة لتحسين لغتك C# (البند 2 - تفضيل القراءة فقط على الثابت.)

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