Unity 3D学习日志——C#的类型系统

继续抄书

几乎所有的编程语言都有自己的类型系统。而编程语言更是常常按照其类型系统而被分为:强类型/弱类型语言、安全类型/不安全类型语言、静态类型/动态类型语言等。例如静态不安全类型语言C/C++、静态安全类型语言C#和Java、动态安全类型语言JavaScript等。

这一段话就是说C#的类型系统是静态、安全、并且在大部分情况下都是显式的。

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

在Unity 3D的使用过程中,其提供的C#语言脚本接口是以MonoBehaviour这个类作为基础的。而MonoBehaviour显然也是派生自System.object。因此所有的类型都保证了有一套最基本的方法。这几个方法包括4个公用和2个受保护方法:

(1)Equels:若两个对象拥有相同的值,返回true,反之返回false

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

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

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

(5)MemberwiseClone

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

虽然说看上面6个函数,感觉也就equals和tostring可能用的多一点,感觉没啥用呢


1、C#语言是静态类型的(C#4中引入了动态类型,在C#3之前的版本中,C#是一门完全静态的语言,而在使用Unity 3D开发时,绝大部分代码仍然是静态类型的)

这意味着在C#语言中,每一个变量都有一个特定的类型,而更重要的是该类型在编译时是确定的,在编译这些表达式时,编译器使用这些“静态的”不变的数据时,检查哪些操作是被允许的。

但是静态类型系统中也有一些动态行为,如基类类型被实例化为其一个派生类,如调用虚函数时,其实际实现的是依赖于所调用对象的类型。下面看例子

public abstract class Geek()//基类
public class me : Geek()//派生类
class Class1{
    public static void main(string args){
        Geek g = new me();
    }
}

下面这段话有点绕,我一下子没看懂。。。

对编译器来说,变量的类型就是你声明它时的类型,这里g被声明为Geek类型,在编译时它的类型是Geek。但它之后又实例化了一个me类型,意味着在运行时,它的类型是me类型,这时候编译器会查找me这个类中定义的属性和方法(可能重写了一些方法,不再是和Geek类型一样),接下来,编译器会查找me这个类中的属性和方法,并以此来生成适当的CIL(common intermedia language容易混淆于CLI,这里只是标一下common language infrastructure)代码,并推算出g这个变量的类型是me,不过变量g在编译时仍然是静态类型,也就是说g的静态类型是Geek。

2、C#语言在大多数的 时候是显式类型的

显式类型就是在声明变量时,指定其类型,如:int i=0; float pi=3.14f; string name = "nywwhgsnm";

在C# 3中引入了关键字“var”来表示隐式类型,声明局部变量时使用var,表示编译器要在编译时对该变量进行类型推断

3、C#语言是类型安全的

C#语言中,不允许将一种类型当作另一种类型,除非它们之间真的存在转换关系。

与类型安全相对的是类型不安全的,类型不安全的是哪种情况呢,举个栗子:在C/C++语言中,对某char值强制转换成int值,而我们知道int值是32位的,char值是8位的,于是在这种情况下,可能会出现把一段文本,打印出一段数字来。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值