سؤال

ماهو الفرق بين const و readonly وهل تستخدم واحدة على الأخرى؟

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

المحلول

عدا عن الاختلاف الظاهري

  • الاضطرار إلى الإعلان عن القيمة في وقت تعريف a const ضد readonly يمكن حساب القيم ديناميكيًا ولكن يجب تعيينها قبل خروج المُنشئ.بعد ذلك يتم تجميده.
  • 'const's ضمنا static.أنت تستخدم أ ClassName.ConstantName تدوين للوصول إليهم.

هناك فرق دقيق.النظر في فئة محددة في AssemblyA.

public class Const_V_Readonly
{
  public const int I_CONST_VALUE = 2;
  public readonly int I_RO_VALUE;
  public Const_V_Readonly()
  {
     I_RO_VALUE = 3;
  }
}

AssemblyB مراجع AssemblyA ويستخدم هذه القيم في التعليمات البرمجية.عندما يتم تجميع هذا،

  • في حالة const القيمة، إنها مثل البحث عن الاستبدال، القيمة 2 "مخبأة في". AssemblyBإلي.وهذا يعني أنه إذا غدا سأقوم بالتحديث I_CONST_VALUE إلى 20 في المستقبل. AssemblyB سيظل لديه 2 حتى أعيد ترجمته.
  • في حالة readonly القيمة، فهي مثل ref إلى مكان في الذاكرةلا يتم خبز القيمة في AssemblyBإلي.وهذا يعني أنه إذا تم تحديث موقع الذاكرة، AssemblyB يحصل على القيمة الجديدة دون إعادة الترجمة.حتى إذا I_RO_VALUE تم التحديث إلى 30، ما عليك سوى البناء AssemblyA.كافة العملاء لا تحتاج إلى إعادة ترجمة.

لذا، إذا كنت واثقًا من أن قيمة الثابت لن تتغير، فاستخدم a const.

public const int CM_IN_A_METER = 100;

ولكن إذا كان لديك ثابت قد يتغير (على سبيل المثال.w.r.t.دقة)..أو في حالة الشك، استخدم أ readonly.

public readonly float PI = 3.14;

تحديث:يحتاج أكو إلى الحصول على إشارة لأنه أشار إلى ذلك أولاً.أحتاج أيضًا إلى التوصيل حيث تعلمت هذا .. لغة C# الفعالة - بيل فاغنر

نصائح أخرى

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

الثوابت

  • الثوابت ثابتة بشكل افتراضي
  • يجب أن يكون لها قيمة في وقت الترجمة (يمكنك على سبيل المثال3.14 * 2، ولكن لا يمكن استدعاء الأساليب)
  • يمكن الإعلان عنها ضمن وظائف
  • يتم نسخها في كل تجميع يستخدمها (يحصل كل تجميع على نسخة محلية من القيم)
  • يمكن استخدامها في السمات

حقول المثيلات للقراءة فقط

  • يجب أن يكون لديك قيمة محددة بحلول وقت خروج المنشئ
  • يتم تقييمها عند إنشاء المثيل

الحقول الثابتة للقراءة فقط

  • يتم تقييمها عندما يصل تنفيذ التعليمات البرمجية إلى مرجع الفئة (عند إنشاء مثيل جديد أو تنفيذ طريقة ثابتة)
  • يجب أن يكون لها قيمة تم تقييمها بحلول الوقت الذي يتم فيه إنشاء المنشئ الثابت
  • لا يُنصح بوضع ThreadStaticAttribute عليها (سيتم تنفيذ المُنشئات الثابتة في مؤشر ترابط واحد فقط وسيتم تعيين القيمة لمؤشر الترابط الخاص به؛جميع المواضيع الأخرى سيكون لها هذه القيمة غير مهيأة)

فقط للإضافة، القراءة فقط لأنواع المراجع تجعل المرجع للقراءة فقط وليس القيم.على سبيل المثال:

public class Const_V_Readonly
{
  public const int I_CONST_VALUE = 2;
  public readonly char[] I_RO_VALUE = new Char[]{'a', 'b', 'c'};

  public UpdateReadonly()
  {
     I_RO_VALUE[0] = 'V'; //perfectly legal and will update the value
     I_RO_VALUE = new char[]{'V'}; //will cause compiler error
  }
}

