[英]C# Comparing a reference and a value
將值傳遞給此方法時,我遇到了麻煩。
注意:使用此 function 的系統在我看來是一個黑盒子,因此無法更改。
問題是,將相同的值(如字符串、布爾值、對象等)傳遞給方法會說它們不相等,即使值相同。 我認為這是因為一個是參考,而另一個是值,因此它們“不同”。
protected void SetData<T>(ref T field, T value)
{
if (!EqualityComparer<T>.Default.Equals(field, value))
{
Console.WriteLine("They are NOT equal");
}
else
{
Console.WriteLine("They are equal");
}
}
為了測試這個假設,我做了一些不同的單元測試。
public bool AreEqual<T>(ref T field, T value)
{
return EqualityComparer<T>.Default.Equals(field, value);
}
[TestMethod]
public void IsDirtyString()
{
var tc = new Program();
var field = "Germany";
var value = "United States";
var result = tc.AreEqual(ref field, value);
Assert.IsFalse(result);
}
[TestMethod]
public void IsNotDirtyString()
{
var tc = new Program();
var field = "Nepal";
var value = "Nepal";
var result = tc.AreEqual(ref field, value);
Assert.IsTrue(result);
}
[TestMethod]
public void IsDirtyDouble()
{
var tc = new Program();
var field = 11.2;
var value = 12.3;
var result = tc.AreEqual(ref field, value);
Assert.IsFalse(result);
}
[TestMethod]
public void IsNotDirtyDouble()
{
var tc = new Program();
var field = 12.3;
var value = 12.3;
var result = tc.AreEqual(ref field, value);
Assert.IsTrue(result);
}
[TestMethod]
public void IsDirtyInt()
{
var tc = new Program();
var field = 12;
var value = 15;
var result = tc.AreEqual(ref field, value);
Assert.IsFalse(result);
}
[TestMethod]
public void IsNotDirtyInt()
{
var tc = new Program();
var field = 12;
var value = 12;
var result = tc.AreEqual(ref field, value);
Assert.IsTrue(result);
}
[TestMethod]
public void IsDirtyBool()
{
var tc = new Program();
var field = true;
var value = false;
var result = tc.AreEqual(ref field, value);
Assert.IsFalse(result);
}
[TestMethod]
public void IsNotDirtyBool()
{
var tc = new Program();
var field = true;
var value = true;
var result = tc.AreEqual(ref field, value);
Assert.IsTrue(result);
}
結果是單元測試都通過了......“預期”
因此,當我測試時,它按預期工作,但是當我連接到系統的 rest 並進行調試時,我可以看到“字段”和“值”的值,但它沒有。
有沒有人嘗試過這樣的事情?
您缺少平等比較器。
正如您在此示例中看到的那樣,即使等於,output 也會為假:
class Program
{
static void Main(string[] args)
{
Pizza pizza1 = new Pizza(1);
Pizza pizza2 = new Pizza(1);
bool equal = AreEqual(pizza1, pizza2);
Console.WriteLine(equal);
}
public static bool AreEqual<T>(T field, T value)
{
return EqualityComparer<T>.Default.Equals(field, value);
}
}
public class Pizza
{
public Pizza(int slices)
{
Slices = slices;
}
public int Slices { get; set; }
}
Output:
錯誤的
這樣它甚至可以使用自定義對象:
class Program
{
static void Main(string[] args)
{
Pizza pizza1 = new Pizza(1);
Pizza pizza2 = new Pizza(1);
bool equal = AreEqual(pizza1, pizza2, new PizzaComparer());
Console.WriteLine(equal);
}
public static bool AreEqual<T>(T field, T value, IEqualityComparer<T> equalityComparer)
{
return equalityComparer.Equals(field, value);
}
}
public class Pizza
{
public Pizza(int slices)
{
Slices = slices;
}
public int Slices { get; set; }
}
public class PizzaComparer : IEqualityComparer<Pizza>
{
public bool Equals(Pizza pizza1, Pizza pizza2)
{
return pizza1.Slices == pizza2.Slices;
}
public int GetHashCode(Pizza pizza)
{
return pizza.Slices.GetHashCode();
}
}
Output:
真的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.