Unity游戏开发之C#快速⼊门
C#是微软团队在开发.NET框架时开发的,它的构想接近于C、C++,也和JAVA⼗分相似,有许多强⼤的编程功能。
个⼈感受是C#吸收了众多编程语⾔的优点,从中可以看到C、C++、Java、Javascript、python的影⼦,设计思想都是相通的(过段时间⼀定要看看设计模式),对⽐迁移地学习基本只需要记关键字、语法和包的⽤法。我是为了unity游戏开发课程学的,不是很深⼊,某些细节可能也没有涉及到。就先复习了以前学
C++、java的笔记,然后对照着简单学了C#,会重点学unity中⽤到的包。
1.C#程序结构
C# 中的关键组织结构概念包括程序、命名空间、类型、成员和程序集。
⼀个C#版HelloWorld直观感受⼀下。
using System; //包含命名空间
namespace HelloWorldApplication //声明⼀个命名空间
{
class HelloWorld //类声明
{
static void Main(string[] args) //Main⼊⼝函数
{
/* 我的第⼀个 C# 程序*/
Console.WriteLine("Hello World"); //输出
Console.ReadKey();
}
}
}
与 Java 不同,⽂件名可以不同于类的名称。
2.数据类型、类型转换
值类型 (从System.ValueType中派⽣)
bool、byte、char、decimal、double、float、int、long、sbyte、short、uint、ulong、ushort、结构体struct、枚举enum
引⽤类型
引⽤类型不包含存储在变量中的实际数据,⽽是包含对变量的引⽤。
内置的引⽤类型有:object、dynamic 和 string。
⾃定义的有:类class C {...}、接⼝interface I {...}、委托delegate int D(...)、数组int[] 和 int[,] 。
对象类型变量的类型检查是在编译时发⽣。
动态类型变量的类型检查是在运⾏时发⽣。
@引号的字符串会将转义字符(\)当作普通字符,可以任意换⾏,换⾏符及缩进空格都计算在字符串长度之内。
字符串的占位符为{},如:String.Format(“{0},{1}”,c,d);
指针类型
指针类型变量存储另⼀种类型的内存地址。
例如:char* cptr;
可空类型
null是引⽤类型变量的默认值,null不允许被赋给值类型的变量,但有时我们希望值类型的数据可以为null,就有了可空类型。
int a = null; // ⾮法
int? a = null; // 合法,可空类型
Nullable<int> i = new Nullable<int>(3);//可空类型
合并运算符(??)定义了⼀个预设值,以防可空类型的值为null。
如:
double? num1 = null;
double num3 = num1 ?? 5.34; // num1 如果为空值则返回 5.34
类型转换如:i = (int)d;i.ToString();s.ToBoolean();
C#的运算符,判断、循环语句和C++的语法基本⼀致,不做过多说明。
3.⽅法、类、接⼝、泛型
⼀个访问修饰符定义了⼀个类成员的范围和可见性。
C# ⽀持的访问修饰符如下所⽰:
public:所有对象都可以访问;
private:对象本⾝在对象内部可以访问;
protected:只有该类对象及其⼦类对象可以访问
internal:同⼀个程序集的对象可以访问;
protected internal:访问限于当前程序集或派⽣⾃包含类的类型。
C# 中定义⽅法:
<Access Specifier> <Return Type> <Method Name>(Parameter List)
{
Method Body
}
C#中的类和java是很像的,不过继承的时候⽤的:,⽽不是extends。
类中也有构造函数、析构函数、静态成员(static)。
class Line
{
private double length; // 线条的长度
public Line() // 构造函数
{
Console.WriteLine("对象已创建");
}
~Line() //析构函数
{
Console.WriteLine("对象已删除");
}
public void setLength( double len )
{
length = len;
}
}
类的继承:
class <;派⽣类> : <;基类1>,<;基类2>,...
{
...
}
接⼝的继承和实现也是⽤的冒号:
interface IMyInterface : IParentInterface
{
}
class InterfaceImplementer : IMyInterface
{
//接⼝中⽅法的实现
}
泛型:
using System.Collections.Generic;
GenericList<float> list1 = new GenericList<float>();
C#的泛型和C++模板类似,但也有
泛型可以通过使⽤ where 上下⽂关键字指定约束。
4.域(Field)、属性(Peoperty)、索引器(Indexer)
域和属性的区别
区别属性域
逻辑性
逻辑字段,在改变字段时
能改变对象的其他⼀些状态
不经过逻辑处理
存储性不占⽤实际内存占内存空间及位置
访问性由get、set访问器决定读写
属性
由访问修饰符决
定
安全性增加了数据的安全性不太安全为了实现对字段的封装,保证字段的安全性,⽽产⽣了属性,其本质是⽅法,通常是配合使⽤
的,如下:
class Student
{
private string name = "not known";
// 声明类型为 string 的 Name 属性
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
}
索引器
索引器(Indexer)允许⼀个对象可以像数组⼀样被索引。
和属性类似,可使⽤ get 和 set 访问器来定义索引器,⽽索引器返回或设置对象实例的⼀个特定值。
5.委托、匿名函数、事件
委托
委托可以理解为函数指针,是对函数原型的包装。
但相⽐于函数指针,委托⾯向对象,类型更安全,有多播的功能。
通过委托,可以将⽅法视为可分配给变量并可作为参数传递的实体。
例如:
申明委托:delegate void TestDelegate(string s);
可以再任何地⽅声明委托,可以带访问修饰符。
委托不关⼼引⽤的⽅法的类,只关⼼引⽤的⽅法是否与委托有相同的参数和返回类型。
实例化委托:TestDelegate testdelA = new TestDelegate(M);
⽤某个⽅法实例化这个委托,也就是说,使函数指针指向⼀个⽅法。
调⽤委托:testdelA("Hello");
委托可以多播
委托间可以使⽤+、-来组合、移除,委托判等是根据它引⽤的⽅法判断。
泛型委托:delegate T NumberChanger<T>(T n);
匿名函数与Lambda表达式
匿名⽅法(Anonymous methods)提供了⼀种传递代码块作为委托参数的技术。
匿名⽅法没有名称只有主体,不需要指定返回类型,它是从⽅法主体内的 return 语句推断的。匿名函数与委托的使⽤步骤相同,实例化时格式不同,格式如下:
委托名实例变量 =delegate(形参列表){⽅法体};
Lambda表达式也是匿名函数,语法更加简洁:
(参数列表) => {⽅法体}
事件
事件使⽤发布-订阅(publisher-subscriber)模型。
在类的内部声明事件,⾸先必须声明该事件的委托类型。例如:
public delegate void BoilerLogHandler(string status);
然后,使⽤ event 关键字声明事件本⾝:
public event BoilerLogHandler BoilerEventLog;
6.C#常⽤类库writeline使用方法python
System.Collections
集合(Collection)类是专门⽤于数据存储和检索的类。常⽤的有:
集合类常⽤⽅法
动态数组ArrayList Add(item)、Clear()、Contains()、IndexOf()、Remove()、Sort()、Reverse()
哈希表Hashtable Add(key,value)、Clear()、Remove(key)、ContainsKey(key)、ContainsValue(value)
堆栈
Stack
Clear()、Contains()、Peek()、 Pop()、PushToArray()
队列Queue Clear()、Contains()、Dequeue()、Enqueue()、ToArray()、TrimToSize()
点阵列
BitArray
排序列表
SortedList
个⼈笔记型博客,仔细学习可移步或。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论