接下来说说对于引用类型的GetHashCode函数改写。对于第一条来说,在引用类型中有可能重新编写Equals函数,那么类型自带的GetHashCode函数将不能适应这个要求,需要进行重写来适应这种改变。如何简便的改写GetHashCode函数而达到效果呢,这里可以延用前面值类型的做法,即选择一个能唯一标示这个对象的成员来生成HashCode,同时要避免这个成员被修改。
例如一个比较合理的引用类型的GetHashCode函数大致如下(此例引用于原书):
public class Customer
{
private readonly string _name;
private decimal _revenue;
public Customer( string name ): this( name, 0 )
{
}
public Customer( string name, decimal revenue )
{
_name = name;
_revenue = revenue;
}
/// <summary>
/// Name property which only can be accessed in reading mode
/// </summary>
public string Name
{
get{ return _name;}
}
/// <summary>
/// Create a new object with new name
/// </summary>
/// <param name="newName"></param>
/// <returns></returns>
public Customer ChangeName( string newName )
{
return new Customer( newName, _revenue );
}
/// <summary>
/// Customer hash code generated by name
/// </summary>
/// <returns></returns>
public override int GetHashCode()
{
return _name.GetHashCode ();
}
}
对于Customer类型对象来说,它的HashCode是由其_name成员所决定的,所以不能轻易改变,如果通过调用ChangeName方法来替换原先的对象的时候,要首先操作HashTable,先把原先的删除,创建新的之后再保存。具体如下:
Customer c1 = new Customer( "test1" );
object orders = new object();
myHashTable.Add( c1, orders );
//Change name
Customer c2 = c1.ChangeName( "test2" );
object o = myHashTable[ c1 ];
myHashTable.Remove( c1 );
myHashTable.Add( c2, o );
对于如上中Custemer对象来说,只是为了产生在HashTable中所存对象的HashCode,当然在实际应用中,两者需要关联,否则使用HashTable存这些数据就没有任何意义了。
这样对于值类型和引用类型的GetHashCode改写到此基本已经结束了,显然如上的改写,只是为了保证类型的GetHashCode正确,但是对于其的效率并没有得到长足的进步,或者换句话来说,改写后的GetHashCode函数仍然保留HashTable使用效率不高。如何在GetHashCode函数使用比较好的哈希函数,使产生的HashCode具有比较好的分布,我在此不对它进行讨论,因为光这个问题就足够写好几本书的。
对于GetHashCode函数,大致就说到这儿,最后为了加深记忆,总结一下。
首先,在不重写此函数的情况下,这里主要说说使用当中应该注意的。
1. 不建议使用值类型对象的GetHashCode函数返回值来作为HashTable对象的Key;
2. 引用类型是可以使用的,但是要注意如果重写了Equals函数,一定要重写GetHashCode函数来达到一致;
再说说重写此函数时需要注意的。
1. 不管是值类型还是引用类型,要保证产生HashCode的成员不能被修改;
2. 对于产生HashCode的成员修改,要以产生新对象进行处理,同时要在使用端作相应的修改,即先删除旧的在添加新的。
使用类型的GetHashCode有微妙的危险,所以使用的时候要特别注意。
相关推荐
【完美日记社媒营销策略详解】 完美日记,作为国货美妆的新星,以其高性价比的产品和创新的社媒营销策略赢得了年轻消费者特别是95后和00后的喜爱。以下是其成功的关键策略: 1. **内容共创矩阵**:完美日记深谙...
2020年老牌国货的年轻化之路——详析丸美的社媒营销策略
2020年极致爆品的进阶之路——详析珀莱雅的社媒营销策略-微播易-202009.zip
2020年国风爆品的进阶之路——详析花西子的社媒营销策略-微播易-202009.zip
2020年老牌国货的年轻化之路——详析丸美的社媒营销策略-微播易-202009精品报告2020.rar
2020年国风爆品的进阶之路——详析花西子的社媒营销策略-微播易-202009精品报告2020.pdf
这份名为“2020年极致爆品的进阶之路——详析珀莱雅的社媒营销策略”的报告,深入探讨了珀莱雅如何通过社交媒体平台提升品牌影响力,打造爆款产品,并引领行业趋势。 首先,珀莱雅的社媒营销策略注重内容创新。在...
标题中的“2020年低价爆品的进阶之路——详析完美日记的社媒营销策略”揭示了本报告的核心内容,它聚焦于完美日记这个品牌如何在2020年通过社交媒体营销策略,成功打造低价爆款产品,并进一步提升市场地位。...
### 2020年极致爆品的进阶之路——详析珀莱雅的社媒营销策略 #### 品牌背景与转型 珀莱雅作为中国领先的化妆品品牌,最初以日化渠道起家,凭借多品类、多渠道的运营模式,成功拓展至商超、电商等多个领域,构建了...
标题中的“2020年老牌国货的年轻化之路——详析丸美的社媒营销策略”揭示了本文的核心主题,即探讨丸美这一历史悠久的中国本土化妆品品牌如何通过社交媒体营销来吸引年轻消费群体,实现品牌的年轻化转型。...
### 2020年老牌国货的年轻化之路——详析丸美的社媒营销策略 #### 一、丸美品牌概述与核心竞争力 丸美成立于2002年,是一家专注于精致护肤的眼霜品牌,以其独特的眼部护理产品线在市场上占据了显著的位置。通过...
### 2020年低价爆品的进阶之路——详析完美日记的社媒营销策略 #### 一、品牌背景介绍 完美日记成立于2017年,以“Unlimited Beauty”(美不设限)作为品牌理念,凭借着潮流、高性价比的产品以及出色的营销策略,...
### 2020年国风爆品的进阶之路——详析花西子的社媒营销策略 #### 一、品牌背景与定位 - **成立时间与背景**:花西子成立于2017年3月,是一家专注于东方美学与化妆品结合的品牌。 - **品牌理念**:“东方彩妆,以...
报告标题:“2020年低价爆品的进阶之路——详析完美-记的社媒营销策略-微播易-202009精品报告2020” 这份报告聚焦于2020年期间,如何通过有效的社交媒体营销策略,将低价产品转化为市场上的爆款。微播易作为一家...
报告“2020年国风爆品的进阶之路——详析花西子的社媒营销策略”深入探讨了中国本土美妆品牌花西子如何借助社交媒体的力量,成功打造出国风美妆爆款产品,并实现了品牌进阶。以下是该报告中可能包含的关键知识点: ...
丸美年轻化策略的核心在于精准定位目标群体——年轻消费者,他们通常更倾向于在线购物,且活跃于各类社交媒体。丸美充分利用了这一点,将社交媒体作为与消费者沟通、互动的重要渠道。在微博、微信、抖音等平台,丸美...
在2020年的数字化营销领域,珀莱雅作为国内知名的美妆品牌,成功地通过社交媒体营销策略打造出了一系列极致爆品。这份资料详细分析了珀莱雅如何利用社媒平台,结合消费者行为变化,实现了品牌影响力与销售业绩的双重...
在2020年,随着互联网和社交媒体的迅猛发展,老牌国货品牌丸美开始实施年轻化战略,并在社媒营销方面进行了深入的探索和创新。本报告将详细解析丸美在社媒营销策略方面的成功做法和经验。 丸美品牌成立于2002年,...
在当今竞争激烈的美妆市场中,完美日记作为一家成立于2017年的品牌,迅速崛起为国货新势力的代表,其成功的营销策略无疑是其快速成长的关键。完美日记的品牌价值是“Unlimited Beauty”,意味着美的无限可能,它针对...
从提供的文件内容来看,知识点主要涉及完美日记品牌的发展历程、社媒营销策略和市场表现等多个方面。以下将详细解析这些内容。 品牌价值与创立背景: 完美日记(PerfectDiary)成立于2017年,以“Unlimited Beauty...