سؤال

مرة أخرى في VB6 ، كتبت بعض الوظائف التي من شأنها أن تتيح لي رمزًا دون الاضطرار إلى الاهتمام بالفرق بين Null و "للسلاسل ، الفارغة و 0 للأرقام ، إلخ رمز للتعامل مع البيانات التي قد تسبب بعض الخطأ غير ذي صلة ؛ 9999/10000 إذا كان هناك شيء أستخدمه كرقم فارغ ، فأنا حقًا أعامله على أنه 0.

أنا الآن في C# ، والفرق بين VB6 و C# 2005 واسعة النطاق ... لذلك لا أعرف حقًا من أين أبدأ في كتابة مجموعتي الجديدة من وظائف المساعد ، أو إذا كنت بحاجة إلى القيام بها على الإطلاق .

لذا ، أحتاج إلى كتابة وظيفة من شأنها أن تقبل سلسلة ، وحقل قاعدة بيانات ، وحقل نموذج/Querysting ، ؟؟؟ ، ثم القيام بكل ما يمكن أن تفعله لتحويل ذلك إلى مزدوج ، وإعادة ذلك إلى إجراء الاتصال .

أحتاج أيضًا إلى القيام بذلك من أجل السراويل القصيرة ، INT16 ، INT32 ، طويل ، كل شيء آخر يمكن أن أهتم به.

ثم سأفعل هذا من أجل الأوتار. والتواريخ.

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

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

المحلول

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

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

public static T SafeConvert<T>(string s, T defaultValue)
{
    if ( string.IsNullOrEmpty(s) )
        return defaultValue;
    return (T)Convert.ChangeType(s, typeof(T));
}

يستخدم:

SafeConvert(null, 0.0) == 0.0;
SafeConvert("", 0.0) == 0.0;
SafeConvert("0", 0.0) == 0.0;

تأخذ هذه الطريقة العامة نوع الإرجاع الخاص بها من نوع الوسيطة الثانية ، والتي يتم استخدامها كقيمة افتراضية عندما تكون السلسلة التي تم تمريرها فارغة أو فارغة. يمر 0 وستحصل على In32 الى الخلف. يمر 0L, Int64. وهلم جرا...

نصائح أخرى

في C# معظم أنواع البيانات ليست قابلة للبطولة (الأرقام ، التواريخ ، إلخ) ، فقط السلاسل هي Nullables. إذا كنت تحصل على بيانات من DB ، فستكون من المحتمل أن تعمل معها قابلية, ، أو النسخة النحوية من أجل الخضوع ، int؟ ، double؟ ، dateTime؟ ، إلخ.

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

أما بالنسبة للسلاسل ، لديك وظيفة string.isnullorempty (STR).

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

public static string ValueOrDefault(this string str) 
{
     if (String.IsNullOrEmpty(str)) return MY_DEFAULT_VALUE;
     else return str;
}

هناك فئة تسمى تحويل في مكتبة .NET. يحتوي على وظائف تسمح لك بالتحويل إلى كل ما تحتاجه من أي نوع أساسي وعدد قليل من الفئات المشتركة (مثل DateTime.)

إنه يعمل بشكل أساسي مثل Convert.toint32 (Val) ؛

تحرير: أنا حقًا بحاجة إلى تعلم قراءة كل الكلمات. لم يلتزم بالقلق بشأن Null ... هناك مشغل لهذا. يمكنك استخدام ال ؟؟ للتحقق من NULL وتقديم افتراضي ولكن قد ينجح ذلك.

قد ترغب أيضًا في النظر إلى LINQ ، فإنه يتعامل مع الكثير من هذا النوع من الخرائط لك.

أعتقد أنه مشابه لـ @shog9. أنا فقط أضف محاولة التقاط لمعالجة إدخال المستخدم غير العادي. أرسل النوع الذي أريد تحويل الإدخال وأخذ الإدخال ككائن.

public static class SafeConverter
{
   public static T SafeConvert<T>(object input, T defaultValue)
   {
       if (input == null)
          return defaultValue; //default(T);

       T result;
       try
       {
           result = (T)Convert.ChangeType(input.ToString(), typeof(T));
       }
       catch
       {
          result = defaultValue; //default(T);
       }
       return result;
   }
} 

الآن اتصل بهم مثل أدناه

SafeConverter.SafeConvert<ushort>(null, 0);
SafeConverter.SafeConvert<ushort>("", 0);
SafeConverter.SafeConvert<ushort>("null", 0);
SafeConverter.SafeConvert<ushort>("-1", 0);
SafeConverter.SafeConvert<ushort>("6", 0);
SafeConverter.SafeConvert<ushort>(-1, 0);
SafeConverter.SafeConvert<ushort>(0, 0);
SafeConverter.SafeConvert<ushort>(1, 0);
SafeConverter.SafeConvert<ushort>(9, 0);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top