最后一个小问题

.Net技术 码拜 8年前 (2016-02-24) 646次浏览
在C#里本人标红的地方这段代码完全可以省略掉,程序里用了也是多余的,只在某个散列值的第一个位置进行比较,原因是在执行GetHashCode的时候已经验证过了~!只要某个散列值的第一个位置为null,那么完全不必有Equals了,直接就插入键值了,假如某个散列值有内容,只要逐一进行比对能否是同类或Id能否相等,也用不到obj == null啊,就是第一步的时候已经验证过了,某个散列值的第一个位置是null还是不是null已经验证过了,本人说的对吗?不信你们做个实验!他之所以有这个代码 本人估计是受到了C++的指针影响了.C#里只有两样比对能否同类和Id值能否相等,null不null VS搞定了~!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace delete
{
class a
{
public int Id { get; private set; }//这里Id最好不要用一样的值 原因是这是唯一的标识
public a(int i)
{
Id = i;
}
public override bool Equals(object obj)
{
Console.WriteLine(“Equals”);
if (obj == null || GetType() != obj.GetType())//就这里可以省略对吗?
{
return false;
}
return Id == ((a)obj).Id;
}
//返回余2的结果
public override int GetHashCode()
{
Console.WriteLine(“GetHashCode”);
return Id % 2;
}
}
class Program
{
static void Main(string[] args)
{
var o1 = new a(1); //GetHashCode返回1
var o2 = new a(2); //GetHashCode返回0
var o3 = new a(3); //GetHashCode返回1
var dic = new Dictionary<a, object>();
dic.Add(o1, 123);
dic.Add(o3, 123);
Console.WriteLine(“分隔符”);
Console.WriteLine(o1.GetHashCode());
Console.WriteLine(“分隔符”);
Console.WriteLine(o3.GetHashCode());
Console.WriteLine();
foreach (var s in dic)
Console.WriteLine(s);
Console.WriteLine(dic[o3]);
}
}
}
解决方案

22

对于 Dictionary 而言 不会出现
原因是 Dictionary 有检查,不允许 键 为空!

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明最后一个小问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)