وهذا ما يفسر ذلك.ملخص:يجب أن تتم تهيئة const في وقت الإعلان، ويمكن تهيئة للقراءة فقط على المنشئ (وبالتالي يكون لها قيمة مختلفة اعتمادًا على المنشئ المستخدم).

يحرر:انظر مسكتك Gishu أعلاه لمعرفة الفرق الدقيق

const:لا يمكن تغييره في أي مكان.

readonly:لا يمكن تغيير هذه القيمة إلا في المنشئ.لا يمكن تغييرها في الوظائف العادية.

هناك مشكلة صغيرة مع للقراءة فقط.يمكن تعيين حقل للقراءة فقط عدة مرات داخل المُنشئ (المنشئين).حتى لو تم تعيين القيمة في منشئين متسلسلين مختلفين، فلا يزال مسموحًا به.


public class Sample {
    private readonly string ro;

    public Sample() {
        ro = "set";
    }

    public Sample(string value) : this() {
        ro = value; // this works even though it was set in the no-arg ctor
    }
}

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

public class MyClass
{
    public const double PI1 = 3.14159;
}

أ readonly العضو يشبه الثابت من حيث أنه يمثل قيمة لا تتغير.الفرق هو أن أ readonly يمكن تهيئة العضو في وقت التشغيل، في المُنشئ، بالإضافة إلى إمكانية تهيئته عند الإعلان عنه.

public class MyClass1
{
     public readonly double PI2 = 3.14159;

     //or

     public readonly double PI3;

     public MyClass2()
     {
         PI3 = 3.14159;
     }
}

مقدار ثابت

  • لا يمكن الإعلان عنها static (فهي ثابتة ضمنيًا)
  • يتم تقييم قيمة الثابت في وقت الترجمة
  • تتم تهيئة الثوابت عند الإعلان فقط

يقرأ فقط

  • يمكن أن تكون إما على مستوى المثيل أو ثابتة
  • يتم تقييم القيمة في وقت التشغيل
  • يمكن تهيئة للقراءة فقط في الإعلان أو عن طريق التعليمات البرمجية في المنشئ

Const هو ثابت وقت الترجمة بينما يسمح للقراءة فقط بحساب القيمة في وقت التشغيل وتعيينها في المُنشئ أو مُهيئ الحقل.لذلك، يكون "const" دائمًا ثابتًا ولكن "للقراءة فقط" يصبح للقراءة فقط بمجرد تعيينه.

إريك ليبرت لدى فريق C# مزيد من المعلومات حول أنواع مختلفة من الثبات

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

ملخص:

  • يتم تعيين قيمة خاصية const الخاصة بك في وقت الترجمة ولا يمكن تغييرها في وقت التشغيل
  • لا يمكن وضع علامة على Const على أنها ثابتة - تشير الكلمة الأساسية إلى أنها ثابتة، على عكس الحقول المخصصة للقراءة فقط والتي يمكن ذلك.
  • لا يمكن أن يكون Const أي شيء باستثناء أنواع القيمة (البدائية).
  • الكلمة الأساسية للقراءة فقط تضع علامة على الحقل على أنه غير قابل للتغيير.ومع ذلك يمكن تغيير الخاصية داخل منشئ الفئة
  • يمكن أيضًا دمج الكلمة الأساسية للقراءة فقط مع الكلمة الأساسية الثابتة لجعلها تعمل بنفس طريقة عمل const (على الأقل ظاهريًا).هناك فرق ملحوظ عندما تنظر إلى IL بين الاثنين
  • يتم وضع علامة على حقول const على أنها "حرفية" في IL بينما تكون readonly "initonly"

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

ثابت :بواسطة ثابت افتراضي.لا يمكن تغيير القيمة من أي مكان (Ctor، الوظيفة، وقت التشغيل، وما إلى ذلك)

مسكتك أخرى:يمكن تغيير قيم القراءة فقط عن طريق التعليمات البرمجية "المخادعة" عبر الانعكاس.

