make - type of methods in c#




ثابت للقراءة مقابل const (10)

Const: Const ليست سوى "ثابت" ، متغير الذي تكون القيمة ثابتة ولكن في وقت التحويل البرمجي. وهو إلزامي لتعيين قيمة له. بشكل افتراضي ، ثابت ثابت ولا يمكننا تغيير قيمة متغير const خلال البرنامج بأكمله.

ReadOnly ثابت: يمكن تعيين قيمة متغير نوع Readonly ثابت في وقت التشغيل أو تعيينها في وقت التحويل البرمجي وتغييرها في وقت التشغيل. ولكن يمكن تغيير قيمة هذا المتغير فقط في منشئ ثابت. ولا يمكن تغييره أكثر. يمكن أن تتغير مرة واحدة فقط في وقت التشغيل

المرجع: c-sharpcorner

لقد قرأت حول const والحقول static readonly . لدينا بعض الفصول التي تحتوي على قيم ثابتة فقط. تستخدم لأشياء مختلفة في نظامنا. لذلك أنا أتساءل عما إذا كانت ملاحظتي صحيحة:

هل يجب دائمًا أن يكون هذا النوع من القيم static readonly لكل ما هو عام؟ واستخدم فقط const للقيم الداخلية / المحمية / الخاصة؟

بماذا توصي؟ يجب ربما حتى عدم استخدام الحقول static readonly ، ولكن استخدام خصائص ربما؟


CONST:

  1. ينبغي إعطاء قيمة عند الإعلان
  2. تجميع الوقت ثابت

يقرأ فقط:

  1. يمكن إعطاء قيمة عند الإعلان أو أثناء وقت التشغيل باستخدام المنشئين.قد تختلف القيمة تعتمد على المنشئ المستخدم.
  2. وقت التشغيل ثابت

أود أن أستخدم static readonly إذا كان المستهلك في تجميع مختلف. وجود const والمستهلك في جمعيتين مختلفتين هو طريقة لطيفة لتصوير نفسك في القدم .


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

يتم حرق قيم Const مباشرة في موقع الاتصال ؛ هذا هو ذو حدين:

  • لا جدوى إذا تم جلب القيمة في وقت التشغيل ، ربما من التكوين
  • إذا قمت بتغيير قيمة const ، تحتاج إلى إعادة إنشاء كافة العملاء
  • ولكن يمكن أن يكون أسرع ، لأنه يتجنب استدعاء طريقة ...
  • ... والتي قد تكون مضمّنة في بعض الأحيان من قبل JIT على أي حال

إذا كانت القيمة لن تتغير أبدًا ، فستكون const ثابتة - حيث أن Zero إلخ يجعل الثوابت المعقولة ؛ -p بخلاف ذلك ، تكون الخصائص الثابتة أكثر شيوعًا.


بعض الأشياء الأخرى

const int a

  • يجب أن يكون تهيئة
  • يجب أن تكون التهيئة في وقت التجميع

readonly كثافة العمليات

  • يمكن استخدام القيمة الافتراضية ، دون تهيئة
  • التهيئة يمكن أن تكون في وقت التشغيل

تتشابه Const و readonly ، ولكنها ليست متطابقة تمامًا. الحقل const هو ثابت وقت تجميع ، مما يعني أنه يمكن حساب هذه القيمة في وقت التحويل البرمجي. يمكّن حقل readonly سيناريوهات إضافية يجب تشغيل بعض التعليمات البرمجية أثناء إنشاء النوع. بعد البناء ، لا يمكن تغيير حقل للقراءة فقط.

على سبيل المثال ، يمكن استخدام أعضاء Const لتحديد أعضاء مثل:

struct Test
{
    public const double Pi = 3.14;
    public const int Zero = 0;
}

لأن القيم مثل 3.14 و 0 هي ثوابت وقت التحويل البرمجي. ومع ذلك ، ضع في اعتبارك الحالة التي تحدد فيها نوعًا ما وتريد تقديم بعض الأمثلة المسبقة عنه. على سبيل المثال ، قد ترغب في تحديد فئة اللون وتوفير "ثوابت" للألوان الشائعة مثل الأسود والأبيض ، وما إلى ذلك. ليس من الممكن القيام بذلك مع أعضاء Const ، حيث أن جوانب اليد اليمنى ليست ثوابت وقت التحويل البرمجي. يمكن للمرء أن يفعل ذلك مع أعضاء ثابت منتظم:

public class Color
{
    public static Color Black = new Color(0, 0, 0);
    public static Color White = new Color(255, 255, 255);
    public static Color Red = new Color(255, 0, 0);
    public static Color Green = new Color(0, 255, 0);
    public static Color Blue = new Color(0, 0, 255);
    private byte red, green, blue;

    public Color(byte r, byte g, byte b) {
        red = r;
        green = g;
        blue = b;
    }
}

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

public class Color
{
    public static readonly Color Black = new Color(0, 0, 0);
    public static readonly Color White = new Color(255, 255, 255);
    public static readonly Color Red = new Color(255, 0, 0);
    public static readonly Color Green = new Color(0, 255, 0);
    public static readonly Color Blue = new Color(0, 0, 255);
    private byte red, green, blue;

    public Color(byte r, byte g, byte b) {
        red = r;
        green = g;
        blue = b;
    }
}

