C#= এবং সমান() এর মধ্যে পার্থক্য



.net equals (16)

@ ব্লুমোনকেএমএন এর পূর্বের উত্তরটির আরেকটি মাত্রা রয়েছে। অতিরিক্ত মাত্রাটি হল @ ডাহকিরের শিরোনাম প্রশ্নটির উত্তর যেমনটি বর্ণিত হয়েছে তেমনই আমরা string মানতে পৌঁছানোর উপর নির্ভর করে। বর্ণনা করা:

string s1 = "test";
string s2 = "test";
string s3 = "test1".Substring(0, 4);
object s4 = s3;
string s5 = "te" + "st";
object s6 = s5;
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s2), s1 == s2, s1.Equals(s2));

Console.WriteLine("\n  Case1 - A method changes the value:");
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s3), s1 == s3, s1.Equals(s3));
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s4), s1 == s4, s1.Equals(s4));

Console.WriteLine("\n  Case2 - Having only literals allows to arrive at a literal:");
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s5), s1 == s5, s1.Equals(s5));
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s6), s1 == s6, s1.Equals(s6));

আউটপুট হয়:

True True True

  Case1 - A method changes the value:
False True True
False False True

  Case2 - Having only literals allows to arrive at a literal:
True True True
True True True

https://src-bin.com

আমার কাছে র্যান্ডলাইট অ্যাপ্লিকেশনের একটি শর্ত আছে যা 2 স্ট্রিংগুলিকে তুলনা করে, আমি .Equals() কারণে == ব্যবহার করে যখন এটি মিথ্যা হয় .Equals() সত্য ফেরত দেয়।

এখানে কোডটি রয়েছে:

if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
    // Execute code
}

if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
    // Execute code
}

যে কোন কারণে এই ঘটছে কেন?


Answer #1

আমি এখানে একটু বিভ্রান্ত। রানটাইম টাইপের বিষয়বস্তু টাইপ স্ট্রিংয়ের মধ্যে থাকে, তাহলে == এবং সমান উভয়ই সত্য ফিরে আসবে। যাইহোক, এই ক্ষেত্রে দেখা যাচ্ছে না, তখন রানটাইম টাইপের সামগ্রীটি স্ট্রিং নয় এবং এটিতে সমান কলিং একটি রেফারেন্সাল সমতা রয়েছে এবং এটি ব্যাখ্যা করে কেন সমান ("শক্তি আক্রমণ") ব্যর্থ হয়। যাইহোক, দ্বিতীয় ক্ষেত্রে, যে সিদ্ধান্তটি ওভারলোড করা হয়েছে == স্ট্যাটিক অপারেটরটিকে কম্পাইল সময় বলা উচিত এবং এই সিদ্ধান্তটি == (স্ট্রিং, স্ট্রিং) বলে মনে হয়। এই বিষয়বস্তু যে স্ট্রিং একটি অন্তর্নিহিত রূপান্তর উপলব্ধ করা হয়।


Answer #2

আমি যোগ করব যে আপনি যদি আপনার বস্তুটিকে একটি স্ট্রিংটিতে নিক্ষেপ করেন তবে এটি সঠিকভাবে কাজ করবে। এইজন্য কম্পাইলার আপনাকে একটি সতর্কবাণী দেবে:

সম্ভাব্য অপ্রচলিত রেফারেন্স তুলনা; একটি মান তুলনা পেতে, 'স্ট্রিং টাইপ' বাম দিকে দিকে নিক্ষেপ


Answer #3

উত্তর আরো একটি বিন্দু যোগ করা হচ্ছে।

.EqualsTo() পদ্ধতি সংস্কৃতি এবং কেস সংবেদনশীল বিরুদ্ধে তুলনা করার জন্য আপনি বিধান দেয়।


Answer #4

একটি স্ট্রিংয়ের বস্তুর রেফারেন্সের তুলনা করার সময় (বস্তুর রেফারেন্সটি একটি স্ট্রিংকে বোঝায় তবে), == স্ট্রিং ক্লাসের নির্দিষ্ট অপারেটরের বিশেষ আচরণ উপেক্ষা করা হয়।

