مشاريع - مكتبة اكواد c#




متى تستخدم الطبقات الثابتة في C# (8)

أستخدم الفصول الثابتة كوسيلة لتعريف "وظيفة إضافية" يمكن أن يستخدمها كائن من نوع معين في سياق محدد. عادة ما تتحول إلى فئات فائدة.

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

هذا السؤال لديه بالفعل إجابة هنا:

إليك ما يجب على MSDN قوله تحت وقت استخدام الفئات الثابتة :

static class CompanyInfo
{
    public static string GetCompanyName() { return "CompanyName"; }
    public static string GetCompanyAddress() { return "CompanyAddress"; }
    //...
}

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

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


أستخدم فقط فئات ثابتة لطرق المساعد ، ولكن مع ظهور C # 3.0 ، أفضّل استخدام طرق الإضافة لتلك الطرق.

أنا نادرا ما استخدم أساليب الطبقات الثابتة لنفس الأسباب التي تجعلني نادرا ما أستخدم "نمط التصميم" المفرد.


إذا كنت تستخدم أدوات تحليل التعليمات البرمجية (على سبيل المثال ، FxCop ) FxCop بأن تجعل الطريقة (الأساليب) ثابتة إذا لم تقم بالوصول إلى بيانات المثيل. الأساس المنطقي هو أن هناك زيادة في الأداء. المرجع: CA1822: أعضاء علامة على أنها ثابتة ( MSDN ).

إنه أكثر من مبدأ توجيهي من القاعدة ، حقا ...


الطبقات الثابتة مفيدة للغاية ولها مكان ، على سبيل المثال المكتبات.

أفضل مثال يمكنني توفيره هو فئة .Net Math ، فئة ثابتة في مساحة اسم النظام تحتوي على مكتبة لوظائف الرياضيات.

إنه مثل أي شيء آخر ، استخدم الأداة المناسبة للعمل ، وإذا لم يكن أي شيء يمكن إساءة استخدامه.

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

يحتوي C # .Net على عدد من الفئات الثابتة التي تستخدم مثل فئة الرياضيات.

إذاً بالنظر إلى التنفيذ الصحيح فهي مفيدة بشكل كبير.

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


على أساس MSDN :

  1. لا يمكنك إنشاء مثيل لفئات ثابتة
  2. إذا تم تعريف الفئة على أنها ثابتة ، يجب أن يكون متغير العضو ثابتًا لهذه الفئة
  3. مختوم [لا يمكن أن يكون موروثًا]
  4. لا يمكن أن يحتوي على منشئ المثيل
  5. إدارة الذاكرة

مثال: لا يتغير حساب الرياضيات (قيم الرياضيات) [حساب قياسي للقيم المحددة]


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

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

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

تواصل مع OOP الداخلي الخاص بك وأنت لا يمكن أن تذهب الخطأ!


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

ماذا أقصد بهذا؟ حسنا ، عندما أقول عند العمل على بعض DRY ، انتهى بي المطاف بمجموعة من دروس الأسلوب الواحد. قد أقوم فقط بسحب هذه الأساليب إلى فئة ثابتة ثم إدخالها في تبعيات باستخدام مفوَّض. هذا أيضا يلعب بشكل جيد مع حاوية بلدي التبعية (DI) من الخيار Autofac.

بالطبع أخذ اعتماد مباشر على طريقة ثابتة لا يزال شريرا (هناك بعض الاستخدامات غير الشريرة).


هذا سؤال قديم لكنه ساخن للغاية منذ أن دخل OOP. هناك العديد من الأسباب لاستخدام (أو عدم) فئة ثابتة ، بالطبع ، ومعظمها تم تغطيتها في العديد من الإجابات.

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

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

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





static