关于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. NSXMLParser读取XML文件并将数据显示到TableView上

    关于XML,有两种解析方式,分别是SAX(Simple API for XML,基于事件驱动的解析方式,逐行解析数据,采用协议回调机制)和DOM(Document Object Model ,文档对象 ...

  2. qt下调用win32api 修改分辨率

    在头文件中添加 #include <window.h> DEVMODE DevMode; EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, ...

  3. mac下python实现vmstat

    mac下没有linux/unix 的vmstat,只有vm_stat; sh-3.2# vm_statMach Virtual Memory Statistics: (page size of 409 ...

  4. 阿里云centos试用

    今天体验了下阿里云的centos,起初用的官方推荐的putty方式来管理,全部使用命令行管理起来还是很别扭的. 后来通过百度了解到winscp,有了这个工具,管理起来就爽很多啦.整个centos的管理 ...

  5. css3整理--filter

    只在chrome的少数版本的浏览器中有实现,兼容性差,不适宜应用. filter语法: elm { filter: none | <filter-function > [ <filt ...

  6. 调用 google speech api (使用Google语音识别引擎)

    完全参考自: http://mikepultz.com/2011/03/accessing-google-speech-api-chrome-11/ http://aiku.me/bar/104480 ...

  7. css3 定义选择器

    引言:CSS样式规则有两个主要部分.选择器决定将格式化应用到哪些元素.声明则定义要应用的格式化. 构造选择器 选择器可以定义五个不同的标准来选择要进行格式化的元素. 元素的类型或者名称.如下所示. h ...

  8. 从javascript一道闭包面试题说开去

    这道题目比较经典了: var a = 1; function test(){ a = 2; return function(){ console.log(a); } var a = 3; } test ...

  9. Populating Next Right Pointers in Each Node II--leetcode难题讲解系列

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  10. 开发常用到的terminal命令

    1.删除work_plugin目录下的.svn文件(最后面的;也是命令的一部分) sudo find /Users/maxinliang/DaTang/work_plugin ".svn&q ...