স্ট্রিং.একওয়ালস (ক, খ) কীভাবে স্ট্যাকওভারফ্লো এক্সেক্সেশন তৈরি করে না?


159

String ==অপারেটর পরীক্ষা করার সময় , আমি লক্ষ্য করেছি যে এটি কল করে String.Equals(string a, string b), যার অর্থ এটি কেবল একটি পাস-থ্রো।

String.Equals(string a, string b)পদ্ধতিটি পরীক্ষা করে দেখছি যে এটি ==অপারেটরটি ব্যবহার করে সমতা পরীক্ষা করে । এটি আসলে কীভাবে কাজ করছে এবং StackOverflowExceptionযখন এর মতো কিছু করছে "x" == "x"বা করছে না "x" == "y"?

আপডেট : আমি জেটব্রেইনকে জানিয়ে দিয়েছি এবং তারা এটি ডটপিকের জন্য একটি গুরুত্বপূর্ণ অগ্রাধিকার হিসাবে নিয়েছে। https://youtrack.jetbrains.com/issue/DOTP-6789

আমি আইএলএসপিএসের গিটহাব রেপোতেও একটি সমস্যা যুক্ত করেছি।

স্ট্রিং সমতা


ফ্রি। নেট প্রতিফলক (ভি 6) এটি সি # তে "ভুল" প্রদর্শন করে (অর্থাত এটি কেবল দেখায় a == b), তবে ভিবি.নেট: - এ সঠিক a Is b
মার্ক হার্ট

উত্তর:


217

আপনার ডিকম্পাইলারের একটি বাগ রয়েছে। প্রকৃত কোড ওভারলোডেড অপারেটরটিকে বাইপাস করে a == bচেক করে না (Object)a == (Object)b


4
@ অরাভল সত্য, তবে উত্সটি সম্প্রতি প্রকাশিত হয়েছে
ডাস্টিন ডেভিস

2
এটি যদিও কোনও ক্ষেত্রেই বেশ অবলম্বন কোড। একটি সহজ object.ReferenceEquals(a,b)আরও পরিষ্কার হবে ..
ভু

1
@ খুব আমি তর্ক করব যে বর্তমান সংস্করণটি আরও পরিষ্কার। object.ReferenceEqualsCastালাই সংস্করণ (যেমন, যদি aহয় তবে nullকী) সম্পর্কে আপনার কিছু জানার দরকার নেই , এবং যতক্ষণ আপনি জানেন কাস্টিং কী তা অবধারিত নয়।
wchargin

72
"আপনার ডিকম্পাইলারের একটি বাগ রয়েছে"। মাইকে ফোঁটায়।
espinchi

1
@ ভু আমার অনুমান: এমএস বিবেচনা করুন (Object)a == (Object)bএবং Object.ReferenceEquals(a, b)সমানভাবে পঠনযোগ্য সম্পর্কে, তবে Object.ReferenceEquals(a, b)সর্বাধিক ইনলাইন গভীরতা পৌঁছায় যদি কেবল ইনলাইন না হওয়ার সামান্য সুযোগ থাকে তবে তা আমাকে অবাক করে না। এমএস অনেকগুলি মাইক্রো-অপটিমাইজেশন করে, যেহেতু ব্যবহারকারী কোডের বেশিরভাগ টান লুপগুলি এমএস কোডটি কল করে calling

50

মাইক্রোসফ্টের আসল কোডটি এখানে । অপারেটর ==হয় বাস্তবায়িত একটি গুলি

public static bool operator == (String a, String b) {
   return String.Equals(a, b);
}

অপারেটর ==কলগুলি হিসাবে String.Equals প্রয়োগ করা হয়:

public static bool Equals(String a, String b) {
    if ((Object)a==(Object)b) {
        return true;
    }

    if ((Object)a==null || (Object)b==null) {
        return false;
    }

    if (a.Length != b.Length)
        return false;

    return EqualsHelper(a, b);
}

আপনি দেখুন, স্ট্রিং সমতার জন্য তুলনা ব্যবহার করা যাবে if ((Object)a==(Object)b)স্ট্রিং ভোটদান objectএবং তারপর তুলনা করছেন। সুতরাং এটি ==স্ট্রিং ক্লাসে ওভারলোডেড অপারেটরকে কল করবে না ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.