সাধারণভাবে (যখন স্ট্রিংগুলির সাথে ডিল করা হয় না), Equals মূল্যের তুলনা করে, যখন == বস্তুর উল্লেখগুলি তুলনা করে। যদি আপনি দুটি বস্তু তুলনা করছেন যা একটি বস্তুর একই সঠিক দৃষ্টান্তের কথা উল্লেখ করে তবে উভয়ই সত্য ফিরে আসবে, তবে যদি একই বিষয়বস্তু থাকে এবং একটি পৃথক উত্স থেকে আসে (একই তথ্য সহ একটি পৃথক উদাহরণ) তবে কেবল সমান হবে সত্য ফিরে। যাইহোক, মন্তব্যগুলিতে উল্লিখিত হিসাবে, স্ট্রিং একটি বিশেষ কেস কারণ এটি == অপারেটরকে ওভাররাইড করে যাতে স্ট্রিং রেফারেন্সগুলি (এবং বস্তু রেফারেন্সগুলি না) সাথে সম্পূর্ণভাবে আচরণ করলে, কেবলমাত্র ভিন্ন উদাহরণ থাকলেও মানগুলি তুলনা করা হয়। নিম্নলিখিত কোড আচরণ মধ্যে সূক্ষ্ম পার্থক্য illustrates:

string s1 = "test";
string s2 = "test";
string s3 = "test1".Substring(0, 4);
object s4 = s3;
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s2), s1 == s2, s1.Equals(s2));
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s3), s1 == s3, s1.Equals(s3));
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s4), s1 == s4, s1.Equals(s4));

আউটপুট হয়:

True True True
False True True
False False True

Answer #5

কারণ .Equal পদ্ধতির স্ট্যাটিক ভার্সনটি এতদূর উল্লেখ করা হয়নি, আমি এখানে সংক্ষেপে এবং 3 বৈচিত্রের তুলনা করতে এটি যোগ করতে চাই।

MyString.Equals("Somestring"))          //Method 1
MyString == "Somestring"                //Method 2
String.Equals("Somestring", MyString);  //Method 3 (static String.Equals method) - better

যেখানে MyString একটি পরিবর্তনশীল যে কোড অন্য কোথাও থেকে আসে।

পটভূমি তথ্য এবং গ্রীষ্মকালীন:

== ব্যবহার করে জাভাতে স্ট্রিং তুলনা করা উচিত নয়। যদি আপনি উভয় ভাষা ব্যবহার করতে চান এবং আপনাকে জানার জন্য আমি এটি উল্লেখ করি যে == ব্যবহার করে এছাড়াও C # এ আরও ভাল কিছু দিয়ে প্রতিস্থাপিত করা যেতে পারে।

সি # তে মেথড 1 বা পদ্ধতি 2 ব্যবহার করে স্ট্রিংগুলির তুলনা করার জন্য কোনও পার্থক্য নেই। যাইহোক, যদি নাল থাকে, তবে অন্যটি অন্য ধরণের (পূর্ণসংখ্যা মত), বা অন্য কোনও বস্তুর প্রতিনিধিত্ব করে, যার একটি প্রাথমিক রেফারেন্স থাকে, তারপরে, প্রাথমিক প্রশ্নটি দেখায়, আপনি অনুভব করতে পারেন যে সমানতার জন্য সামগ্রী তুলনা করলে তা ফেরত দিতে পারে না তুমি আশা কর.

প্রস্তাবিত সমাধান:

কারণ == ব্যবহার করা ঠিক একই রকম নয়। জিনিসগুলির তুলনা করার সময় আপনি যখন স্ট্যাটিক String.Equals পদ্ধতি ব্যবহার করতে পারেন। এইভাবে, যদি উভয় পক্ষ একই ধরণের না হয় তবে আপনি এখনও সামগ্রী তুলনা করবেন এবং যদি নাল থাকে তবে আপনি ব্যতিক্রমটি এড়াতে পারবেন।

   bool areEqual = String.Equals("Somestring", MyString);  

