سؤال

يبدو أن إرجاع كائن جديد إلى المشغلين المثقلين هو الشيء الوحيد الذي يجب فعله.يمين؟

  • إذا كان لديك فئة (X) تحتوي على مخزن مؤقت كبير
  • يحتوي جزء من المخزن المؤقت على محتوى، والباقي مجاني.
  • لقد قمت بتحميل عامل التشغيل الثنائي + بشكل زائد لدمج كائنين (من نفس النوع) عن طريق إنشاء كائن جديد يحتوي على المحتويات الملحقة لكلا المعاملين.

بعبارة أخرى:

z = x + y // z is a new object containing the appended data from x and y. 

من الواضح أن هذا أمر جيد لأننا لا نريد تشويه x أو y أثناء العملية.ومع ذلك، فإن مواصفات لغة C# 7.2.2 تقول:

عندما يتم تحميل عامل ثنائي بشكل زائد، فإن عامل التعيين المقابل (إن وجد) يتم أيضًا تحميله بشكل زائد ضمنيًا.

هذا يعني ذاك:

x += y;  // will create a new x, copy contents of old x merged with y 
         //  and the old x will be garbage collected at some point

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

أدرك أنه يمكن القيام بذلك باستخدام x.Add(y) بسيط.أشعر بالفضول إذا كانت هناك طريقة للقيام بذلك باستخدام عوامل التشغيل.على سبيل المثال لمعرفة أننا داخل عامل المهمة وتنفيذ الروتين الأمثل.

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

المحلول

أنا شخصياً أحب الطريقة التي نفذت بها C# هذا.

ومن "الواضح" أكثر أن:

x += y;

و

x = x + y;

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

سيكون فرق الأداء ضئيلًا جدًا، وهذا أيضًا يسهل التنفيذ والصيانة، لذلك أفضّل بشدة نهج C#.

نصائح أخرى

تقوم جميع العوامل الثنائية الرياضية بإرجاع كائن جديد.على سبيل المثاللن ترغب في أن يغير 2+3 قيمة واحد منهم إلى خمسة لمجرد أنك تضيفهم.وبعبارة أخرى، فإن دلالات العوامل المعنية واضحة جدًا ويتم فرضها من خلال المواصفات.إذا كنت تريد شيئًا مختلفًا، فسيتعين عليك أن تصنع شيئًا مختلفًا :).وأنا شخصيا أحب مقارنتها بـ c++ حيث يمكنك إجراء التحميل الزائد مثل A=B=C يمكن أن يؤدي إلى حذف C، وعدم تعيين B، وتساوي A أي قيمة بغض النظر عن C أو B

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