【C#进阶系列】04 类型基础
关于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 类型基础的更多相关文章
- JavaScript进阶系列04,函数参数个数不确定情况下的解决方案
本篇主要体验函数参数个数不确定情况下的一个解决方案.先来看一段使用函数作为参数进行计算的实例. var calculate = function(x, y, fn) { return fn(x, y) ...
- C#进阶系列 ---- 《CLR via C#》
[C#进阶系列]30 学习总结 [C#进阶系列]29 混合线程同步构造 [C#进阶系列]28 基元线程同步构造 [C#进阶系列]27 I/O限制的异步操作 [C#进阶系列]26 计算限制的异步操作 ...
- JavaScript进阶系列03,通过硬编码、工厂模式、构造函数创建JavaScript对象
本篇体验通过硬编码.工厂模式.构造函数来创建JavaScript对象. □ 通过硬编码创建JavaScript对象 当需要创建一个JavaScript对象时,我们可能这样写: var person = ...
- JavaScript进阶系列02,函数作为参数以及在数组中的应用
有时候,把函数作为参数可以让代码更简洁. var calculator = { calculate: function(x, y, fn) { return fn(x, y); } }; var su ...
- JavaScript进阶系列07,鼠标事件
鼠标事件有Keydown, Keyup, Keypress,但Keypress与Keydown和Keyup不同,如果按ctrl, shift, caps lock......等修饰键,不会触发Keyp ...
- JavaScript进阶系列06,事件委托
在"JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数"中已经有了一个跨浏览器的事件处理机制.现在需要使用这个 ...
- JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数
本篇体验JavaScript事件的基本面,包括: ■ 事件必须在页面元素加载之后起效■ 点击事件的一个简单例子■ 为元素注册多个点击事件■ 获取事件参数 ■ 跨浏览器事件处理 □ 事件必须在页面元素加 ...
- JavaScript进阶系列01,函数的声明,函数参数,函数闭包
本篇主要体验JavaScript函数的声明.函数参数以及函数闭包. □ 函数的声明 ※ 声明全局函数 通常这样声明函数: function doSth() { alert("可以在任何时候调 ...
- C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解 ...
随机推荐
- BSS Audio® Introduces Full-Bandwidth Acoustic Echo Cancellation Algorithm for Soundweb London Conferencing Processors
BSS Audio® Introduces Full-Bandwidth Acoustic Echo Cancellation Algorithm for Soundweb London Confer ...
- 301 redirect Domain Name using global.asax
void Application_BeginRequest(object sender, EventArgs e) { if (HttpContext.Current.Request.Url.ToSt ...
- Kafka - SQL 代码实现
1.概述 上次给大家分享了关于 Kafka SQL 的实现思路,这次给大家分享如何实现 Kafka SQL.要实现 Kafka SQL,在上一篇<Kafka - SQL 引擎分享>中分享了 ...
- Android adt v22.6.2 自动创建 appcompat_v7 解决方法,最低版本2.2也不会出现
Android 开发工具升级到22.6.2在创建工程时只要选择的最低版本低于4.0,就会自动生成一个项目appcompat_v7,没创建一个新的项目都会自动创建,很是烦恼... 之前在网上也找过方法, ...
- android学习者优秀网址推荐
非常漂亮的android UI库集合,别人整理的,如果感觉不错,赶快收藏吧!! https://github.com/wasabeef/awesome-android-ui https://githu ...
- 用SQL server导出到oracle,查询时提示“表或视图不存在ORA-00942”错误
用SQL server2005的导出工具,将数据导出表到oracle,表名称里看到有这张表了,但查询或删除时都提示“ORA-00942表或者试图不存在”的错误,上网查了一下,是如下原因: “查询或删除 ...
- Vbox如何修改虚拟机器的uuid
先是 X: 然后cd X:\Program Files\VirtualBox 然后是 VBoxManage internalcommands sethduuid "X:\Progra ...
- Legolas工业自动化平台案例 —— 水源地自动化监控系统
天津港爆炸事件后,除了安置群众.追究事故责任外,人们最关心的莫过于爆炸污染物对于周边环境的影响,其中最重要的一块就是饮用水的安全.所幸的是,水源的安全监测是实实在在有据可依的.环保单位和供水企业在建设 ...
- KIS旗舰版常用数据表
select * from IC_Web2ERPOrders --网上订单 FOrderStatus 14--已发货,6--待发货,2--待配货,1--未审核 (审核后变为2,进入待配货)sele ...
- Screen Space Subsurface Scatting(Skin Rendring)
还差通透度计算,RenderMonkey截图. 参考: http://developer.download.nvidia.com/presentations/2007/gdc/Advanced_Ski ...