C#基础类库
Object类
1. Object是所有类的基类
所以,所有对象都有以下方法(可以重写Object的这些方法)
- Equals(): 判断两个对象是否相等
- ToString(): 将对象信息转换成字符串
- GetType(): 获取对象的类型
2. 常量也是对象
- 3.ToString()
- "Hello".Length()
3. 对象的相等
- Equals(等价)和 == (相等)的区别:
- ==对于简单数据类型,表示其值相等;对于引用类型表示是同一个对象
- 如果一个类没有重写Equals,那么Equals和==意义相同
- Equals的重写
- 有时候并不是判断是否是同一个对象,而是内容是否相等,就需要重写Equals方法
- 需要同时重写GetHashCode方法
- 注意,String虽然是引用类型,但是重载了==运算符,所以==也表示值相等
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 基础类学习 { class MyData { public int day, month, year; public MyData(int i, int j, int k) { day = i; month = j; year = k; } } class MyData2 : MyData { public MyData2(int i, int j, int k) : base(i, j, k) { } public override bool Equals(object obj) { if(obj is MyData2) { MyData2 t = (MyData2)obj; if (t.day == day && t.month == month && t.year == year) return true; } return false; } public override int GetHashCode() { return year * 365 + month * 31 + day; } } public class Test { public static void Main() { MyData m1 = new MyData(1, 2, 3); Console.WriteLine(m1); } } }
4. ToString方法
- 作用:把对象用字符串表示
- 自动调用:在把对象当作字符串输出或连接时
- Console.WriteLine(student); //自动调用student.ToString()
- "Hello, " + student "!" //相当于“Hello ” + student.ToString() + "!"
- 重写ToString
- 对于应用类型,如果不重写ToString,那么会使用Object类的缺省ToString,把命名空间的类名显示
- 重写以后,可以自己决定输出哪些信息
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 基础类学习 { class MyData { public int day, month, year; public MyData(int i, int j, int k) { day = i; month = j; year = k; } } class MyData2 : MyData { public MyData2(int i, int j, int k) : base(i, j, k) { } public override string ToString() { return year + "-" + month + "-" + day; } } public class Test { public static void Main() { MyData m1 = new MyData(1, 6, 2020); MyData2 m2 = new MyData2(1, 5, 2020); Console.WriteLine(m1); // 基础类学习.MyData Console.WriteLine(m2); // 2020-5-1 } } }
5. 深克隆和浅克隆
- 浅克隆
- 相当于“栈数据复制”
- 对于值类型,复制的是值;对于引用类型,复制的是引用(堆地址),而不是对象本身
- 深克隆:可以迭代的复制各个引用字段
Math类
提供相关的数学方法:
- Abs()
- Sin()、Cos()、Tan()
- Round()
- Exp()、Log()
- Pow()
Random类
1. 获取伪随机数
- Random random = new Random();
- random.Next(100); // [0, 100)
- random.NextDouble() // [0, 1]
2. 缺省种子是根据系统时间算出来的,如果需要指定
- Random random = new Random(100); // 100是种子
3. 如果需要更强的随机数,可以使用如下类:
- System.Security.Cryptograph.RNGCryptoServiceProvider
DateTime
- 表示某个时间点
- 创建DateTime对象
- DateTime d1 = new DataTime(2018, 9, 30, 9, 50, 00);
- DateTime d2 = DateTime.now; // 当前时间
- 查询方法
- IsLeapYear, DaysInMonth, Year, Month
- 操作
- Compare
- Equals, ==, !=
TimeSpan
- 表示时间段
- 创建TimeSpan对象
- TimeSpan ts1 = TimeSpan.FromMinute(10)
- TimeSpan ts2 = TimeSpan.Parse("36.00:00:00:00"); // 36天
- 查询方法
- Days,Hours, Minutes, Seconds
- 操作
- Compare, Equals, == , !=
DateTime可以与TimeSpan加减
- DateTime time2 = time1 + timespan1
- TimeSpan peroid = time2 - time1
String类
1. 创建字符串:
- String s1 = "Hello";
- String s2 = new String(new char[]{'H', 'e', 'l', 'l', 'o'}); // 通过字符构建
- String s3 = new String('A', 3); // "AAA"
2. 字符串长度
- s.Length
3. 字符串连接:
- String s4 = s1 + s2 + "abc";
此外,为什么JAVA能够在C/C++流行的时代脱颖而出,与它方便的字符串操作非常有关系。
还要注意,String是引用型,在栈上记录的是一个地址,在堆上存字符串的具体内容,当我们修改字符串时会在堆上重新分配一块地址空间,将新地址返回栈内存上面。因此,每改一次,地址就会变一次。
4. 取字符
- s[0]
5. 取子串
- String s = "Hello";
- String s2 = s.SubString(1, 3); // "ELL"
- String s3 = s.SubString(1); // "ello"
- String s4 = s.SubString(1, 8); // 异常
6. 字符串匹配
- s.StartWith(s1)
- s.EndWith(s1)
- s.Contains(s1)
- s.IndexOf(s1) // 返回第一次匹配的位置,无匹配返回-1
- s.LastIndexOf(s1) // 返回最后一个匹配的位置,无匹配返回-1
7. 分割与连接
- .Split(';')
- string.Join
String及StringBuilder
在循环体中使用s += ...可能会带来效率问题
- String内容是不可变的(immutable)
- 每次连接都需要创建新的字符串,然后重新赋值给s
StringBuilder
- 内部提供了字符串的buffer,内容可变
- 可以使用.Append, .Remove, .Replace
- 可以使用.Length获取长度
- 使用ToString转换为字符串
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 基础类学习 { public class Test { public static void Main() { string s = ""; StringBuilder sb = new StringBuilder(); DateTime t0 = DateTime.Now; for (int i = 0; i < 100000; i++) s = s.Insert(0, "."); DateTime t1 = DateTime.Now; for (int i = 0; i < 100000; i++) sb = sb.Insert(0, "."); DateTime t2 = DateTime.Now; Console.WriteLine(t1 - t0); Console.WriteLine(t2 - t1); } } }
个性签名:时间会解决一切