هل لديك .NET وسيلة لحل سلسلة فارغة إلى string.empty؟

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

  •  12-09-2019
  •  | 
  •  

سؤال

لدي طريقة سطر واحدة حل سلسلة فارغة إلى String.empty التي اعتقدت أنها قد تكون مفيدة كطريقة تمديد - لكن لا يمكنني العثور على طريقة مفيدة لجعلها كذلك.

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

فكرت في إضافة ذلك إلى فئة المساعد ولكن هذا يضيف فقط تعقيدا غير ضروري من وجهة نظر الاكتشاف.

لذلك هذا السؤال في جزأين أفترض:

  1. هل لدى .NET Framework في طريق مبني لحل سلسلة فارغة إلى String.Mepty هي معرفة شائعة أنني فاتني في مكان ما على طول الطريق؟
  2. إذا لم يفعل ذلك - هل يعرف أحد وسيلة لإضافة هذه الطريقة كتمديد ثابت لفئة السلسلة؟

هتاف مقدما

يحرر:

حسنا، أعتقد أنني يجب أن أكون أكثر وضوحا قليلا - أنا بالفعل على دراية جيدا ب Calallescing Null، واستخدم هذا في مكان حيث لدي عشرات أو نحو ذلك السلاسل التي يتم تفتيشها لحساب رمز التجزئة.

كما يمكنك أن تتخيل، 12 خطا من التعليمات البرمجية تتبع كل شيء عن كثب بعضها البعض جميعا يحتوي على بناء جملة Coallescing Null هو عيون، لذلك قمت بتحريك العملية الكلية الفارغة في طريقة لجعل الأمور أسهل على العينين. ومع ذلك، وهو مثالي، فسيكون ذلك امتدادا مثاليا لكائن السلسلة:

int hashcode =
FirstValue.ResolveNull().GetHashCode() ^
SecondValue.ResolveNull().GetHashCode() ^
...

على خطوط العشرات أسهل بكثير من:

int hashcode =
(FirstValue ?? String.Empty).GetHashCode() ^
(SecondValue ?? String.Empty).GetHashCode() ^
...

كنت أركض في مشاكل مترجم عندما لا أعلن صراحة عن قيم سلسلة بلدي كافية ولكنها اعتمدت على الضمني:

 string s;

إذا كنت تحدد صراحة:

string s = null;

يمكنك الاتصال بسهولة جدا:

s.ResolveNull();

شكر للجميع المدخلات الخاصة بك.

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

المحلول

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

يمكن استدعاء طرق الإرشاد C # 3.0 على أجهزة استقبال NULL (نظرا لأنها ثابتة في الممارسة)، ولكنها تتصرف بمثابة طرق مثيل. لذلك فقط جعلها طريقة تمديد.

نصائح أخرى

لا أعتقد أن هناك أي شيء مبني لهذا. فكرتي الأولى، وما أقوم به في كثير من الأحيان، هو استخدام مشغل Coalesce:

string s = null;
string x = s ?? string.Empty;

someexpressionvolving (s ؟؟ "")؛

لا يوجد أي نقطة الحصول على متحمس string.Empty ضد "" - هناك فرق ضئيل:

Console.WriteLine(ReferenceEquals(string.Empty, "")); // true

طريقة التمديد:

public static class StringExtensions
{
    public static String EmptyIfNull(this String instance)
    {
        return instance ?? String.Empty;
    }
}

بالطبع، يمكنك فقط الكتابة بسهولة instance ?? String.Empty في الأماكن التي تحتاج فيها إلى استخدام String.empty بدلا من NULL.

string test = CouldReturnNull() ?? string.Empty;

يمكنك استعمال ال ؟ المشغل (المشغل الفاتح الفاتح) في C # - هل هذا ما تقصده؟ أو هل أسيء فهمها؟

على سبيل المثال

string n = null;
string y = n ?? String.Empty;

y سوف = string.empty؛

string abc = s ?? string.Empty;

أود أن أقول إن تنفيذ هذا كطريقة تمديد سيشعر ببعض الشيء مثل ما نسميه في السويد "السفر إلى الجانب الآخر من الخور لجلب المياه". وبعد عندما أحتاج إلى التأكد من أنني أحصل على سلسلة فارغة بدلا من null في كثير من الأحيان string.Empty:

public void SomeMethod(string param)
{
    string notNull = param + string.Empty;
}

بالتأكيد، قد يؤدي ذلك إلى إنشاء مثيل سلسلة إضافي، ولكن في معظم مواقف العالم الواقعي، لم يكن ذلك مشكلة.

لا يوجد بناء في وظيفة لذلك. ولكن يمكنك كتابة طريقة تمديد صغيرة (أو Minhod ثابت) لنوع السلسلة مع بيان مثل:

عائدات ؟؟ string.emtpy؛

فقط أضف string.empty. إلى أي متغير سلسلة وسوف تكون مضمونة لن تحصل أبدا

string a = null;
string b = null + string.Empty;
string c = "a" + string.Empty;

(a == string.Empty).Dump(); // False
(b == string.Empty).Dump(); // True
(c == "a").Dump(); // True

رميت هذا في LinQPad، وبالتالي .dump ()

هل تبحث في خياراتك ...

هذه التقنية

string b = null + string.Empty;

يولد

IL_0001:  ldsfld      System.String.Empty
IL_0006:  dup         
IL_0007:  brtrue.s    IL_000F
IL_0009:  pop         
IL_000A:  ldstr       ""
IL_000F:  stloc.0     

الخيار الشعبي الآخر:

string b = null ?? string.empty

يولد

IL_0001:  ldsfld      System.String.Empty
IL_0006:  stloc.0     

وهذه

string b = null + "";

يولد هذا

IL_0001:  ldstr       ""
IL_0006:  stloc.0     

ما زلت مفضلة

string b = null + "";

ولكن حقا، IMO، يجب أن تكون مستعدا فقط للتعامل مع NULL عند هضم السلسلة

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