使用 XNA 创建游戏/基础知识/C#
使用 XNA 框架为 XBox 编码时,我们将使用 C#(C Sharp)作为编程语言。C# 和 Java 非常相似,如果你了解其中一种,基本上你就了解了另一种。一个很好的 C# 入门教程是维基教科书 C# 编程。
C# 有一些 Java 中没有的功能,但是,如果你了解 C++,你会发现其中一些功能可能很熟悉。
- 属性
- 枚举
- 装箱和拆箱
- 运算符重载
- 用户定义的转换(强制转换)
- 结构体
- 只读字段
C# 和 Java 之间最大的区别可能就是委托。它们用于事件、回调和线程。简而言之,委托就是函数指针。
这是一种为变量提供 getter 和 setter 方法的简单方法。它在 Java 中没有等效的功能,除非你认为 Eclipse 自动添加这些方法是等效的。只需考虑以下示例,注意 value 关键字的使用。
在 Java 中,你可以使用接口来存储常量。在 C# 中,枚举类型用于此目的。请注意,它只能包含整型数据类型。
这对应于 Java 的包装类型,现在也可用在 Java 中。有趣的是,原始类型和装箱后的类型并不相同。还要注意,拆箱后的内容位于堆栈中,而装箱后的内容位于堆中。
这是一个你可能从 C++ 中知道的特性,或者你可以考虑 Java String 类对 “+” 运算符的重载。在 C# 中,你可以重载以下运算符
- 一元运算符:+, -, !, +, ~, ++, --, true, false
- 二元运算符:+, -, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=
例如,对于向量和矩阵数据类型,重载 “+”、“-” 和 “*” 运算符是有意义的。
Java 有内置的强制转换,C# 也有。此外,C# 允许隐式和显式强制转换,这意味着你定义强制转换的行为。通常,这在类层次结构中的兄弟姐妹之间是有意义的。但是,有一个限制:不能重写由类层次结构定义的转换。
结构体基本上允许你定义行为类似于原始数据类型的对象。与存储在堆中的对象不同,结构体实际上存储在堆栈中。结构体与类非常相似,它们可以有字段、方法、构造函数、属性、事件、运算符、转换和索引器。它们也可以实现接口。但是,也有一些区别
- 结构体不能从类或其他结构体继承
- 它们没有析构函数
- 结构体是按值传递而不是按引用传递
当我们讨论 const 关键字时,与 Java 的 final 的区别在于,你必须在变量声明时为其赋值。解决此问题的方法是使用 readonly 关键字。但是,它仍然有限制,即 readonly 变量必须在构造函数中初始化。
通常,在 Java 中,当你向方法传递某些内容时,它是一个变量或一个对象。现在,在 C# 中,也可以传递方法。这就是委托的意义所在。请注意,委托也是类。理解委托的一种好方法是将委托视为为方法签名命名的东西。
除了普通的委托外,还有多播委托。如果委托的返回值类型为 void,它也可以成为多播委托。因此,如果委托是对一个方法的调用,那么多播委托是对多个方法的调用,一个接一个地调用。
回调方法在使用 C 或 C++ 编程时经常使用,它们非常有用。其理念是,与其等待另一个线程完成,不如只给该线程一个回调方法,它可以在完成时调用该方法。当有一些需要很长时间才能完成的任务,而我们又希望用户在此期间做其他事情时,这一点非常重要。为了实现这一点,C# 使用委托。
C# 中的面向对象概念与 Java 的非常相似。在语法方面有一些细微的差异。只有在继承链中的方法覆盖方面,C# 比 Java 提供了更大的灵活性。它允许对实际上将被调用的多态方法进行非常细粒度的控制。为此,它使用 “virtual”、“new” 和 “override” 关键字。在基类中,你需要将要覆盖的方法声明为 virtual。现在,在派生类中,你可以选择将函数声明为 “virtual”、“new” 或 “override”。