zoukankan      html  css  js  c++  java
  • C#的类型系统

    ​ C#所有类型全部从System.Object类派生,因此所有类型都保证了拥有一套最基本的方法,即System.Object所声明的方法,包括四个公共和两个受保护方法。

    1. Equals:判断两个对象是否具有相同值,返回bool值

    2. GetHashCode:返回对象的值的哈希码

    3. ToString:默认返回类型完整名称,经常被重写,最经典的是int型重写该方法以返回其值的字符串形式

    4. GetType:返回一个从Type类派生的类型实例,以指出调用该方法的对象时什么类型,常用于为反射提供与对象类型相关的元数据信息

    5. MemberwiseClone:浅复制

      关于深浅复制http://www.cnblogs.com/chenwolong/p/MemberwiseClone.html

    6. Finalize:虚方法,在对象被标志为应该被作为垃圾回收之后,但在内存真正被回收之前,会调用该方法

    ​ C#语言特点:

    • C#语言是静态类型的

      C#3以及之前版本中,C#是一门完全静态的语言。C#4引入了动态类型,但在unity3d中绝大部分代码仍然是静态类型的

    • C#语言在大多数的时候是显示类型的

      用var来声明隐式类型变量,其变量实际上在编译阶段是被确定的,只不过是由编译器推断出来的。

    • C#语言是类型安全的

      C#允许合理的类型转换,但是不能将两个完全不相同的类型互相转换。

    值类型和引用类型

    ​ 值类型变量与引用类型变量的内存分配模型不一样。

    ​ 为了理解清楚这个问题,首先需了解两种不同类型的内存区域:线程堆栈(Thread Stack)和托管堆(Managed Heap)。(对于线程堆栈我又习惯称为线程栈)

    ​ 堆栈stack:

    • ​ 堆栈实际上是向下填充,即由高内存地址指向低内存地址填充。

    • ​ 堆栈的工作方式是先分配内存的变量后释放(先进后出原则)。

    • ​ 堆栈中的变量是从下向上释放,这样就保证了堆栈中先进后出的规则不与变量的生命周期起冲突!

    • ​ 堆栈的性能非常高,但是对于所有的变量来说还不太灵活,而且变量的生命周期必须嵌套。

    通常我们希望使用一种方法分配内存来存储数据,并且方法退出后很长一段时间内数据仍然可以使用。此时就要用到堆(托管堆)!

    ​ 堆(托管堆)heap

    • ​ 此堆非彼堆,.NET中的堆由垃圾收集器自动管理。

    • ​ 与堆栈不同,堆是从下往上分配,所以自由的空间都在已用空间的上面。

    一般而言,值类型存储在线程栈上,但有时可能分配在托管堆上,例如:

    • 数组中的元素
    • 引用类型中的值类型字段
    • 迭代器块中的局部变量
    • 闭包情况下的匿名函数(lamda)中的局部变量

    值类型大体上分为结构和枚举,结构并非轻量级的类!

    引用类型一般有Dynamic,Object,string

    参考自C#垃圾回收和托管堆及堆栈 https://blog.csdn.net/lin37985/article/details/46576627 及unity3d脚本编程一书

  • 相关阅读:
    forkjoinpool
    json path
    如何处理json字符串
    ios如何快速转型安卓开发-专题3
    ios如何快速转型安卓开发-专题1
    framework创建及接入方式
    Cocoapods包管理
    cf 1102 B
    夜深人静写题解--杭电第五场
    夜深人静写题解--牛客第六场
  • 原文地址:https://www.cnblogs.com/AMzz/p/13565616.html
Copyright © 2011-2022 走看看