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

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

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

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

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

  

 //隐式派生自System.Object
class Person
{
}
//显式派生自System.Object
class Person:System.Object
{
}

  在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.

  代码如下:

 public abstract class Singer
{
//基类;
}
public class Alin:Singer
{
//派生类;
}
class Class1
{
public static void Main(string[] args){
Singer a = new Alin();
}
}

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

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

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

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

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

 var pi = 3.14;
var name = "ChenJD";
var hello = '你好';

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

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

  

【编程笔记】Unity3D语言的类型系统--C#的类型系统的更多相关文章

  1. R语言函数化编程笔记2

    R语言函数化编程笔记2 我学过很多的编程语言,可以我写的代码很啰嗦,一定是我太懒了.或许是基础不牢地动山摇 1.为什么要学函数 函数可以简化编程语言,减少重复代码或者说面向对象的作用 2.函数 2.1 ...

  2. R语言函数化编程笔记1

    R语言函数化编程笔记1 notes:有一个不错的网站叫做stack overflow,有问题可以从上面找或者搜索答案,会有大佬相助. 在github上面可以找到很多R的扩展包,如果自己额修改被接受,那 ...

  3. C/C++编程笔记:C语言入门知识点(三),请收藏C语言最全笔记!

    今天我们继续来学习C语言的入门知识点,第一课:C/C++编程笔记:C语言入门知识点(二),请收藏C语言最全笔记! 21. 输入 & 输出 当我们提到输入时,这意味着要向程序填充一些数据.输入可 ...

  4. C/C++编程笔记:C语言贪吃蛇源代码控制台(二),分数和食物!

    接上文<C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!>如果你在学习C语言开发贪吃蛇的话,零基础建议从上一篇开始哦!接下来正式开始吧! 三.蛇的运动 上次我已经教大家画 ...

  5. Shell编程笔记

    Shell编程笔记与Windows下熟悉的批处理类似,也可以将一些重复性的命令操作写成一个脚本方便处理.   修改别人的脚本,运行后遇到个问题 setenv: command not found 查证 ...

  6. python核心编程--笔记

    python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找pyt ...

  7. Python编程笔记二进制、字符编码、数据类型

    Python编程笔记二进制.字符编码.数据类型 一.二进制 bin() 在python中可以用bin()内置函数获取一个十进制的数的二进制 计算机容量单位 8bit = 1 bytes 字节,最小的存 ...

  8. 风变编程笔记(二)-Python爬虫精进

    第0关  认识爬虫 1. 浏览器的工作原理首先,我们在浏览器输入网址(也可以叫URL),然后浏览器向服务器传达了我们想访问某个网页的需求,这个过程就叫做[请求]紧接着,服务器把你想要的网站数据发送给浏 ...

  9. Scala编程 笔记

    date: 2019-08-07 11:15:00 updated: 2019-11-25 20:00:00 Scala编程 笔记 1. makeRDD 和 parallelize 生成 RDD de ...

  10. C# 高效编程笔记2

    C# 高效编程笔记2 1.理解GetHashCode()的陷阱 (1)作用:作为基于散列集合定义键的散列值,如:HashSet<T>,Dictionary<K,V>容器等 (2 ...

随机推荐

  1. CentOS 7 搭建基于携程Apollo(阿波罗)配置中心单机模式

    Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性.服务端基于Spring Boot ...

  2. Centos7安装GitLab

    GitLab CE Download Archives gitlab安装调试小记 Gitlab Free Trial GitLab搭建手记 Gitlab社区版的使用 GUI PNG Gitlab升级到 ...

  3. CentOS7 安装 Tomcat

    安装 JDK Tomcat 的安装依赖 JDK,在安装 Tomcat 之前需要先安装 Java JDK.输入命令 java -version,如果显示 JDK 版本,证明已经安装了 JDK java ...

  4. 微信小程序 sha1 实现密码加密

    在utils中的util.js 文件中增加 函数 实现 字符串转换为16进制加密后的字符串 function encodeUTF8(s) { var i, r = [], c, x; for (i = ...

  5. 解析JavaScript函数的多种写法

    本文主要分析了JavaScript中函数的几种写法,具体如下: 1.函数的声明和表达式(旧方法,也是最常见的方法) 2.通过Function构造器 这也是一种从一开始就存在方法,但是因为书写麻烦等原因 ...

  6. MongoDB 搭建可复制群集

    一.概述 MongoDB复制群集支持节点故障自动切换,最小配置应包含3个节点,正常情况下应该至少包含两个数据节点,第三个节点可以是数据节点也可以是仲裁节点.仲裁节点的作用是当出现偶数节点导致无法仲裁的 ...

  7. RMI远程服务调用

    数据库:info.sql /* Navicat MySQL Data Transfer Source Server : yuanzhen Source Server Version : 50713 S ...

  8. 阿里巴巴分布式服务框架 Dubbo 介绍

    Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,每天为2000+ 个服务提供3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点.Dubbo自2011年开源后, ...

  9. day4(while 、练习题)

    一.while ... else 方法 while else 的作用就是,确定循环正确执行完毕,else里面可以提示完成的情况. 二.练习题 1.编译型语言是编译完之后执行,解释性语言是边编译边执行, ...

  10. JAVA在不确定具体 Annotation 类型时,获得注解参数

       package com.lzw.demo; @SpringBootApplication public class DemoApplication { public static void ma ...