zoukankan      html  css  js  c++  java
  • 【编程笔记】Unity3D语言的类型系统--C#的类型系统

      几乎所有的编程语言都有自己的类型系统。

      而编程语言更是常常按照其类型系统而被分为强类型语言/弱类型语言安全类型语言/不安全类型语言静态类型语言/动态类型语言等

      而C#的类型系统是静态安全,并且在大多数时候是显示的;

      C#要求其所有类型全部从System.Object类派生。无论是开发者自己定义的类型、还是C#所提供的类型。

      下面两种定义类型的方式,其含义完全是一样的;

      
    1 //隐式派生自System.Object
    2 class Person
    3 {
    4 }
    5 //显式派生自System.Object
    6 class Person:System.Object
    7 {
    8 }
    View Code

      在Unity3D的使用过程中,其提供的C#语言脚本接口是以MonoBehaviour这个类作为基础的。

      而MonoBehaviour显然也是派生System.Object

      也正是因为所有的类型都派生自System.Object,因此所有的类型都保证了拥有一套最基本的方法,即System.Object所声明的方法;

      这几个最基本的方法包括以下4个公共和2个受保护的方法:

      (1)Equals:若两个对象具有相同的值,则返回true,否则返回false;

      (2)GetHashCode:返回对象的值得哈希码。

      (3)Tostring:默认返回类型的完整名称,即this.GetType().FullName。但是此方法经常被重写,最典型的例子就是Int型等重写该方法以返回其值的字符串形式。

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

      (5)MemberwiseClone.

      (6)Finalize:虚方法,在对象被标志位应该被作为垃圾回收之后,但在内存真正被回收之前,会调用该方法。因此,如果需要在回收内存前执行清理工作的类型应该重写该方法。

    · C#语言是静态类型语言

      C#是静态类型的,这意味着在C#中,每一个变量都有一个特定的类型,而重要的是,该类型在编译时是确定的,而静态这词也是源于对表达式在编译时的描述,因为编译器需要检查和使用这些“静态”的、不变的数据来确定哪些操作时被允许的。

      

      而常常在对一个变量的声明时所确定的类型,便是其编译时的类型,也就是其静态类型。

      但是静态类型系统中并非没有一些动态行为,为了说明这一点,举一个简单的例子。

      首先声明一个基类叫Singer(歌手),再声明一个继承自SInger这个基类的类。叫Alin.

      代码如下:

     1 public abstract class Singer
     2 {
     3     //基类;
     4 }
     5 public class Alin:Singer
     6 {
     7     //派生类;
     8 }
     9 class Class1
    10 {
    11     public static void Main(string[] args){
    12         Singer a = new Alin();
    13     }
    14 }
    View Code

      对编译器来说,变量的类型就是你声明它时的类型。在此,变量a的类型被定义为Singer。也就是说a编译时的类型时singer。

      但是在之后又实例化一个Alin类型的实例,并且将这个实例的引用赋值给变量a。这就是在这段程序运行的时候编译阶段被定义为Singer类型的变量a所指向的一块存储了类型Alin的实例的内存,换言之,此时的a运行的类型是Alin。因此,接下来编译器会查找Alin类型中定义的属性和方法,并以此来生成适当的CIL代码,并推算出a这个变量的类型时Alin。不过变量a编译时类型任是静态类型,也就是说a的静态类型是Singer。

      当然,静态类型系统中的动态行为的另一种常见的表现就是虚方法,其实际实现依赖于所调用的对象的类型;

      而与静态类型相对应的则是动态类型与静态类型相比,动态类型的实质便是变量并不局限于特定的类型。换言之,编译器无法对动态类型执行与对待静态类型时一样的检查。相反,运行环境对待动态类型时是采取了一种恰当的方式来解读变量。

      例如JavaScript语言中,代码如下:

    1 var pi = 3.14;
    2 var name = "ChenJD";
    3 var hello = '你好';
    View Code

      这段JavaScript代码在执行时,会动态的检查和确定其类型,从而使用完全不同的操作方式处理这些变量。

      在C#4 中引入了动态类型,不过需要注意的是,在C#3以及之前的版本中,C#是一门完全静态的语言,而使用Unity3D进行项目开发时i,绝大部分代码任然是静态类型的;  

      

  • 相关阅读:
    (11)模糊图片操作---均值模糊
    (10)绘制形状和文字
    (9)调整图像的亮度和对比度
    (8)图像混合
    (7)opencv图片内部的基本处理
    C#中的线程池使用(二)
    C#中的线程池使用(一)
    C#中线程的委托
    为PyCharm自动配置作者信息
    为PyCharm配置QT
  • 原文地址:https://www.cnblogs.com/YeYunRong/p/7092524.html
Copyright © 2011-2022 走看看