c# - وفوائدها - محركات السيارات الحديثة




C#3.0 خصائص السيارات-مفيدة أم لا؟ (12)

@ Domenic: أنا لا أحصل عليه .. لا يمكنك القيام بذلك مع خصائص السيارات؟

public string Title { get; }

أو

public string Title { get; private set; }

هل هذا ما تشير اليه؟

ملاحظة: تم نشر هذا عندما كنت بدأت C #. مع 2014 المعرفة ، أستطيع أن أقول حقا أن خصائص السيارات هي من بين أفضل الأشياء التي حدث للغة C #.

اعتدت على إنشاء مواقعي في C # باستخدام حقل خاص وعام:

private string title;
public string Title
{
    get { return title;  }
    set { title = value;  }
}

الآن ، مع .NET 3.0 ، حصلنا على الخصائص التلقائية:

public string Title { get; set; }

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

في الواقع ، لا يظهر الحقل الخاص المخفي حتى في المصحح ، وهو موافق في ضوء حقيقة أن وظائف get / set لا تفعل شيئًا. ولكن عندما أرغب في تنفيذ بعض منطق getter / setter فعليًا ، يجب استخدام الزوج الخاص / العام على أي حال.

أرى فائدة أنني أنقذ الكثير من التعليمات البرمجية (واحد مقابل ستة خطوط) دون أن تفقد القدرة على تغيير منطق getter / setter في وقت لاحق ، ولكن مرة أخرى أستطيع أن أفعل ذلك ببساطة عن طريق التصريح عن حقل عام "Public string Title" بدون الحاجة إلى {get؛ جلس؛ } كتلة ، وبالتالي حتى توفير المزيد من التعليمات البرمجية.

إذن ، ما الذي أفتقده هنا؟ لماذا يريد أي شخص بالفعل استخدام الخصائص التلقائية؟


أستخدم الخصائص التلقائية طوال الوقت. قبل C # 3 لم أتمكن من إزعاج كل الكتابة واستخدمت المتغيرات العامة فقط بدلاً من ذلك.

الشيء الوحيد الذي أفتقده هو القدرة على القيام بذلك:

public string Name = "DefaultName";

يجب عليك تغيير الإعدادات الافتراضية إلى المنشئات باستخدام الخصائص. مضجر :-(


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

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

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

أعتقد أنها نفس الكلمة الرئيسية var. مسألة تفضيل شخصي.


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

ما هو مفقود VS2008 هو refactor الممتلكات التلقائي ينفجر .

حقيقة لدينا refactor الحقل مغلف يجعل الطريقة التي أعمل بها أسرع لاستخدام الحقول العامة فقط.


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


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


بشكل جيد مع مقتطفات الشفرة ، ستكون الخاصية التلقائية التي تحمل الاسم نفسه سبع ضغطات مفاتيح في الإجمالي ؛)


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


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

ابدأ باستخدام حقل internal باستخدام اصطلاح التسمية الذي تستخدمه لموقع ما. عندما كنت لأول مرة سواء

  • تحتاج إلى الوصول إلى الحقل من خارج التجمع ، أو
  • تحتاج إلى إرفاق المنطق إلى getter / setter

افعل هذا:

  1. إعادة تسمية الميدان
  2. اجعلها خاصة
  3. إضافة خاصية عامة

لن يحتاج رمز العميل الخاص بك إلى التغيير.

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


من Bjarne Stroustrup ، مبدع C ++:

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

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


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

يمكنك تعيين نطاقات مختلفة:

public string PropertyName { get; private set; }

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

بدءًا من C # 6 ، يمكنك أيضًا إنشاء خصائص readonly الحقيقية - أي الخصائص الثابتة التي لا يمكن تغييرها خارج المُنشئ:

public string PropertyName { get; }

public MyClass() { this.PropertyName = "whatever"; }

في وقت التجميع الذي سيصبح:

readonly string pName;
public string PropertyName { get { return this.pName; } }

public MyClass() { this.pName = "whatever"; }

في الفصول الثابتة مع الكثير من الأعضاء يوفر هذا الكثير من الكود الزائد.


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

private readonly string title;
public string Title
{
    get { return this.title; }
}

(حيث تتم تهيئة الحقل في المُنشئ بواسطة معلمة تم تمريرها ، ثم تتم قراءة فقط.)

لذلك هذا له مزايا أكثر من مجرد get autoproperty private set .





automatic-properties