var fi = this.GetType()
             .BaseType
             .GetField("_someField", 
                       BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(this, 1);

هل يمكنني تغيير حقل خاص موروث للقراءة فقط في C# باستخدام الانعكاس؟

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

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

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

ملاحظة أخيرة:يكون الحقل const ثابتًا، ولكن العكس غير صحيح.

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

مثال:

public static class Text {
  public const string ConstDescription = "This can be used.";
  public readonly static string ReadonlyDescription = "Cannot be used.";
}

public class Foo 
{
  [Description(Text.ConstDescription)]
  public int BarThatBuilds {
    { get; set; }
  }

  [Description(Text.ReadOnlyDescription)]
  public int BarThatDoesNotBuild {
    { get; set; }
  }
}

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

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

آخر مسكتك.

نظرًا لأن const يعمل فقط مع أنواع البيانات الأساسية، إذا كنت تريد العمل مع فصل دراسي، فقد تشعر بأنك "مجبر" على استخدام ReadOnly.ومع ذلك، احذر من الفخ!تعني القراءة فقط أنه لا يمكنك استبدال الكائن بكائن آخر (لا يمكنك جعله يشير إلى كائن آخر).لكن أي عملية تحتوي على مرجع للكائن تكون حرة في تعديل القيم داخل الكائن!

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

يوجد فرق ملحوظ بين حقول const و readonly في C#.Net

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

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

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

class A
{
    public readonly int Id;

    public A(int i)
    {
        Id = i;
    }
}

ومن ثم يمكن تهيئة الحقل للقراءة فقط بقيم محددة فورية، كما يلي:

A objOne = new A(5);
A objTwo = new A(10);

هنا، سيكون لمثيل objOne قيمة الحقل للقراءة فقط كـ 5 وobjTwo له 10.وهو أمر غير ممكن باستخدام const.

سيتم تجميع الثابت في المستهلك كقيمة حرفية بينما ستكون السلسلة الثابتة بمثابة مرجع للقيمة المحددة.

كتمرين، حاول إنشاء مكتبة خارجية واستهلكها في تطبيق وحدة التحكم، ثم قم بتغيير القيم الموجودة في المكتبة وإعادة ترجمتها (بدون إعادة ترجمة برنامج المستهلك)، وقم بإسقاط ملف DLL في الدليل وتشغيل EXE يدويًا، يجب أن تجد أن السلسلة الثابتة لا تتغير.

ثابت

نحتاج إلى توفير القيمة لحقل const عند تعريفه.يقوم المترجم بعد ذلك بحفظ قيمة الثابت في البيانات التعريفية للتجميع.هذا يعني أنه يمكن تعريف الثابت فقط للنوع البدائي مثل boolean وchar وbyte وما إلى ذلك.تُعتبر الثوابت دائمًا أعضاءً ثابتين، وليس أعضاء مثيلات.

يقرأ فقط

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

المزيد عن كليهما وأوضح هنا في هذه المقالة

مقدار ثابت

  1. يمكن تطبيق الكلمة الأساسية const على الحقول أو المتغيرات المحلية
  2. يجب علينا تعيين حقل ثابت في وقت الإعلان
  3. لم يتم تخصيص ذاكرة لأن قيمة const مضمنة في كود IL نفسه بعد التحويل البرمجي.إنه مثل البحث عن كافة تكرارات المتغير const واستبداله بقيمته.لذا فإن كود IL بعد التجميع سيكون له قيم مشفرة بدلاً من المتغيرات const
  4. تكون Const في C# ثابتة بشكل افتراضي.
  5. القيمة ثابتة لجميع الكائنات
  6. هناك مشكلة في إصدار dll - وهذا يعني أنه عندما نقوم بتغيير متغير أو خاصية const عامة (في الواقع، ليس من المفترض أن يتم تغييرها من الناحية النظرية)، يجب إعادة بناء أي dll أو تجميع آخر يستخدم هذا المتغير
  7. يمكن فقط تعريف الأنواع المضمنة في C# على أنها ثابتة
  8. لا يمكن تمرير حقل Const كمعلمة ref أو out

يقرأ فقط

  1. تنطبق الكلمة الأساسية للقراءة فقط على الحقول وليس على المتغيرات المحلية
  2. يمكننا تعيين حقل للقراءة فقط في وقت الإعلان أو في المُنشئ، وليس بأي طرق أخرى.
  3. الذاكرة الديناميكية المخصصة للحقول للقراءة فقط ويمكننا الحصول على القيمة في وقت التشغيل.
  4. ينتمي للقراءة فقط إلى الكائن الذي تم إنشاؤه بحيث يتم الوصول إليه من خلال مثيل الفئة فقط.لجعله عضوًا في الفصل، نحتاج إلى إضافة كلمة أساسية ثابتة قبل القراءة فقط.
  5. قد تكون القيمة مختلفة اعتمادًا على المنشئ المستخدم (لأنه ينتمي إلى كائن الفئة)
  6. إذا أعلنت عن أنواع غير بدائية (نوع مرجعي) كمرجع للقراءة فقط فهو غير قابل للتغيير وليس الكائن الذي يحتوي عليه.
  7. نظرًا لأنه يتم الحصول على القيمة في وقت التشغيل، فلا توجد مشكلة في إصدار dll مع الحقول/الخصائص للقراءة فقط.
  8. يمكننا تمرير حقل للقراءة فقط كمرجع أو معلمات خارج في سياق المنشئ.

بشكل رئيسي؛يمكنك تعيين قيمة لحقل ثابت للقراءة فقط إلى قيمة غير ثابتة في وقت التشغيل، في حين يجب تعيين قيمة ثابتة للثابت.

أ const يجب أن يكون مشفر, ، بينما readonly يمكن ان يكون تعيين في المنشئ الطبقة.

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

على سبيل المثال، يمكن استخدام أعضاء 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;
    }
}

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

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);
    }
}

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

