هو الحمولة الزائدة السبيل الوحيد ليكون الافتراضي الحجج وظيفة في C# ؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

هل صحيح أن الطريقة الوحيدة للتعامل مع الافتراضي الحجج وظيفة من خلال وظيفة الحمولة الزائدة?

على سبيل المثال, في بي أستطيع أن أفعل هذا:

function foo($x, $y=0)
{
}

أن أفضل طريقة للتعامل مع ذلك في C# يكون هذا ؟

void foo(int x)
{
  foo(x, 0);
}

void foo(int x, int y)
{
}

على سبيل المثال رفعت من هنا

تحرير

جعلت C# مثلا في الفعلية C# (شكرا بلير كونراد)

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

المحلول

نعم, سيكون ذلك أفضل, إلا أنك حذفت $s على أسماء المعلمات, كما أشار آخرون.للراغبين في الأساس المنطقي وراء عدم وجود قيم المعلمات الافتراضية ، انظر @جيوفاني Galbo تفسير.

نصائح أخرى

فقط لإرضاء بعض الفضول:

من لماذا لا C# دعم الافتراضي المعلمات ؟ :

في لغات مثل C++, قيمة افتراضية يمكن تضمينها كجزء من طريقة الإعلان:

عملية باطلة(موظف موظف منطقي المكافأة = false)

هذا الأسلوب يمكن أن يسمى إما مع:

أ.عملية(موظف, true);

أو

أ.عملية(الموظف) ؛

في الحالة الثانية, المعلمة مكافأة يتم تعيين إلى false.

C# لا تملك هذه الميزة.

السبب في أننا لا نملك هذه الميزة هي ذات الصلة إلى تنفيذ محددة المعالم.في C++ العالم, عندما يقوم المستخدم يكتب:

أ.عملية(الموظف) ؛

مترجم يولد

أ.عملية(موظف كاذبة) ؛

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

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

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

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

الكتابة الزائدة نفسك قليلا أقل ملاءمة ، ولكن نعتقد انه حل مقبول.

فيما يتعلق مقتطفات من c# faq:

معظم المشاكل المذكورة كانت هناك حل VB.Net (على وجه التحديد التحسس و xml التعليقات القضايا) ، وهذا يعني أنهم حقا الرنجة الحمراء-- هناك رمز المتاحة C# الفريق الذي سوف يحل المشكلة.

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

ولذلك عليك أن تزن المتبقية سبب ("في محاولة للحد من السحر") في مقابل الواقع (التي تقر) أن كتابة الزائدة هو "أقل قليلا مريحة".أنا شخصيا أقول وضع ميزة في السماح مبرمج تقرر ما إذا كان أو عدم استخدامه.

الافتراضي الحجج هي جزء من C++, ولكن من C# 3.5 الافتراضي الحجج لا تزال غير معتمدة-- عليك أن الزائد.لقد تم المتاحة في VB.Net منذ 1.0.

نعم.

أو التمشيط.

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

لا AFAIK C# لا يدعم طاغية ، نعم ، هذه هي الطريقة الموصى بها من تحقيق نفس التأثير.

كما أشار إلى أن هذا ليس متاح حاليا في C# إلا أنها سوف تكون موجودة في C# 4.0 مثل سام Ng يناقش في مدونته:

http://blogs.msdn.com/samng/archive/2009/02/03/named-arguments-optional-arguments-and-default-values.aspx

الفلاني هذا ليس القيام بهذه المهمة ؟

void foo(int x):this(x, 0){}

void foo(int x, int y){
 // code here
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top