مقارنات سلسلة C #:الفرق بين CurrentCultureIgnoreCase و InvariantCultureIgnoreCase

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

  •  03-07-2019
  •  | 
  •  

سؤال

عند إجراء مقارنة سلسلة في C#، ما هو الفرق بين القيام بـ

string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.CurrentCultureIgnoreCase);

و

string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.InvariantCultureIgnoreCase);

...وهل من المهم تضمين تلك المعلمة الإضافية، على أي حال؟

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

المحلول

تقدم Microsoft بعض الإرشادات اللائقة حول وقت استخدام InvariantCulture ملكية:

شبكة MSDN:خاصية CultureInfo.InvariantCulture

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

اعتبارات أمنية

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

عمليات السلسلة

إذا احتاج تطبيقك إلى إجراء عملية خيط حساسة للثقافة لا تتأثر بقيمة الثقافة الحالية ، فيجب أن تستخدم طريقة تقبل معلمة CultureInfo.[...]

البيانات المستمرة

تعد خاصية InvariantCulture مفيدة لتخزين البيانات التي لن يتم عرضها مباشرة للمستخدمين.يضمن تخزين البيانات بتنسيق مستقل عن الثقافة تنسيقًا معروفًا لا يتغير.عندما يصل المستخدمون من الثقافات المختلفة إلى البيانات ، يمكن تنسيقها بشكل مناسب بناءً على مستخدم معين.[...]

نصائح أخرى

قدمت المنشورات الأخرى نصيحة جيدة، لكنني أعتقد أنه قد يكون من الجيد عرض مثال على المكان الذي يُحدث فيه فرقًا بالتأكيد:

using System;
using System.Globalization;
using System.Threading;

class Test
{
    static void Main()
    {
        CultureInfo turkish = CultureInfo.CreateSpecificCulture("tr");
        Thread.CurrentThread.CurrentCulture = turkish;                

        // In Turkey, "i" does odd things
        string lower = "i";
        string upper = "I";

        Console.WriteLine(lower.Equals(upper, 
            StringComparison.CurrentCultureIgnoreCase));
        Console.WriteLine(lower.Equals(upper, 
            StringComparison.InvariantCultureIgnoreCase));
    }
}

(لا شك أن هناك العديد من الحالات الأخرى، وكانت هذه هي الحالة الأولى التي فكرت فيها).

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