关于System.Object

  所有类型都从System.Object派生而来。

  System.Object的公共方法中ToString()一般是返回对象的类型的全名,只有Int32这些类型将其重写后,新方法才会返回其值的字符串表示。

  其中还有两个受保护的方法:

    MemberwiseClone:深复制。

    Finalize:在垃圾回收器判断此对象应该被回收后,在对象的内存被实际回收前会调用此方法。

关于类型判断和转换:

  用is来判断对象为某类型或者某类型的派生类,是为true,不是为false。

  用as转换对象A为另一类型,成功则返回对象A的引用,失败则返回null。

  以上两种方法都不同于用()进行强制转换,不会报异常。

  其实看代码更好懂一点:

namespace MyTest
{
class Program
{
static void Main(string[] args)
{
var Troty123 = new Man();
Console.WriteLine(Troty123 is Man);//True
Console.WriteLine(Troty123 is People);//True
Console.WriteLine(Troty123 is Animal);//False object fuckBoy = new Man();
Console.WriteLine((fuckBoy as Man).ToString());//MyTest.Man
Console.WriteLine((fuckBoy as People).ToString());//MyTest.Man
Console.WriteLine(((fuckBoy as Animal)==null).ToString());//True
Console.Read();
}
}
class People {}
class Man:People{}
class Animal {}
}

using指令为命名空间或类型创建别名

using MySystemText = System.Text.StringBuilder;

namespace MyTest
{
class Program
{
static void Main(string[] args)
{
MySystemText myText = new MySystemText();
}
}
}

用于解决引用不同命名空间时,两个命名空间中有相同名称但功能不同的类型的问题。

一个关于堆栈和类的故事

先贴出示例代码

  class Program
{
static void Main(string[] args)
{
Show();
}
static void Show() {
People Troy123 = new People();
Troy123.Die();
Console.Read();
}
}
class People{
int age;
public void Die() { }
}

我们就讲一下Show被调用后的故事:

堆变化

首先JIT编译器会吧Show的IL代码全部转换为本机CPU指令,这个时候就已经知道了本函数中会用到People这个类型。

然后生成了一个System.Type类型的实例,我们这里叫People的类型对象A好了,里面有指向System.Type类型对象的指针,同步块索引,People的静态字段以及People的函数的入口。

栈变化

Show被调用后会先判断Show是否有参数传进来,有就压到栈中。(显然并没有)

然后Show在Main函数中的代码的地址会被压到栈中。

然后类型Troy123 的引用地址被压入栈中。

堆变化

然后生成People类的实例,此实例包含People类的实例字段以及其基类的实例字段。

且此实例的类型对象指针指向之前的A的地址。(多个People类的实例的类型对象指针都指向这一个地址)

然后调用Die(),

  如果Die函数是个虚函数,且实例是People的派生类Man的实例,且此派生类的Die函数override类People的Visual的Die函数。那么就应该实现类Man中的Die函数。(很显然不是)

  如果不符合上面这种情况,那么就按照   调用Die函数的那个变量Troy123的类型   中的Die函数来实现,也就是说如果Troy123是People类型就实现People的Die,如果是派生类Man类型就实现Man的Die。(而显然上面的代码实现People的Die)也就是说即使是People Troy123=new Man();实际上也是实现People的Die。

栈变化

如果Show函数结束,那么CPU的指令指针会指向之前压到栈中的返回地址,然后退栈帧,然后此时栈帧反应Main函数的堆栈情况。

堆变化

而此时People的实例已经没有被任何变量引用了,那么此时就会等待被垃圾回收器回收。