এটি লিখতে একটু বেশি, কিন্তু আমার মতে, নিরাপদ ব্যবহার করা।

এখানে মাইক্রোসফ্ট থেকে অনুলিপি করা কিছু তথ্য রয়েছে:

public static bool Equals (string a, string b);

পরামিতি

a স্ট্রিং

তুলনা প্রথম স্ট্রিং, বা null

b স্ট্রিং

দ্বিতীয় স্ট্রিং তুলনা, বা null

Boolean

true যদি a মান b এর মান হিসাবে একই হয়; অন্যথায়, false । যদি a এবং b উভয় null , পদ্ধতি true ফিরে।


Answer #6

প্রথমত, একটি পার্থক্য আছে। সংখ্যা জন্য

> 2 == 2.0
True

> 2.Equals(2.0)
False

এবং স্ট্রিং জন্য

> string x = null;
> x == null
True

> x.Equals(null)
NullReferenceException

উভয় ক্ষেত্রে, == চেয়ে আরও কার্যকরভাবে আচরণ করে


Answer #7

যখন == টাইপ object একটি অভিব্যক্তি ব্যবহার করা হয়, এটি System.Object.ReferenceEquals সমাধান System.Object.ReferenceEquals

Equals একটি virtual পদ্ধতি এবং যেমন আচরণ করে, তাই বর্ধিত সংস্করণ ব্যবহার করা হবে (যা string টাইপ সামগ্রী তুলনা করে)।


Answer #8

যখন আমরা কোন বস্তু তৈরি করি তখন বস্তুর দুটি অংশ বিষয়বস্তু এবং অন্যটি সেই সামগ্রীটির রেফারেন্স। == উভয় বিষয়বস্তু এবং রেফারেন্স তুলনা করে; equals() শুধুমাত্র কন্টেন্ট তুলনা করে

http://www.codeproject.com/Articles/584128/What-is-the-difference-between-equalsequals-and-Eq


Answer #9

যতদূর আমি এটা বুঝি উত্তরটি সহজ:

  1. == বস্তুর রেফারেন্স তুলনা।
  2. । বস্তু বস্তুর বিষয়বস্তু তুলনা করে।
  3. স্ট্রিং datatypes সবসময় কন্টেন্ট তুলনা মত কাজ।

আমি আশা করি আমি সঠিক এবং এটি আপনার প্রশ্নের উত্তর।


Answer #10

সত্যিই মহান উত্তর এবং উদাহরণ!

আমি শুধু দুটি মধ্যে মৌলিক পার্থক্য যোগ করতে চাই,

Equals

মনে রাখবেন যে, যদি আপনি কোন উদাহরণটি ব্যবহার করেন (বাম দিক এবং ডান দিকের রেফারেন্স টাইপটি দেখতে এবং চেক / বুদ্ধিমান / টাইপ করুন যদি আসলেই == অপারেটর ওভারলোড করা হয় এবং সমান ওভারডেন হয়) আপনি সঠিক উত্তর পেতে নিশ্চিত ।


Answer #11

সমান এবং == মধ্যে শুধুমাত্র পার্থক্য বস্তুর টাইপ তুলনা উপর। অন্য ক্ষেত্রে, যেমন রেফারেন্স প্রকার এবং মান প্রকারগুলি প্রায় একই হয় (উভয়ই বিট-বুদ্ধিমান সমতা বা উভয়ই রেফারেন্স সমতা)।

বস্তু: সমান: বিট-বুদ্ধি সমতা ==: রেফারেন্স সমতা

স্ট্রিং: (সমান এবং == স্ট্রিংয়ের জন্য একই, কিন্তু যদি স্ট্রিংয়ের মধ্যে একটি বস্তুটি পরিবর্তিত হয় তবে তুলনা ফলাফলটি আলাদা হবে) সমান: বিট-বুদ্ধিমান সমতা ==: বিট-বুদ্ধিমান সমতা

আরো ব্যাখ্যা জন্য here দেখুন।


Answer #12

