لماذا يجب تهيئة متغيرات الأعضاء في المنشئات؟

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

  •  22-08-2019
  •  | 
  •  

سؤال

عندما بدأت العمل مع لغات البرمجة الشيئية لأول مرة، تعلمت القاعدة التالية:

عند الإعلان عن حقل في الفصل الدراسي، لا تقم بتهيئته بعد.افعل ذلك في المنشئ.

مثال في C#:

public class Test
{
    private List<String> l;

    public Test()
    {
        l = new List<String>();
    }
}

ولكن عندما سألني أحدهم مؤخرًا عن سبب قيامي بذلك، لم أتمكن من التوصل إلى سبب.لست على دراية بالأعمال الداخلية لـ C# (أو لغات البرمجة الأخرى، في هذا الصدد، لأنني أعتقد أنه يمكن القيام بذلك بجميع لغات OO).

اذا لماذا يكون هذا عمله؟هل هو الأمن؟ملكيات؟

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

المحلول

  • إذا كان لديك مُنشئات متعددة، فقد ترغب في تهيئة الحقل لقيم مختلفة

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

نصائح أخرى

سيأخذ برنامج التحويل البرمجي C# أي تهيئة للعضو غير الثابت تقوم بها في السطر وينقلها إلى المُنشئ نيابةً عنك.وبعبارة أخرى هذا:

class Test
{
    Object o = new Object();
}

يتم تجميعها لهذا:

class Test
{
    Object o;

    public Test()
    {
        this.o = new Object();
    }
}

لست متأكدًا من كيفية تعامل المترجمين للغات الأخرى مع هذا الأمر، لكن فيما يتعلق بـ C#، فهي مسألة أسلوب وأنت حر في فعل ما تريد. يرجى ملاحظة أنه يتم التعامل مع الحقول الثابتة بشكل مختلف: اقرأ هذه المقالة لمزيد من المعلومات حول ذلك.

وسبب واحد للقيام بذلك هو أنه يضع كافة التعليمات البرمجية التهيئة في مكان واحد وهو مناسب لقراءة الآخرين لصفك. أما وقد قلت هذا وأنا في الحقيقة لا تفعل ذلك لسببين أساسيين. (1) I استخدام TDD / وحدة اختبار لتحديد سلوك صفي. إذا كنت تريد أن تعرف ما يفعله منشئ parameterless، يجب قراءة حقا الاختبارات لقد بنيت على منشئ parameterless. (2) مع C # 3.0، أنا عادة استخدام الخصائص الآلية والتهيئة متوافقة مع منشئ parameterless إلى مثيل كائن. هذا هو أكثر مرونة ويضع تعريف خصائص الحق في السطر حيث يتم استخدام التعليمات البرمجية. وهذا من شأنه تجاوز أي التهيئة في المنشئ لذلك أنا نادرا ما تضع أي هناك. بالطبع، هذا لا ينطبق إلا على C #.

والسابقين. (من 2)

  var foo = new Foo { Bar = "baz" };

  public class Foo
  {
       public string Bar { get; set; }

       public Foo() { }
  }

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

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

وأنا أحب دائما أن نفكر في الدرجة كمصنع للكائنات، ومنشئ كمحطة نهائية على خط الإنتاج. الحقول التي أعلنت في الطبقة هي المخططات descirbing الكائن ولكن لن تتحقق هذه الخطة إلى كائن قبل أن يتم أمر مثل هذا الكائن tthrough استدعاء منشئ ... أيضا، كما أشار شخص ما، والقيام كل ما تبذلونه من initialisations في ومنشئ الخاص بك تحسين القراءة، فضلا عن أنه فيل توفير dynamicity في initialisation (قد لا يكون منشئ parameterless كنت تتعامل مع).

وأيضا، في بعض اللغات يمكن استخدام منشئ لإعادة كائن إلى حالته الأصلية، ولهذا السبب سيكون من الضروري عندئذ instatiate الكائن في منشئ.

scroll top