【C#进阶系列】04 类型基础的更多相关文章

  1. JavaScript进阶系列04,函数参数个数不确定情况下的解决方案

    本篇主要体验函数参数个数不确定情况下的一个解决方案.先来看一段使用函数作为参数进行计算的实例. var calculate = function(x, y, fn) { return fn(x, y) ...

  2. C#进阶系列 ---- 《CLR via C#》

      [C#进阶系列]30 学习总结 [C#进阶系列]29 混合线程同步构造 [C#进阶系列]28 基元线程同步构造 [C#进阶系列]27 I/O限制的异步操作 [C#进阶系列]26 计算限制的异步操作 ...

  3. JavaScript进阶系列03,通过硬编码、工厂模式、构造函数创建JavaScript对象

    本篇体验通过硬编码.工厂模式.构造函数来创建JavaScript对象. □ 通过硬编码创建JavaScript对象 当需要创建一个JavaScript对象时,我们可能这样写: var person = ...

  4. JavaScript进阶系列02,函数作为参数以及在数组中的应用

    有时候,把函数作为参数可以让代码更简洁. var calculator = { calculate: function(x, y, fn) { return fn(x, y); } }; var su ...

  5. JavaScript进阶系列07,鼠标事件

    鼠标事件有Keydown, Keyup, Keypress,但Keypress与Keydown和Keyup不同,如果按ctrl, shift, caps lock......等修饰键,不会触发Keyp ...

  6. JavaScript进阶系列06,事件委托

    在"JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数"中已经有了一个跨浏览器的事件处理机制.现在需要使用这个 ...

  7. JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数

    本篇体验JavaScript事件的基本面,包括: ■ 事件必须在页面元素加载之后起效■ 点击事件的一个简单例子■ 为元素注册多个点击事件■ 获取事件参数 ■ 跨浏览器事件处理 □ 事件必须在页面元素加 ...

  8. JavaScript进阶系列01,函数的声明,函数参数,函数闭包

    本篇主要体验JavaScript函数的声明.函数参数以及函数闭包. □ 函数的声明 ※ 声明全局函数 通常这样声明函数: function doSth() { alert("可以在任何时候调 ...

  9. C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解  ...

随机推荐

  1. 适合wordpress中文网站的seo优化插件 DX-Seo

    DX-Seo是一款强大的多功能wordpress seo插件,主要功能及其使用方法如下 全局开关设置 启动插件后,进入"DX-Seo"栏目,你可以开启或者关闭其中的所有功能. 自动 ...

  2. 【css】a:hover 设置上下边框在 ie6 和 ie7 下失效

    前段时间在写样式的时候发现了这个问题,虽然当时就解决了这个 bug 不过还是记录下,以免再次出现这样的问题. demo 代码: <!doctype html> <html lang= ...

  3. c#列举和迭代器

    列举 - Enumeration 迭代器是一个值序列(集合)上的一个只读且只向前移动的游标.迭代器要么实现了IEnumerator接口,要么实现了IEnumerator<T>接口. 从技术 ...

  4. asp.net首页设置

    在web.config中设置首页 <configuration> <system.web> <compilation debug="true" tar ...

  5. Android源码网站

    https://mirrors.tuna.tsinghua.edu.cn/ https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ https://mirror ...

  6. java之抽象类

    1.用abstract关键字来修饰一个类时,这个类叫做抽象类:用abstract来修饰一个方法时,该方法叫做抽象方法. 2.含有抽象方法的类必须被声明抽象类,抽象类必须被继承,抽象方法必须被重写. 3 ...

  7. Android之输入框光标和Hint的位置

    如图所示,要实现这一的需求,一般人的布局方式就是左边一button,右边一button,中间一个EditText,为了输入框的响应触摸范围更大往往不会把宽度设置为wrap_content,要么设置成m ...

  8. CRUD Operations In ASP.NET MVC 5 Using ADO.NET

    Background After awesome response of an published by me in the year 2013: Insert, Update, Delete In ...

  9. DataContractSerializer序列化与反序列化遇到的奇怪问题

    private static void Serialize1(string filename, object obj)         {             var stream = new F ...

  10. 获取全国市以及地理坐标,各大坐标系北斗,百度,WGS-84坐标系的转换,有图,有代码

    1 先上坐标取到的值: 获取到的坐标部分如下: '北京市':[116.39564503788,39.92998577808], '天津市':[117.21081309155,39.1439299033 ...