== এবং। .Equals প্রকৃতপক্ষে এবং প্রকৃতপক্ষে কল সাইটের প্রকৃত টাইপে বর্ণিত আচরণের উপর নির্ভরশীল। উভয়ই কেবলমাত্র পদ্ধতি / অপারেটর যা কোনও প্রকারের উপর ওভাররাইড করা যেতে পারে এবং লেখক যেভাবে ইচ্ছা প্রকাশ করেন। আমার অভিজ্ঞতায়, আমি এটি বাস্তবায়নের জন্য সাধারণ বলে মনে .Equals । কোনও বস্তুর উপর .Equals অপারেটর বাস্তবায়ন করতে অবহেলা == । এর মানে হল .Equals প্রকৃতপক্ষে মানগুলির সমতাটি পরিমাপ করবে যখন == এটি একই রেফারেন্স কিনা তা পরিমাপ করবে।

যখন আমি একটি নতুন প্রকারের সাথে কাজ করছি যার সংজ্ঞা ফ্লুক্সে বা জেনেরিক অ্যালগরিদম লেখা হয়, তখন আমি সেরা অনুশীলন অনুসরণ করি

  • যদি আমি C # এ রেফারেন্স তুলনা করতে চাই, আমি সরাসরি Object.ReferenceEquals ব্যবহার Object.ReferenceEquals (জেনেরিক ক্ষেত্রে প্রয়োজন হয় না)
  • আমি মান তুলনা করতে চান তাহলে আমি EqualityComparer<T>.Default ব্যবহার

কিছু ক্ষেত্রে যখন আমি মনে করি == এর ব্যবহার অনিশ্চিত, আমি স্পষ্টভাবে Object.Reference ব্যবহার করব। Object.Reference অস্পষ্টতা দূর করতে Object.Reference সমান।

এআরআইসি লিপার্ট সম্প্রতি সিএলআর-তে সমানতার দুটি পদ্ধতি কেন এই বিষয়ে একটি ব্লগ পোস্ট করেছেন। এটা পড়ার মূল্য


Answer #13

== টোকেন ইন সি # দুটি ভিন্ন সমতা-চেক অপারেটরগুলির জন্য ব্যবহৃত হয়। যখন কম্পাইলারটি টোকেনটির সাথে সংঘটিত হয়, তখন এটি পরীক্ষা করবে যে কোন ধরনের তুলনা করা হচ্ছে কিনা তা নির্দিষ্ট সমাহার ধরনের (*), বা উভয় ধরনের রূপান্তর করা যেতে পারে এমন ধরণের সমন্বয়ের জন্য সমানতা-অপারেটর ওভারলোড প্রয়োগ করেছে। যদি কম্পাইলার যেমন একটি ওভারলোড খুঁজে পায় এটি ব্যবহার করবে। অন্যথায়, যদি দুটি প্রকার উভয় রেফারেন্স প্রকারের হয় এবং তারা সম্পর্কিত নয় (তবে এটি একটি ইন্টারফেস হতে পারে, অথবা তারা সম্পর্কিত ক্লাস হতে পারে), কম্পাইলার == একটি রেফারেন্স-তুলনা অপারেটর হিসাবে == কে বিবেচনা করবে। যদি শর্তটি প্রযোজ্য না হয় তবে সংকলন ব্যর্থ হবে।

উল্লেখ্য যে কিছু অন্যান্য ভাষা দুটি সমতা-চেক অপারেটরগুলির জন্য পৃথক টোকেন ব্যবহার করে। VB.NET তে, উদাহরণস্বরূপ, = টোকেনটি কেবলমাত্র ওভারলোডযোগ্য সমতা-চেক অপারেটরের জন্য এক্সপ্রেশনগুলির মধ্যে ব্যবহৃত হয় এবং এটি একটি রেফারেন্স-টেস্ট বা নল-টেস্ট অপারেটর হিসাবে ব্যবহৃত হয়। ব্যবহার করার জন্য = এমন একটি টাইপ যা সমতা-চেক অপারেটর ওভাররাইড না করে ব্যর্থ হবে, যেহেতু রেফারেন্স সমতা বা নুন্যতা পরীক্ষার ব্যতীত অন্য কোনও উদ্দেশ্যে Is ব্যবহার করার চেষ্টা করবে।

