null和""(空字符串)有什么区别?
我写了一些简单的代码:
String a = "";
String b = null;
System.out.println(a == b); // false
System.out.println(a.equals(b)); // false
Run Code Online (Sandbox Code Playgroud)
这两个语句返回false.看来,我无法找到它们之间的实际区别.
是否有使用的默认IEqualityComparer<T>实现ReferenceEquals?
EqualityComparer<T>.Default使用ObjectComparer,它使用object.Equals().在我的例子中,对象已经实现IEquatable<T>,我需要忽略并仅通过对象的引用进行比较.
当我看到equals()方法的实现时,它什么也没做,只是做了什么==.所以我的问题是,当我们有==运营商做同样的工作时,需要将它作为单独的方法吗?
我有一个关于Object.Equals和的问题Equals(object).我的示例代码如下:
class Program
{
static void Main(string[] args)
{
var sb1 = new StringBuilder("Food");
var sb2 = new StringBuilder("Food");
Console.WriteLine(sb1 == sb2);
Console.WriteLine(sb1.Equals(sb2));
Console.WriteLine(Object.Equals(sb1, sb2));
Console.WriteLine(Object.ReferenceEquals(sb1, sb2));
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
False
True
False
False
Run Code Online (Sandbox Code Playgroud)
但就我Object.Equals(sb1, sb2)内心的 问题而言sb1.Equals(sb2),为什么会给出两个不同的结果?
有人可以解释一下这个重载是什么意思吗?
public static bool operator ==(Shop lhs, Shop rhs)
{
if (Object.ReferenceEquals(lhs, null))
{
if (Object.ReferenceEquals(rhs, null))
{
return true;
}
return false;
}
return lhs.Equals(rhs);
}
Run Code Online (Sandbox Code Playgroud)
我从未在重载中看到过Object.ReferenceEquals
我需要一个Map实现共享两者的属性IdentityHashMap和WeakHashMap(引用相等而不是equals()键上的弱引用).
你推荐什么实现(它必须在Android上工作)?
在IsVB.NET关键字一样Object.ReferenceEquals?
为什么在这种情况ReferenceEquals下对象的方法表现不同?
string a= "fg";
string b= "fg";
Console.WriteLine(object.ReferenceEquals(a, b));
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下,它会得到一个结果true.如果是,它会比较我的字符串的值而不是引用.但是当我写下这样的话:
StringBuilder c = new StringBuilder("fg");
string d = c.ToString();
Console.WriteLine(object.ReferenceEquals(a, d));
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它工作正常,结果是false,因为它比较我的对象的引用.
我正在尝试派生一个描述结构化值的Graphviz文件.这是出于诊断目的,所以我希望我的图形尽可能地镜像内存中的实际结构.我正在使用下面的值将值映射到Graphviz顶点,这样当值有两个或多个入站引用时我可以重用一个顶点:
let same = (==)
module StateIdentity : Hashtbl.HashedType = struct
type t = R.meta_t state
let hash = Hashtbl.hash
let equal = same
end
module StateHashtbl = Hashtbl.Make (StateIdentity)
Run Code Online (Sandbox Code Playgroud)
文档Hashtbl.hash建议它适合在何时何地使用StateIdentity.equal = (=),StateIdentity.equal = (==)但我想确保哈希表访问尽可能接近O(1),所以宁愿不要Hashtbl.hash走路(在这种情况下可能很大)对象每次查找都有图表.
我知道Ocaml会移动引用,但Ocaml中是否有O(1)代理参考标识?
Ocaml中可变变量Hashtable的答案表明没有.
我不喜欢将序列号附加到状态,因为这是诊断代码所以我做的任何错误都有可能掩盖其他错误.
似乎.NET不愿意通过引用使值相等的字符串.
在LINQPad中,我尝试了以下内容,希望它绕过内部字符串常量:
var s1 = new string("".ToCharArray());
var s2 = new string("".ToCharArray());
object.ReferenceEquals(s1, s2).Dump();
Run Code Online (Sandbox Code Playgroud)
但那又回来了true.但是,我想创建一个string可以与任何其他string对象可靠区分的东西.
(用例是创建一个用于可选参数的标记值.我正在包装WebForms' Page.Validate(),我想根据调用者是否给我提供可选的验证组参数来选择适当的重载.所以我希望能够检测调用者是否省略了该参数,或者他是否传递了一个恰好等于我的默认值的值.显然,还有其他不那么神秘的方法来处理这个特定的用例,这个问题的目的更具有学术性.),