【编程笔记】Unity3D语言的类型系统--C#的类型系统
几乎所有的编程语言都有自己的类型系统。
而编程语言更是常常按照其类型系统而被分为强类型语言/弱类型语言、安全类型语言/不安全类型语言、静态类型语言/动态类型语言等。
而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#的类型系统的更多相关文章
- R语言函数化编程笔记2
R语言函数化编程笔记2 我学过很多的编程语言,可以我写的代码很啰嗦,一定是我太懒了.或许是基础不牢地动山摇 1.为什么要学函数 函数可以简化编程语言,减少重复代码或者说面向对象的作用 2.函数 2.1 ...
- R语言函数化编程笔记1
R语言函数化编程笔记1 notes:有一个不错的网站叫做stack overflow,有问题可以从上面找或者搜索答案,会有大佬相助. 在github上面可以找到很多R的扩展包,如果自己额修改被接受,那 ...
- C/C++编程笔记:C语言入门知识点(三),请收藏C语言最全笔记!
今天我们继续来学习C语言的入门知识点,第一课:C/C++编程笔记:C语言入门知识点(二),请收藏C语言最全笔记! 21. 输入 & 输出 当我们提到输入时,这意味着要向程序填充一些数据.输入可 ...
- C/C++编程笔记:C语言贪吃蛇源代码控制台(二),分数和食物!
接上文<C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!>如果你在学习C语言开发贪吃蛇的话,零基础建议从上一篇开始哦!接下来正式开始吧! 三.蛇的运动 上次我已经教大家画 ...
- Shell编程笔记
Shell编程笔记与Windows下熟悉的批处理类似,也可以将一些重复性的命令操作写成一个脚本方便处理. 修改别人的脚本,运行后遇到个问题 setenv: command not found 查证 ...
- python核心编程--笔记
python核心编程--笔记 的解释器options: 1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找pyt ...
- Python编程笔记二进制、字符编码、数据类型
Python编程笔记二进制.字符编码.数据类型 一.二进制 bin() 在python中可以用bin()内置函数获取一个十进制的数的二进制 计算机容量单位 8bit = 1 bytes 字节,最小的存 ...
- 风变编程笔记(二)-Python爬虫精进
第0关 认识爬虫 1. 浏览器的工作原理首先,我们在浏览器输入网址(也可以叫URL),然后浏览器向服务器传达了我们想访问某个网页的需求,这个过程就叫做[请求]紧接着,服务器把你想要的网站数据发送给浏 ...
- Scala编程 笔记
date: 2019-08-07 11:15:00 updated: 2019-11-25 20:00:00 Scala编程 笔记 1. makeRDD 和 parallelize 生成 RDD de ...
- C# 高效编程笔记2
C# 高效编程笔记2 1.理解GetHashCode()的陷阱 (1)作用:作为基于散列集合定义键的散列值,如:HashSet<T>,Dictionary<K,V>容器等 (2 ...
随机推荐
- CentOS 7 搭建基于携程Apollo(阿波罗)配置中心单机模式
Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性.服务端基于Spring Boot ...
- Centos7安装GitLab
GitLab CE Download Archives gitlab安装调试小记 Gitlab Free Trial GitLab搭建手记 Gitlab社区版的使用 GUI PNG Gitlab升级到 ...
- CentOS7 安装 Tomcat
安装 JDK Tomcat 的安装依赖 JDK,在安装 Tomcat 之前需要先安装 Java JDK.输入命令 java -version,如果显示 JDK 版本,证明已经安装了 JDK java ...
- 微信小程序 sha1 实现密码加密
在utils中的util.js 文件中增加 函数 实现 字符串转换为16进制加密后的字符串 function encodeUTF8(s) { var i, r = [], c, x; for (i = ...
- 解析JavaScript函数的多种写法
本文主要分析了JavaScript中函数的几种写法,具体如下: 1.函数的声明和表达式(旧方法,也是最常见的方法) 2.通过Function构造器 这也是一种从一开始就存在方法,但是因为书写麻烦等原因 ...
- MongoDB 搭建可复制群集
一.概述 MongoDB复制群集支持节点故障自动切换,最小配置应包含3个节点,正常情况下应该至少包含两个数据节点,第三个节点可以是数据节点也可以是仲裁节点.仲裁节点的作用是当出现偶数节点导致无法仲裁的 ...
- RMI远程服务调用
数据库:info.sql /* Navicat MySQL Data Transfer Source Server : yuanzhen Source Server Version : 50713 S ...
- 阿里巴巴分布式服务框架 Dubbo 介绍
Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,每天为2000+ 个服务提供3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点.Dubbo自2011年开源后, ...
- day4(while 、练习题)
一.while ... else 方法 while else 的作用就是,确定循环正确执行完毕,else里面可以提示完成的情况. 二.练习题 1.编译型语言是编译完之后执行,解释性语言是边编译边执行, ...
- JAVA在不确定具体 Annotation 类型时,获得注解参数
package com.lzw.demo; @SpringBootApplication public class DemoApplication { public static void ma ...