所以我运行这段代码:
public class whatever
{
public bool checkArray(object[] a, object x)
{
int goThrowArray = 0;
bool res = false;
while (goThrowArray != a.Length)
{
object tempVar = a[goThrowArray];
if (tempVar == x)
{
res = true;
}
goThrowArray++;
}
return res;
}
}
即使 x 等于 a[goThrowArray] 它仍然返回错误... 例子:
whatever checking = new whatever();
object[] s = { 1,2,3,54,62};
Console.Write(checking.checkArray(s,3));
我尝试更改数据类型、调试等。 但无论如何它仍然返回 false.
问题是
object
将整数封装在一个对象中。这个过程称为boxing。对象通过引用相等性进行测试。因此,数组中的对象与您正在测试的对象不同。即使两者包含相同的值。
Equals
方法进行比较,该方法被int覆盖:
if (tempVar.Equals(x)) {
res = true;
}
如果你想混合不同类型的对象,你可以使用 object
数组,比如
int
、
double
和
string
对象。但是,如果您只使用整数,请改用
int[]
。那么你就不会有这个问题了。您甚至可以使您的
方法通用,以便它适用于不同类型的数组:
public bool CheckArray<T>(T[] a, T x)
{
...
}
遍历数组最常见的方法是使用 for 语句。
此外,您可以在找到匹配的条目后立即返回。把这些放在一起:
public bool CheckArray<T>(T[] a, T x)
{
for (int i = 0; i < a.Length; i++) {
if (a[i].Equals(x)) {
return true;
}
}
return false;
}
测试:
whatever checking = new whatever();
object[] a1 = { 1, 2, 3, 54, 62 };
int[] a2 = { 1, 2, 3, 54, 62 };
string[] a3 = { "hello", "world" };
Console.WriteLine(checking.CheckArray(a1, 3));
Console.WriteLine(checking.CheckArray(a2, 3));
Console.WriteLine(checking.CheckArray(a3, "world"));
tempVar
和
x
属于
object
类型,== 运算符解析为
object.ReferenceEquals()
对于盒装值的实例总是返回 false。在您的函数签名中将其更改为
tempVar.Equals(x)
或将
object
更改为
int
。当您知道正确的类型(在本例中为 int)时,您不应该使用 object,这不仅是由于诸如此类的陷阱,而且还出于性能原因。
break
while 循环。您的代码只检查最后一项
public class whatever
{
public bool checkArray(object[] a, object x)
{
int goThrowArray = 0;
bool res = false;
while (goThrowArray != a.Length)
{
object tempVar = a[goThrowArray];
if (tempVar == x)
{
res = true;
break;
}
goThrowArray++;
}
return res;
}
}
object
,你应该使该方法通用,例如
public bool DoesArrayContainItem<T>(T[] a, T x)
{
for (var i = 0; i < a.Length; i++)
{
if (a[i] == x)
{
return true;
}
}
return false;
}
一方面,这将迫使您传递与数组相同类型的项目。使用您拥有的代码,理论上您可以传入一个 int
和一个
DataTable
的数组。做那个检查是没有意义的,这个方法不会让你。它还会将每种类型视为自身,而不是将所有类型视为
object
。这意味着值类型被视为值类型而不是被装箱。