我正在做一些byte []比较.
我试过==但这就像基本的Equals,它:
byte[] a = {1,2,3};
byte[] b = {1,2,3};
bool equals = a == b; //false
equals = a.Equals(b); //false
Run Code Online (Sandbox Code Playgroud)
我试图添加一个扩展方法,但由于重载的基类'Equals采用相同的参数,它转到基本方法而不是扩展,无论如何我可以使用Equals扩展(不要改变它的名字......)或(甚至更好)使用==运算符?
这是我实际要比较的内容:
public static bool ContentEquals(this byte[] array, byte[] bytes)
{
if (array == null || bytes == null) throw new ArgumentNullException();
if( array.Length != bytes.Length) return false;
for (int i = 0; i < array.Length; i++)
if (array[i] != bytes[i]) return false;
return true;
}
Run Code Online (Sandbox Code Playgroud) 一个)
if(null === $object)
{
//take some action
}
Run Code Online (Sandbox Code Playgroud)
b)
if($object === null)
{
//take some action
}
Run Code Online (Sandbox Code Playgroud)
我习惯于像b)那样做,但是在Zend-Framework中,我发现他们所做的每件事都像a).它有什么好处吗?
谢谢.
Ruby语法参考说明了case语句:
比较由运营商完成
===
事实上,例如:
ruby -e 'puts (1..3) === 2'
Run Code Online (Sandbox Code Playgroud)
打印true,但是:
ruby -e 'puts "foo" === /foo/'
Run Code Online (Sandbox Code Playgroud)
打印false,还:
ruby -e 'puts :foo === /foo/'
Run Code Online (Sandbox Code Playgroud)
打印false,但所有这些示例都是case语句的成功条件.它是如何工作的?
我有代码,我得到一个字符串作为输入,我将它与一个整数进行比较.
我看到整数变量也有一个Equals接受字符串参数的函数.
我直接用它来认为它会对它进行类型化.
它没有给出任何编译时或运行时错误,但它总是给出错误的结果.
例如,
int sessionId = 1;
string requestId="1"
return sessionId.Equals(requestId);
Run Code Online (Sandbox Code Playgroud)
sessionId.Equals(requestId) 总是假的.
这种行为的原因是什么?如果有原因,为什么他们允许它运行没有错误?
所以我有一个价值object,(任意说钱),我想为它实现平等.我知道==和.Equals()(参考和数据相等)的预期/默认行为.
在这种情况下,我希望能够比较两个对象,并说它们相当于计算(例如1m和3ft是等效的)但是对于持久性(使用NHibernate,isDirty我认为取决于相等),用户显示和选择货币,我希望它们被认为是不同的.
在这种情况下,我应该
==和.Equals()(以及应该做什么),.IsEquivalent()(我不想做后者)我应该遵循最佳实践/模式吗?谢谢
编辑:我得到了一些关于改变汇率的回应.所以要更新清晰度.让我们说高度,而不是货币
与实施货币相比,我更关注实践和模式.基本上,相同的方法是一个人的身高,其中身高是一个价值对象,({1,m}到{3,ft},其中1m总是"等于"/"相当于"3ft)
我似乎无法弄清楚如何测试一个数字以查看它是否为零。不能有人告诉我我错过了什么。
getMin = Number.class
getMax = Number.class
Run Code Online (Sandbox Code Playgroud)
测试
Number value = mvFacet.getMin() > 0 ? mvFacet.getMin() : mvFacet.getMax();
System.out.println(value.toString());
Run Code Online (Sandbox Code Playgroud) 我遇到了一些问题,我需要使用Java语言比较两个字符串(或任何其他对象)的相等/不相等.String Object上有两种方法对此目的非常有用.compareTo(Object O),返回一个比较的整数结果而另一个equals(Object o)返回一个布尔值.我的问题是,虽然有一个变量compareTo()将特定的String作为输入而不是通用的Object,为什么没有这样的变体equals()?我经常遇到的一个问题是,当我在一个对象上调用equals方法并将通用对象作为参数传递时,它不会抛出任何编译错误.考虑下面的代码片段(这不是一个真实的例子,但我写的只是说明我的观点).
String testStr = new String("1");
Integer testInt = new Integer(1);
testStr.compareTo(testInt.toString()); // compiles
testStr.equals(testInt.toString()); // compiles
testStr.equals(testInt); // compiles and will be always false
testStr.compareTo(testInt); // doesn't compile
Run Code Online (Sandbox Code Playgroud) 在David Flanagan的Javascript指南中,有一个声明:
==运算符永远不会尝试将其操作数转换为布尔值
所以我在这里做了一点测试:
var a = false;
var b = ""; // empty string
a == b; //returns true
Run Code Online (Sandbox Code Playgroud)
看一下抽象等式比较算法有一点:
即 如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true.否则,返回false.
如果y是字符串数据类型(没有转换),x和y如何都是真的?
鉴于这两个功能:
sumOne 0 = 0 -- I.a
sumOne m | m > 0 = sumOne (m-1) + m -- II.a
endSum m = helpSum 0 m -- I.b
where helpSum x 0 = x -- II.b
helpSum x m | m > 0 = helpSum (x+m) (m-1) -- III.b
Run Code Online (Sandbox Code Playgroud)
我们必须通过归纳证明sumOne = endSum.
所以我尝试过:
对于 n=0
sumOne 0=0 == endSum 0 = helpSum 0 0 = 0 True
Run Code Online (Sandbox Code Playgroud)
假设:
sumOne m + k = helpSumm k m
Run Code Online (Sandbox Code Playgroud)
诱导步骤:
-> m=m+1
helpSum …Run Code Online (Sandbox Code Playgroud)