我最近遇到过这种情况,到目前为止,我一直在愉快地重写等于运算符(==)和/或Equals方法,以查看两个引用类型是否实际包含相同的数据(即两个看起来相同的不同实例).
我一直在使用它,因为我已经进行了更多的自动化测试(比较参考/预期数据与返回的数据).
在查看MSDN中的一些编码标准指南时,我遇到了一篇建议反对它的文章.现在我理解为什么文章说这个(因为它们不是同一个实例)但它没有回答这个问题:
非常感谢^ _ ^
看起来我错误地阅读了一些文档(这是漫长的一天)并且压倒Equals可能是要走的路.
如果要实现引用类型,则应考虑在引用类型上覆盖Equals方法(如果类型看起来像基本类型,如Point,String,BigNumber等).大多数引用类型不应重载等于运算符,即使它们重写等于.但是,如果要实现旨在具有值语义的引用类型(例如复数类型),则应覆盖相等运算符.
为什么以下代码打印"Different."?
boolean[][] a = { {false,true}, {true,false} };
boolean[][] b = { {false,true}, {true,false} };
if (Arrays.equals(a, b) || a == b)
System.out.println("Equal.");
else
System.out.println("Different.");
Run Code Online (Sandbox Code Playgroud) 可能重复:
如何比较C#中的日期
我的这个代码:
public static string getLogFileNameForDate(DateTime dt)
{
if (dt.Equals(DateTime.Now))
Run Code Online (Sandbox Code Playgroud)
...即使两个日期相同(日期)也会失败,因为dt在启动时被分配了一个值(例如"6/18/2012 15:19:42"),因此日期不完全相同,甚至虽然年,月和日是相同的(DateTime.Now的值可能是,例如,"6/18/2012 15:30:13").
我知道我可以这样测试它:
if ((dt.Year.Equals(DateTime.Now.Year) && (dt.Month.Equals(DateTime.Now.Month) && (dt.Day.Equals(DateTime.Now.Day))
Run Code Online (Sandbox Code Playgroud)
......但这似乎有点像Jethro*
什么是接受/首选方法(没有双关语意)?
我知道最好equals使用==运算符调用该方法(请参阅此问题).我希望两个字符串比较相等,如果它们都是null或者它们代表相同的字符串.不幸的是,如果字符串是equals,NPE则该方法将抛出null.我的代码目前是:
boolean equals(String s1, String s2) {
if (s1 == null && s2 == null) {
return true;
}
if (s1 == null || s2 == null) {
return false;
}
return s1.equals(s2);
}
Run Code Online (Sandbox Code Playgroud)
这是不优雅的.执行此测试的正确方法是什么?
是否有可能找出两个表达式是否相同?
喜欢以下四个表达式:
Expression<Func<int, bool>> a = x => false;
Expression<Func<int, bool>> b = x => false;
Expression<Func<int, bool>> c = x => true;
Expression<Func<int, bool>> d = x => x == 5;
Run Code Online (Sandbox Code Playgroud)
那么,至少我们可以看到:
a == ba != ca != d但我可以在我的代码中做任何事情来解决这个问题吗?
在msdn库中查看了它
Equals:确定指定的Object是否等于当前Object.(继承自Object.)
我想这意味着至少Expression类没有覆盖equals方法成为Equatable?那你怎么做?或者我在这里要求太多了?:p
第一个例子:
int main(){
using namespace std;
vector<int> v1{10, 20, 30, 40, 50};
vector<int> v2{10, 20, 30, 40, 50};
if(v1==v2)
cout<<"equal";
else
cout<<"unequal";
} // it returns equal
Run Code Online (Sandbox Code Playgroud)
第二个例子:
int main(){
using namespace std;
vector<int> v1{10, 20, 30, 40, 50};
vector<int> v2{10, 20, 100000, 40, 50};
if(v1==v2)
cout<<"equal";
else
cout<<"unequal";
} // it returns notequal
Run Code Online (Sandbox Code Playgroud) x和y是两个变量.
我可以检查它们是否相同x == y,但我如何检查它们是否具有相同的身份?
例:
x = [1, 2, 3]
y = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
现在x == y是True,因为x和y相等,但是x和y不是同一个对象.
我正在寻找像sameObject(x, y)这种情况应该是假的东西.
有人可以向我解释为什么以下代码的输出是说数组不相等?
int main()
{
int iar1[] = {1,2,3,4,5};
int iar2[] = {1,2,3,4,5};
if (iar1 == iar2)
cout << "Arrays are equal.";
else
cout << "Arrays are not equal.";
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在Objective-C中你会做一些事情
- (BOOL)isEqual:(id)other {
if (other == self)
return YES;
if (!other || ![other isKindOfClass:[self class]])
return NO;
return [self.customProperty isEqual:other.customProperty];
}
Run Code Online (Sandbox Code Playgroud)
我在斯威夫特的第一次天真尝试如下
func isEqual(other: AnyObject) -> Boolean {
if self === other {
return true
}
if let otherTyped = other as? MyType {
return self.myProperty == otherTyper.myProperty
}
return false
}
Run Code Online (Sandbox Code Playgroud)
但我对此并不满意.我甚至不知道签名是否正确,或者我们是否应该使用不同的签名isEqual.
有什么想法吗?
编辑:我也想保持Objective-C兼容性(我的类用于遗留的Obj-C代码和新的Swift代码).所以我认为只有压倒==是不够的.我错了吗?
我的确意味着身份平等.
例如,以下内容是否始终打印为真?
System.out.println("foo".getClass() == "fum".getClass());
Run Code Online (Sandbox Code Playgroud)