أفضل الممارسات:الدالة قيمة الإرجاع أو byref إخراج المعلمات ؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

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

هو أفضل نهج:

  1. كتابة الدالة بإرجاع خطأ إذا لم يتم العثور على صحيح إذا وجدت ، وجدت الصف رقم byref/معلمة الإخراج ، أو
  2. كتابة الدالة التي ترجع int و تمرير مرة أخرى -999 إذا كان الصف قيمة ليس العثور على رقم الصف إذا كان كذلك ؟
هل كانت مفيدة؟

المحلول

أنا شخصيا لن تفعل أي مع أن اسم الأسلوب.

وأود أن بدلا من ذلك جعل طريقتين:

TryFindSpecificRow
FindSpecificRow

هذا من شأنه أن اتباع نمط Int32.تحليل/TryParse في C# التي يمكن أن تبدو مثل هذا:

public static Boolean TryFindSpecificRow(DataTable table, out Int32 rowNumber)
{
    if (row-can-be-found)
    {
        rowNumber = index-of-row-that-was-found;
        return true;
    }
    else
    {
        rowNumber = 0; // this value will not be used anyway
        return false;
    }
}

public static Int32 FindSpecificRow(DataTable table)
{
    Int32 rowNumber;


    if (TryFindSpecificRow(table, out rowNumber))
        return rowNumber;
    else
        throw new RowNotFoundException(String.Format("Row {0} was not found", rowNumber));
}

تحرير: تغيرت إلى أن تكون أكثر مناسبة على السؤال.

نصائح أخرى

الوظائف التي لا يجب رمي استثناءات.

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

إذا كان لي أن تختار بين الخيارات الخاصة بك وأود أن اختيار الخيار 2 ، ولكن استخدام ثابت بدلا من -999...

يمكنك أيضا تحديد قيمة الإرجاع كما Nullable و لا عودة إذا وجدت شيئا.

وأود أن اختيار الخيار 2.على الرغم من أنني أعتقد أن مجرد استخدام -1 لا -999.

ريتشارد هاريسون الصواب أن اسمه ثابت هو أفضل من العارية -1 أو -999.

وأود أن تذهب مع 2 أو بعض الاختلاف حيث قيمة الإرجاع يشير إلى ما إذا كانت القيمة الموجودة.

يبدو أن قيمة الصف ترجع الدالة (أو توفر إشارة إلى) بالفعل يشير إلى ما إذا كانت القيمة الموجودة.إذا كانت القيمة غير موجودة, ثم يبدو لا معنى له لتوفير عدد الصفوف التي لا تحتوي على قيمة حتى عودة وينبغي أن تكون القيمة -1 ، أو Null أو أي قيمة أخرى مناسبة خاصة اللغة.وإلا فإن حقيقة أن عدد الصفوف عاد إلى القيمة وجد.

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

تذهب مع 2) ولكن العودة -1 (أو مرجع فارغة إذا العائدين إشارة إلى الصف) هذا المصطلح يستخدم على نطاق واسع (بما في ذلك من قبل .شبكات indexOf (البند) وظائف) هذا ما كنت على الأرجح لا.

راجع للشغل -1 هو أكثر قبولا و ويدلي المستخدمة "الرقم السحري" من -999, ولهذا السبب الوحيد هو "الصحيح" (أسعار المستخدمة هناك لسبب ما).

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

في هذه الحالة, قد لا يكون هناك لا بأس الشرط.إنه خطأ فخ لمدة غير محددة القيم في GridView الذي يربط datatable.

آخر قليل من الاحتمالات ليس بعد ذكرها:

// Method 1: Supports covariance; can return default<T> on failure.
T TryGetThing(ref bool success); 

// Method 2: Does not support covariance, but may allow cleaner code in some cases
// where calling code would use some particular value in in case of failure.
T TryGetThing(T DefaultValue);

// Method 3: Does not support covariance, but may allow cleaner code in some cases
// where calling code would use some particular value in case of failure, but should
// not take the time to compute that value except when necessary.
T TryGetThing(Func<T> AlternateGetMethod);

// Method 4: Does support covariance; ErrorMethod can throw if that's what should
// happen, or it can set some flag which is visible to the caller in some other way.
T TryGetThing(Action ErrorMethod);

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

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