لماذا توصي إرشادات إطار عمل .Net بعدم استخدام وسيطات ref/out؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

على ما يبدو أنهم "مربكون".هل هذا هو السبب بجدية؟يمكنك التفكير في أي آخرين؟

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

المحلول

هل رأيت كم من المطورين لا نفهم حقا المرجع / من؟

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

نصائح أخرى

من وجهة نظري تعتبر رائحة كود لأنه بشكل عام يوجد خيار أفضل بكثير:إرجاع كائن.

إذا لاحظت، في مكتبة .NET يتم استخدامها فقط في بعض الحالات الخاصة، وهي حاول التحليل-مثل السيناريوهات حيث:

  • إن إرجاع فئة يعني الملاكمة لنوع القيمة
  • يتطلب عقد الطريقة أن تكون سريعة، وبالتالي فإن الملاكمة/فتح الملاكمة ليس خيارًا قابلاً للتطبيق.

والمرجع / خارج يعني تلقائيا التحولية، والبرمجة الوظيفية مع القيم الثابتة هي كل الغضب في هذه الأيام. حاول إدراج دعوة إلى Dictionary.TryGetValue إلى استعلام LINQ. يتطلب API المتغيرات إعلان وأطلال أي "الطلاقة" في API.

وهذا لا أقول هذا هو "السبب"، وإنما هو مثال على "سبب".

و(انظر أيضا

http://lorgonblog.spaces.live.com/blog /cns!701679AD17B6D310!181.entry

وللتعليق على كيفية اللغات وظيفية التعامل مع مثل هذه واجهات برمجة التطبيقات).

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

والابتعاد عن كل ما يمكن أن تجعل الشفرة أكثر مربكة ثم فإنه يجب أن يكون.

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

والمرجع / خارج أيضا لا تعمل مع وفود "وظائفها"، وذلك واجهات برمجة التطبيقات أسلوب أقل composable / قابلة لإعادة الاستخدام مع بعض واجهات برمجة التطبيقات الأخرى التي تستخدم المندوبين.

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

Customer GetCustomerById(int id, out string errorMessage);

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

وشخصيا لو كان لدي الطريقة التي من المتوقع ان يعود اثنين أو أكثر أهمية البيانات / القيم، وأود أن إعادة النظر في تصميم قانون بلدي.

والسبب قيل لي هو GC 1.0 لديه مشاكل عندما استخدمت المرجع / خارج. وGC في 2.0 (وربما ليس 1.1 سواء) لا تملك تلك المشاكل لذلك أود أن عادة تفترض أنها إرث الآن غير مفيد.

وTraumaPony فإنه يكون على ما يرام إذا كنت تعطينا مصدر (URL أو شيء) لهذه الإرشادات إلى إطار .NET.

ويجب أن تكون عودته الأجسام وربما كان السبب على الأرجح أنها تشير لا تستخدم المرجع أو الخروج منه.

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

هل ليس رمز التعقيد سببا كافيا؟ قارن:

int myValue;
ReadFromSomewhere(ref myValue);

ل:

int myValue = ReadFromSomewhere();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top