(*) প্রকারগুলি সাধারণত নিজেদের সাথে তুলনা করার জন্য সমতাটি কেবলমাত্র ওভারলোড করে, তবে অন্যান্য বিশেষ ধরণের তুলনা করার জন্য সমতা অপারেটর ওভারলোড লোড করার জন্য এটি উপকারী হতে পারে; উদাহরণস্বরূপ, int থাকতে পারে (এবং IMHO থাকা উচিত কিন্তু তা না) float সাথে তুলনা করার জন্য একটি সমতা অপারেটরকে সংজ্ঞায়িত করেছে, যাতে 16777২217 নিজেকে 16777216f এর সমান প্রতিবেদন করবে না। যেহেতু এটি কোনও অপারেটরকে সংজ্ঞায়িত না করে, সি # সমতা-চেক অপারেটরটি এটি দেখে আগে 16777216f এ এটির ভেতরের ভেতর float int কে উন্নীত করবে; সেই অপারেটরটি তখন দুটি সমান ভাসমান-বিন্দু সংখ্যা দেখে এবং তাদের সমান হিসাবে প্রতিবেদন করে, যা ঘটেছে এমন রাউন্ডিং সম্পর্কে অবগত।


Answer #14

==

== অপারেটরটি কোনও ধরণের দুটি ভেরিয়েবল তুলনা করতে ব্যবহার করা যেতে পারে এবং এটি কেবল বিটগুলির সাথে তুলনা করে

int a = 3;
byte b = 3;
if (a == b) { // true }

দ্রষ্টব্য: int এর বাম পাশে আরো শূন্য আছে কিন্তু আমরা এখানে সে বিষয়ে উদ্বিগ্ন নই।

int a (00000011) == বাইট বি (00000011)

মনে রাখবেন == অপারেটর শুধুমাত্র পরিবর্তনশীল বিট প্যাটার্ন সম্পর্কে যত্ন করে।

ব্যবহার করুন == যদি দুটি রেফারেন্স (primitives) হিপ উপর একই বস্তুর বোঝায়।

ভেরিয়েবল একটি রেফারেন্স বা আদিম হয় কিনা একই নিয়ম।

Foo a = new Foo();
Foo b = new Foo();
Foo c = a;

if (a == b) { // false }
if (a == c) { // true }
if (b == c) { // false }

একটি == গ সত্য একটি == বি মিথ্যা

বিট প্যাটার্ন একটি এবং c এর জন্য একই, তাই তারা == ব্যবহার করে সমান।

সমান():

দুটি ভিন্ন বস্তু সমান কিনা তা দেখতে সমান () পদ্ধতিটি ব্যবহার করুন।

যেমন দুটি ভিন্ন স্ট্রিং বস্তু যা উভয় অক্ষরকে "জেন"


Answer #15

== অপারেটর 1. যদি অপারেন্ডগুলি মান প্রকার এবং তাদের মানগুলি সমান হয় তবে এটি সত্যই মিথ্যা বলে। 2. অপারেশন স্ট্রিং ব্যতিক্রম সঙ্গে রেফারেন্স প্রকার এবং উভয় একই বস্তু পড়ুন, এটা সত্য অন্য মিথ্যা ফেরৎ। 3. অপারেশন স্ট্রিং টাইপ এবং তাদের মান সমান হলে, এটি সত্য সত্য মিথ্যা ফেরত।

.অনুসন্ধান 1. যদি পরিচালনাগুলি রেফারেন্সের ধরন হয় তবে এটি রেফারেন্স সমতাটি সম্পাদন করে যা উভয়ই একই বস্তুর উল্লেখ করে তবে এটি সত্যই মিথ্যা বলে। 2. যদি অপারেন্ডগুলি মান প্রকারের হয় তবে == অপারেটরের বিপরীতে এটি তাদের টাইপের জন্য প্রথম চেক করে এবং যদি তাদের ধরন একই থাকে তবে এটি == অপারেটর সঞ্চালন করে তবে এটি মিথ্যা দেয়।





equals