هل هناك فرق بين private const و خاصة للقراءة فقط المتغيرات في C# ؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

هل هناك فرق بين وجود private const متغير أو private static readonly متغير في C# (بخلاف الحاجة إلى تعيين const الترجمة الوقت التعبير)?

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

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

المحلول

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

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

إعادة التدريب;على الرغم من أن يمكنك القيام بذلك يدويا, هذا هو الأكثر شيوعا مترجم/وقت التشغيل ميزة حرفية;إذا كنت الحرف الأول وهو حقل للقراءة فقط عن طريق الحرفي:

someField = "abc";

ثم "abc" سيتم اعتقالهم.إذا كنت تقرأ من التكوين ، فإنه لن يكون.لأن سلسلة ثابتة يجب أن تكون حرفية ، كما سيتم المعتقلين ، ولكن يتم الوصول إليها بشكل مختلف:مرة أخرى, قراءة من الميدان هي دي إشارة ، بدلا من ldstr.

نصائح أخرى

والواقع أن هذين النوعين لا يمكن تغييرها بعد أن تم تهيئة ، ولكن هناك بعض الاختلافات بينهما:

  • 'const' يجب تهيئة أين هم أعلن(في وقت الترجمة) ، في حين أن 'للقراءة فقط' يمكن تهيئة حيث أعلن أو داخل منشئ (ع وقت التشغيل).

على سبيل المثال const يمكن استخدامها في هذه الحالة:

public class MathValues
{
  public const double PI = 3.14159;
}

و للقراءة فقط سيكون من الأفضل لهذه الحالة:

public class Person
{
    public readonly DateTime birthDate;

    public Person(DateTime birthDate)
    {
        this.birthDate = birthDate;
    }
}

أو

public class Person
{
    public readonly DateTime birthDate = new DateTime(1986, 1, 24);
}
  • 'const' هو ثابت ، لذلك هو مشترك بين جميع الحالات من هذا الفصل ويمكن الوصول إليها مباشرة (مثل MathValues.PI) ، في حين أن 'للقراءة فقط' ليست ثابتة.نتيجة إعلان مثل 'ثابت const' غير قانوني لأن const ثابتة ، ولكن 'ثابت للقراءة فقط' هو قانوني

  • 'const' يمكن أن تعقد فقط لا يتجزأ من نوع (sbyte, بايت, قصيرة, ushort ، الباحث ، uint ، طويلة ، ulong, char, float, double, العشرية, منطقي, أو سلسلة) ، التعداد ، أو إشارة إلى null (لا فصول أو هياكل لأنهم تهيئة في وقت التشغيل مع "الجديد" الكلمة) ، في حين أن 'للقراءة فقط' يمكن عقد مجمع أنواع الهياكل أو الطبقات (باستخدام كلمات رئيسية جديدة في التهيئة) ولكن لا يمكن اجراء التعدادات

ووانهم فعلا المخزنة شيء ملاحظة حول الثوابت في تنفيذ الخاص بك، لذلك يعلن الكثير منهم <م> سوف زيادة حجم الملف القابل للتنفيذ.

عادة، وهذه ليست مشكلة كبيرة، ولكن صديق لي يعمل في الشركة التي القسري "يجب أن يكون كل شيء CONST" قاعدة وتمكنت من زيادة كبيرة جمعت حجمها القابل للتنفيذ.

هنا الفرق بين C# .صافي const, للقراءة فقط و ثابت للقراءة فقط الحقول (من هذه المادة).

الثوابت:

  • ثابت بشكل افتراضي
  • يجب أن يكون تجميع قيمة الزمن (أي:هل يمكن أن يكون "أ"+"ب" ولكن لا يمكن أن يكون طريقة المكالمات)
  • يمكن استخدامها في الصفات
  • يتم نسخ إلى كل من الجمعية التي يستخدمها (كل الجمعية يحصل على نسخة محلية من القيم)
  • يمكن أن تكون عن وظائف

Readonly سبيل المثال المجالات:

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

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

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

هناك فرق ملحوظ بين const و للقراءة فقط الحقول في C#.Net

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

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

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

class A
{
    public readonly int Id;

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

ثم حقل للقراءة فقط يمكن initialised مع لحظة قيم محددة على النحو التالي:

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

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

في استخدام؟ ليس صحيحا. يتم تقييم Consts في وقت الترجمة، في حين يتم تقييمها للقراءة فقط في وقت التشغيل. يمكنك أيضا تعيين متغير للقراءة فقط قيمة في البناء.

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

private const int[] values = new int[] { 1, 2, 3 };

ولكن كنت <م> يمكن إنشائه باستخدام حقل للقراءة فقط ثابت.

private static readonly int[] values = new int[] { 1, 2, 3 };

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

private static readonly int?[] values = new int?[] { null, 1, 2, 3 };

ولا تستطيع أن تفعل <م> أن مع ثابت، يمكن يا؟

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

في ثابت للقراءة فقط الحالة تحتوي الطبقة يسمح تعديله فقط

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

سبيل المثال للقراءة فقط الحقول مسموح أيضا.

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

class Program

{

  public static readonly Test test = new Test();

  static void Main(string[] args)

  {

     test.Name = "Program";

     test = new Test(); // Error: A static readonly field cannot be assigned to (except in a static constructor or a variable initializer)

  }

}

class Test

{

   public string Name;

}

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

- في تعريف متغير (من خلال متغير مهيئ).

- في منشئ ثابت (على سبيل المثال منشئات إذا كان غير ثابت).


Const في C# .صافي

على سبيل المثال: public const string abc = “xyz”; تهيئة فقط في الإعلان.القيمة تقييمها في وقت الترجمة و لا يمكن تغييرها في وقت التشغيل.محاولة تغيير ذلك سوف يسبب خطأ في التجميع.Const هو بالفعل نوع من الساكنة.منذ حصص البنيات يتم تهيئة في وقت التشغيل مع الكلمة, لا يمكنك تعيين ثابت إلى فئة أو هيكل.ولكن يجب أن يكون واحدا لا يتجزأ أنواع.للقراءة فقط الكلمات الرئيسية في C# .صافي

على سبيل المثال: public readonly string abc; يمكن أن تكون تهيئة رمز الإعلان أو consturctor رمز.القيمة تقييمها في وقت التشغيل.يمكن أن أعلن عن ثابت أو مثيل مستوى السمة.فقط قراءة ميدانية يمكن أن تعقد كائن معقد باستخدام الكلمات الرئيسية الجديدة في وقت التشغيل.

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

وهو للقراءة فقط الأعضاء كما يمكن يستخدم وقت التشغيل الثوابت كما في المثال التالي:

public static readonly uint currentTicks = (uint)DateTime.Now.Ticks;

للقراءة فقط الحقول لا ضمنا ثابتة ، وبالتالي ثابت الكلمة يمكن (ويجب) أن تطبيق للقراءة فقط الميدانية صراحة إذا لزم الأمر.هذا لا يسمح const الحقول التي هي ضمنا ثابت.

للقراءة فقط الأعضاء يمكن أن تعقد كائنات معقدة باستخدام الكلمات الرئيسية الجديدة في التهيئة.

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