继续抄书
几乎所有的编程语言都有自己的类型系统。而编程语言更是常常按照其类型系统而被分为:强类型/弱类型语言、安全类型/不安全类型语言、静态类型/动态类型语言等。例如静态不安全类型语言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位的,于是在这种情况下,可能会出现把一段文本,打印出一段数字来。