للقراءة فقط: ستتم تهيئة القيمة مرة واحدة فقط من مُنشئ الفئة.
مقدار ثابت:يمكن تهيئتها في أي وظيفة ولكن مرة واحدة فقط

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

يتذكر:بالنسبة لأنواع المراجع، في كلتا الحالتين (الثابت والمثيل)، يمنعك معدِّل القراءة فقط من تعيين مرجع جديد للحقل.إنه على وجه التحديد لا يجعل الكائن المشار إليه بالمرجع غير قابل للتغيير.

لمزيد من التفاصيل، يرجى الرجوع إلى الأسئلة المتداولة حول C# حول هذا الموضوع:http://blogs.msdn.com/csharpfaq/archive/2004/12/03/274791.aspx

يتم الإعلان عن المتغيرات الثابتة وتهيئتها في وقت الترجمة.لا يمكن تغيير القيمة بعد العنابر.سيتم تهيئة متغيرات القراءة فقط من المُنشئ الثابت للفئة فقط.يتم استخدام القراءة فقط فقط عندما نريد تعيين القيمة في وقت التشغيل.

شيء واحد يجب إضافته إلى ما قاله الناس أعلاه.إذا كان لديك تجميع يحتوي على قيمة للقراءة فقط (على سبيل المثال.للقراءة فقط MaxFooCount = 4؛)، يمكنك تغيير القيمة التي تراها التجميعات المستدعية عن طريق شحن إصدار جديد من هذا التجميع بقيمة مختلفة (على سبيل المثال.للقراءة فقط MaxFooCount = 5؛)

ولكن مع const، سيتم طيها في رمز المتصل عند تجميع المتصل.

إذا وصلت إلى هذا المستوى من إتقان لغة #C، فأنت جاهز لقراءة كتاب بيل فاغنر، لغة البرمجة الفعالة:50 طريقة محددة لتحسين C# التي تجيب على هذا السؤال بالتفصيل ، (و 49 أشياء أخرى).

والفرق الرئيسي هو أن Const هو المعادل C لـ #DEFINE.يتم استبدال الرقم حرفيًا ببرنامج التحويل البرمجي المسبق.يتم التعامل مع القراءة فقط كمتغير.

يكون هذا التمييز ذا أهمية خاصة عندما يكون لديك مشروع أ يعتمد على ثابت عام من المشروع ب.لنفترض أن التغييرات الثابتة العامة.الآن سيؤثر اختيارك const/readonly على السلوك في المشروع A:

مقدار ثابت:لا يلتقط المشروع A القيمة الجديدة (ما لم تتم إعادة ترجمته باستخدام الثوابت الجديدة بالطبع) لأنه تم تجميعه باستخدام الثوابت البديلة.

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

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

أتمنى أن يساعد هذا ، آلان.

بكلمات بسيطة، Const هو وقت الترجمة والقراءة فقط هي وقت التشغيل.

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