مقایسه رشتهها در #C
سه شنبه 8 بهمن 1398در این مقاله میخواهیم به رشتهها (string) بپردازیم. در اینجا خواهید آموخت کدام روش در C# برای بررسی اینکه آیا دو رشته با هم برابر هستند یا نه بهترین روش است.
شما میتوانید برابری رشتهها را با دو روش زیر بررسی کنید:
با استفاده از عملگر ==
با استفاده از متد Equals()
نکته: سیشارپ همچنین شامل متدهای String.Compare() و String.CompareTo() است، اما این متدها به معنای مقایسه تساوی رشته نیستند، بلکه منظور بررسی موقعیتهای نسبی رشتهها به ترتیب مرتبشده است. در اینجا ما فقط میخواهیم برابری دو رشته را بررسی کنیم و نه موقعیت مرتبسازی را، بنابراین ما این مبحث را پوشش نمیدهیم.
بیایید سناریوهای متفاوتی را از مقایسه برابری رشتهها ببینیم.
مقایسه رشتههای حساس به حروف
هر دو روش == و متد Equals() محتوای رشتهها را مقایسه میکنند. بنابراین وقتی شما رشتههای حساس به حروف و در en culture (فرهنگ انگلیسی) را مقایسه میکنید هیچ تفاوتی بین آنها وجود ندارد.
string str1 = "London"; string str2 = "London"; str1 == str2; // true str1.Equals(str2); // true
چه اتفاقی میافتد اگر یک رشته null باشد؟
string str1 = "London"; string str2 = null; str1 == str2; // false str1.Equals(str2); // false str2.Equals(str1); // NullReferenceException
همانطور که در بالا مشاهده میکنید، اگر رشتهای null باشد، با عملگر == هیچ مشکلی وجود ندارد. اما فراخوانی متد Equals() بر روی null، NullReferenceException را پرتاب میکند. بنابراین قبل از فراخوانی متد Equals() مطمئن شوید که مقدار رشته null نیست.
حالا مثال زیر را در مقایسه یک رشته با یک آبجکت در نظر بگیرید.
string str1 = "London"; object obj = "London"; str1 == obj; // true str1.Equals( obj); // true obj.Equals(str1); // true
بنابراین هنگام مقایسه یک رشته با یک آبجکت، نتیجه صحیح میدهد.
حالا بیایید سناریوی کمی پیچیدهتری را ببینیم.
string str = "London"; StringBuilder sb = new StringBuilder("London"); object obj = sb.ToString(); str == obj; // false str == sb.ToString();// true str.Equals(obj);// true obj.Equals(str1); //true
در مثال بالا، اگرچه مقادیر مشابه هستند، str == obj مقدار false را برمیگرداند. چرا؟
نوع String، overload عملگر == را اجرا میکند، که مقدار دو عملوند را مقایسه میکند. با این حال بعد از تبدیل کردن StringBuilder به object، overloadهای مختلف را فراخوانی میکند که رفرنس دو عملوند را مقایسه میکند. بنابراین str == obj نتیجه نادرستی را میدهد.
پس اگر در حال مقایسه رشتههای حساس به حروف هستید، در اکثر موارد == و Equals() رفتار مشابه دارند. اما در سناریویی مانند مثال بالا، == نتیجه نادرستی میدهد.
مقایسه رشتههای غیر حساس به حروف
عملگر == همیشه رشتههای حساس به حروف را مقایسه میکند.
string str1 = "LONDON"; string str2 = "london"; str1 == str2; //false
از متد Equals() برای مقایسه رشتههای غیر حساس به حروف با استفاده از پارامتر StringComparison استفاده کنید.
string str1 = "LONDON"; string str2 = "london"; str1.Equals(str2, StringComparison.CurrentCultureIgnoreCase); // true
همیشه قبل از فراخوانی متد Equals()، با استفاده از شرط null بودن با استفاده از عملگر ؟ مطمئن شوید که رشته null نیست.
== در مقایسه با Equals
نتیجهگیری
اگر مطمئن هستید که نوع دو عملوند رشته است و میخواهید رشتههای حساس به حروف را مقایسه کنید، هر دو نتیجه درستی را میدهند. با این حال، شما نوع عملوندها را نمیدانید و میخواهید رشتههای غیرحساس به حروف را مقایسه کنید یا میخواهید رشتهها را در یک culture خاص مقایسه کنید، پس از متد Equals() استفاده کنید. فقط وقتی متد Equals() را فراخوانی میکنید مطمئن شوید که رشته null نیست.
- C#.net
- 5k بازدید
- 3 تشکر