看《CLR via Csharp》回顾基础,写点简单的总结博客
Object类
每个类型都是从System。Object中派生,所以每个对象都有基本的方法
公共方法
Equal:如果有相同的值,返回True,但是原始Object的Equal是同一性的,不是相等性判断,通常需要重写Equal,而且还需要重写GetHashCode方法
GetHashCode:返回对象的哈希码。如果某个类型的对象要在哈希表集合中作为键使用,应该重写该方法。为不同对象提供良好分布
ToString:默认返回类型的完整名称(this.GetType().FullName),经常重写返回包含对象状态表示的String对象。比如Int,Boolean,返回他们值的字符串。
GetType:返回类型对象(Type派生的一个类型的实例),指出对象的类型,返回的Type对象可以和反射配合,获取元数据信息。GetType是非虚方法,防止重写隐瞒类型破坏类型安全
受保护方法
MemberwiseClone:非虚方法,创建新实例,并且与this字段完全一致,返回引用
Finalize:在对象内存被实际回收前会调用该方法 ,需要注意的是~ClassName是该方法的语法糖
new操作符
在C#中new的作用区
1.计算类型与基类中所有实例字段所需的字段数。包括额外成员——类型对象指针,同步索引块。
2.从托管堆中分配类型所需的字节数,分配的所有字节都为0
3.初始化类型对象指针和同步索引块
4.调用实例构造器
类型转换
C#想任何基类转换是隐式转换,转换为派生类只能显示因为运行时可能失败
以下是简单的代码示范
internal class Program
{
class A { }
static void Main(string[] args)
{
object obj = new A();//隐式转换
A a = obj as A;//必须显示转换不然会报错
Timer b = (Timer)obj;//编译器不会报错运行时报错
}
}
C#使用is和as操作符来转换
object o = new Employee();
if(o is Employee)
{
Employee e = (Employee)o;
}
在上述代码中C#检查了两次对象类型。先是is,后面是显示转换时。这样虽然更安全但是也跟费性能,使用as可以简化该写法
object o = new Employee();
Employee e = o as Employee;
if (e!= null)
{
//其他语句
}
使用该语句只进行了一次类型检测减少了性能消耗