من المثير للاهتمام ملاحظة أن أعضاء Const ثابتون دائمًا ، في حين أن العضو القابل للقراءة يمكن أن يكون إما ثابتًا أو لا ، تمامًا مثل الحقل العادي.

من الممكن استخدام كلمة أساسية واحدة لهذين الغرضين ، ولكن هذا يؤدي إلى مشاكل في الإصدار أو مشاكل في الأداء. لنفترض للحظة أننا استخدمنا كلمة رئيسية واحدة لهذا (const) وكتب مطوّر برامج:

public class A
{
    public static const C = 0;
}

وكتب مطور مختلف التعليمات البرمجية التي تعتمد على A:

public class B
{
    static void Main() {
        Console.WriteLine(A.C);
    }
}

الآن ، هل يمكن أن يعتمد التعليمة البرمجية التي تم إنشاؤها على حقيقة أن AC هو ثابت وقت التجميع؟ أي ، هل يمكن استبدال التيار المتردد ببساطة بالقيمة 0؟ إذا قلت "نعم" لهذا ، فهذا يعني أن مطور A لا يمكنه تغيير طريقة تهيئة AC - وهذا يربط بين يدي المطور A بدون إذن. إذا قلت "لا" لهذا السؤال ، فحينئذٍ يتم تفويت عملية تحسين مهمة. ربما يكون مؤلف A هو إيجابي بأن AC سيظل صفرًا دائمًا. يسمح استخدام كل من const و readonly لمطوّر A بتحديد الهدف. هذا يجعل لسلوك إصدار أفضل وكذلك أداء أفضل.


هذا مجرد ملحق للإجابات الأخرى. لن أكررهم (الآن بعد أربع سنوات).

هناك حالات حيث تحتوي const و non-const على دلالات مختلفة. فمثلا:

const int y = 42;

static void Main()
{
  short x = 42;
  Console.WriteLine(x.Equals(y));
}

يطبع True ، في حين:

static readonly int y = 42;

static void Main()
{
  short x = 42;
  Console.WriteLine(x.Equals(y));
}

يكتب False .

السبب هو أن الأسلوب x.Equals يحتوي على overloads اثنين ، واحد يأخذ في short ( System.Int16 ) و واحد يأخذ object ( System.Object ). والسؤال الآن هو ما إذا كان أحدهما أو كلاهما يتطابق مع حجتي.

عندما يكون y هو ثابت وقت التجميع (حرفي) ، الحالة const ، يصبح من المهم وجود تحويل ضمني من int إلى short بشرط أن يكون int ثابتًا ، بشرط أن يتحقق المترجم C # من أن قيمته داخل مجموعة short (التي 42 هو). راجع تحويلات التعبير الثابت الضمني في مواصفات لغة C #. لذلك يجب النظر في كل من الحمولات الزائدة. يُفضل التحميل الزائد Equals(short) (أي short هو object ، ولكن ليس كل object short ). لذا يتم تحويل y إلى short ، ويتم استخدام هذا التحميل الزائد. ثم يقارن Equals اثنين من قيمة متطابقة ، وهذا ما يعطي true .

عندما لا يكون y ثابت ، لا يوجد أي تحويل ضمني من int إلى short . ذلك لأن int قد تكون كبيرة جدًا بشكل عام بحيث لا يمكن دمجها في فترة short . (يوجد تحويل صريح ، لكنني لم أقل كلمة Equals((short)y) ، لذلك لا ينطبق ذلك.) نرى أن هناك حملًا زائدًا واحدًا ينطبق ، Equals(object) واحد. لذا فإن y محاصر object . ثم Equals مقارنة System.Int16 إلى System.Int32 ، وحيث لا تتوافق حتى أنواع وقت التشغيل ، سيؤدي ذلك إلى false .

نخلص إلى أنه في بعض الحالات (النادرة) ، يمكن تغيير عضو const إلى حقل static readonly (أو الطريقة الأخرى ، عندما يكون ذلك ممكناً) تغيير سلوك البرنامج.


هناك أمر واحد يجب ملاحظته هو أن const مقيّد بأنواع البدائية / القيمة (الاستثناء هو السلاسل)


يوجد اختلاف طفيف بين const وحقول statonly ثابتة في C # .Net

يجب تهيئة const مع القيمة في وقت التحويل البرمجي.

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

public const DateTime dt = DateTime.Today;  //throws compilation error
public const string Name = string.Empty;    //throws compilation error
public static readonly string Name = string.Empty; //No error, legal

يمكن اعتبار readonly كما ثابتة ، ولكن ليس من الضروري. لا حاجة للتهيئة في وقت الإعلان. يمكن تعيين قيمته أو تغييره باستخدام مُنشئ مرة واحدة. لذلك هناك إمكانية لتغيير قيمة الحقل readonly مرة واحدة (لا يهم ، إذا كان ثابت أو لا) ، وهو أمر غير ممكن مع const.


قراءة ثابتة فقط : يمكن تغيير القيمة من خلال منشئ ثابت في وقت التشغيل. ولكن ليس من خلال وظيفة العضو.

ثابت : افتراضيا ثابت. لا يمكن تغيير القيمة من أي مكان (Ctor، Function، runtime etc no-where).

قراءة فقط : يمكن تغيير القيمة من خلال منشئ في وقت التشغيل. ولكن ليس من خلال وظيفة العضو.

يمكنك إلقاء نظرة على بلدي repo: أنواع الممتلكات C # .





constants