int x = 3; int y = 3; Console.WriteLine(x==3); // True IComparable ic1 = x; IComparable ic2 = y; Console.WriteLine(ic1==ic2); // False because x&y were boxed into ref type
string s1 = "apple"; string s2 = "Apple"; Console.WriteLine(s1==s2); // False
string s1 = "apple"; string s2 = "Apple"; Console.WriteLine(s1.Equals(s2, StringComparison.OrdinalIgnoreCase)); // True
float six = 6.000_000_0f; float nearlySix = 6.000_000_1f; Console.WriteLine(six==nearlySix); // True
float x = 5.05f; float y = 0.95f; float z = x + y; Console.WriteLine(z); // 6 Console.WriteLine(z==6); // False
float x = 5.05f; float y = 0.95f; float z = x + y; Console.WriteLine(z); // 6 Console.WriteLine(z==6); // False
public struct Food
private string _name;
public Food(string name)
{
this._name = name;
}
Food banana = new Food("banana");
Food banana2 = new Food("banana");
Console.WriteLine(banana.Equals(banana2)); // True
public static bool Equals(Object obj1, Object obj2){
if (obj1==obj2)
return true;
if (obj1==null || obj2==null)
return false;
else
return obj1.Equals(obj2);
}
object s1 = "apple"; object s2 = String.Copy((string)s1); Console.WriteLine(s1==s2); // False, because compile types of s1 and s2 is Object
string s1 = "apple"; string s2 = String.Copy(s1); DisplayIfArgsAreEqual(s1,s2);static void DisplayIfArgsAreEqual(T arg1, T arg2) where T:class { Console.WriteLine(arg1==arg2); // False, Object == used }
public struct FoodItem:IEquatable
{
private readonly string _name;
private readonly FoodGroup _group;
public string Name => _name;
public FoodGroup Group => _group;
public FoodItem(string name, FoodGroup group)
{
this._name = name;
this._group = group;
}
public static bool operator ==(FoodItem lhs, FoodItem rhs)
{
return lhs.Equals(rhs);
}
public static bool operator !=(FoodItem lhs, FoodItem rhs)
{
return !lhs.Equals(rhs);
}
public bool Equals(FoodItem other)
{
return _name == other._name && _group == other._group;
}
public override bool Equals(object obj)
{
if (obj is FoodItem foodObj)
return Equals(foodObj);
return false;
}
public override int GetHashCode()
{
return _name.GetHashCode() ^ _group.GetHashCode();
}
public override string ToString()
{
return _name;
}
}
public class Food
{
private readonly string _name;
private readonly FoodGroup _group;
public String Name => _name;
public FoodGroup Group => _group;
public Food(string name, FoodGroup group)
{
_name = name ;
_group = group;
}
public override string ToString()
{
return _name;
}
public static bool operator ==(Food x, Food y)
{
return Object.Equals(x, y);
}
public static bool operator !=(Food x, Food y)
{
return !Object.Equals(x, y);
}
public override bool Equals(object obj)
{
if (obj == null)
return false;
if (ReferenceEquals(obj, this))
return true;
if (obj.GetType() != this.GetType())
return false;
Food rhs = obj as Food;
return this._name == rhs._name && this._group == rhs._group;
}
public override int GetHashCode()
{
return _name.GetHashCode() ^ _group.GetHashCode();
}
}
public sealed class CookedFood:Food
{
private readonly string _cookingMethod;
public string CookingMethod => _cookingMethod;
public CookedFood(string name, FoodGroup group, string cookingMethod) : base(name, group)
{
this._cookingMethod = cookingMethod;
}
public override string ToString()
{
return String.Format("{0} {1}", _cookingMethod, Name);
}
public static bool operator ==(CookedFood x, CookedFood y)
{
return Object.Equals(x, y);
}
public static bool operator !=(CookedFood x, CookedFood y)
{
return !Object.Equals(x, y);
}
public override bool Equals(object obj)
{
if (!base.Equals(obj))
return false;
CookedFood rhs = obj as CookedFood;
return this._cookingMethod == rhs._cookingMethod;
}
public override int GetHashCode()
{
return base.GetHashCode() ^ _cookingMethod.GetHashCode();
}
}
string s1 = "apple"; string s2 = "app"+"le"; // Compiler optimization Console.WriteLine(s1==s2); // True string s3 = "orange"; string s4 = String.Copy(s3); // String.Copy will always copy string without pooling Console.WriteLine(s3==s4); // False