常用类
Object类
所有类的基类,为所有类提供了通用的低级别服务。别名:object
static Equals(object obj1, object obj2) static ReferenceEquals(obj1, obj2) Equals(object conpareObj) GetType() string s = ""; s.GetType()==typeof(string) ToString() protected MemberwiseClone() Object的可重写的虚成员方法
ToString()
类型的ToString()方法默认返回类型的完全限定名的字符表示,如果想让类的ToString()方法返回更有意义的文本,可考虑重写此方法。
Equals()
默认值类型比较值的等同性,引用类型比较地址的等同性。如果有特殊需求,可考虑重写此方法,如果确实要重写它,那么同时必须要重写GetHashCode()方法。
GetHashCode()
为什么重写Equals()方法时必须重写GetHashCode()方法?
哈希值可以用来标识一个对象的唯一性,但不是说哈希值不会重复,只是说可以利用哈希值标识对象,也即哈希值本身是容易重复的。两个引用相同或值相同的对象,它们的哈希值绝对相等,但两个不同的对象的哈希值也有可能是相等的。对于单个对象,重写哈希值没有任何实际的意义,比如当对象调用Equals()方法时并不会进入GetHashCode()方法而是直接用Equals()方法进行相等性测试。
但泛型字典会调用集合中的Key的GetHashCode()方法,所以要考虑到某个对象可能会存储在泛型字典集合中(哈希表),这样,哈希值就能发挥它的威力,哈希值可以提升查找的效率,比如泛型字典集合就是使用哈希值来表示字典的key,查找项时其速度可以得到很大的提升。Dictionary<TKey,TValue>是用key来作为记录的键,key必须具有唯一性,否则运行时将抛出异常。字典会调用key的GetHashCode(),将返回的哈希值当做一条记录的唯一标识以便能根据这个标识找到对应的记录。
Dictionary<string, object> dictionary = new Dictionary<string, object> { { "1","sam" }, { "2","sam" } }; 为什么不直接查询key,而是非要用key的哈希值作为查找的手段?因为哈希值的查询效率较高。在默认情况下,当向字典添加一个键值对时,它会调用该键值对的key的GetHashCode(),然后查找哈希表中是否有另一个key也具有相同的哈希值,如果没有,就将该键值对添加到哈希表中,如果已经有一个键值对的key和刚才试图添加的键值对的key具有相同的哈希值,那么根据不同对象也可能具有相同的哈希值,Dictionary<TKey,TValue>就会进一步判断key的相等性。
public class Animal { public string Name { get; set; } public override bool Equals(object animal) { if(((Animal)animal).Name==this.Name) { return true; } return false; } } class Program { static void Main(string[] args) { Animal animal = new Animal { Name = "sam" }; Animal animal2 = new Animal { Name = "leo" }; Dictionary<Animal, int> list = new Dictionary<Animal, int> { { animal,1}, { animal,2 } }; } } Dictionary<TKey,TValue>会自动调用key的Equals方法对集合中的key进行比较判断,Equals()方法默认比较的是:如果两个操作数是值类型,那么测试值是否相等,如果是引用类型则测试它们指向的堆上的地址是否相等,从而返回一个布尔值让泛型字典确定新添加的key是否在集合中已经有了一个相同的key。也即字典先调用对象的GetHashCode,如果该对象的HashCode已经存在,再退而求其次调用Key的Equals方法去比较对象的等同性。
所以如果你需要重写Equals()方法,那么必须重写GetHashCode()方法,这是为了满足Dictionary<TKey,TValue>字典集合对HashCode的要求。毕竟GetHashCode的查找效率很高。如果不重写GetHashCode(),编译器会提示警告。但假如写不出高质量的GetHashCode(),那就随便return一个低劣的hashcode好了,这样,在泛型字典集合中,当试图添加一个在字典中已经存在的哈希值所对应的key时就会发生冲突,然后泛型字典集合会进入key的Equals()方法进行判断以便确认两个key究竟是否相等,如果相等,则编译器会提示你禁止添加相同的Key。
通常,我们向泛型字典添加的key的类型都是int或string类型,一般情况都不会将自定义类型(比如自定义的Animal类)作为key来使用。所以,假设现在我们想重写Animal的Equals方法,那么在我们根本不需要将Animal作为泛型字典的key的同时却又必须重写GetHashCode方法,这也太坑爹了,解决方法是让Animal类实现IEquatable<T>接口。参看:
1.==和!=操作符
![](https://images2018.cnblogs.com/blog/406079/201803/406079-20180304125234319-502438129.png)
2.Equals()方法
Object提供了virtual的Equals()实例方法,你可以重写这个比较的规则。
![](https://images2018.cnblogs.com/blog/406079/201803/406079-20180304125449749-1967009787.png)
3.Object.Equals(object x,object y)静态方法
假设x调用实例Equals方法,而x如果是一个null,这会引发异常,为了解决这个问题,才引入了静态的Equals方法,此方法是对Equals实例方法的封装,在不明确x是否为null的情况下,可以使用object.Equals(x,y),该静态方法将测试x和y是否同时为null,如果是则返回true,否则如果x为null,则返回false,否则将调用x.Equals(y)进行相等性判断。
4.Object.ReferenceEquals(object x,object y)静态方法
此方法判断对堆上地址的引用的等同性,可能很多时候你用不上这个方法,但,假设你重写了Equals()方法,比如将Equals()方法重写为只要两个对象的某个属性值是相等的就返回true。这样一来,假设下一次你还想测试引用地址的等同性,Equals就做不到了,而且直接调用静态的object.Equals()方法,该方法也会调用被重写的实例的Equals(),所以才有了一个ReferenceEquals这样的后备军。
String类
封装一系列不可改变的字符,实例一旦创建就会固着在内存中直到被回收。别名:string
static Compare(strA, strB) static Concat(IEnumerable<string> strValue) string[] y = { "bb", "cc" }; string r = string.Concat(y); static Join(string Operator, IEnumerable<string> strValue) new string( char,count ) string s = new string( 'a', 100 ); new string( charArray ) char[] charArray = { 'a', 'b', 'c' }; string str = new string( charArray ); Console.WriteLine( str ); char charStr = "sam"[0]; ToLower( ) ToUpper( ) IndexOf( str ) IndexOfAny( string[] sArray ) StartsWith( str ) EndsWith( str ) Trim( ) string str = "abcdefgag"; Console.WriteLine( str.Trim( "ag".ToCharArray( ) ) ); Remove( startIndex ) Replace( oldStr, newStr ) Split( string[] | char[] ) string s = "s:a:m"; string[] aa = s.Split( new char[] { ':' }, 2 ); string s2 = "xxxaadd"; s2.Split( new string[] { "aa" }, StringSplitOptions.RemoveEmptyEntries ); Substring( startIndex, length ) Array类
static ConvertAll(Array array, Converter<TInput, TOutput>) string[] xUserIDs = { "1", "2" }; int[] userIDs = Array.ConvertAll(xUserIDs, o => int.Parse(o)); //迭代数组每个元素,转换为int类型 static IndexOf(Array array, value) static Reverse(Array array) static Sort(Array array, IComparable<T> comparable) int[] ints = { 100, 5, 8 }; Array.Sort(ints); Console.WriteLine(ints[0]); Student[] stus = { new Student { Score = 100 }, new Student { Score = 90 } }; Array.Sort(stus); Console.WriteLine(stus[0].Score); static Sort(Array array, IComparer<T> comparer) static Sort(Array array , Comparison<T> comparison) Student[] stus = { new Student { Score = 100 }, new Student { Score = 90 } }; Comparison<Student> comparison = (item1, item2) => { return item1.Score > item2.Score ? 1 : item1.Score < item2.Score ? -1 : 0 }; Array.Sort(stus, comparison); Console.WriteLine(stus[0]);