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)
域和属性的区别
区别 | 属性 | 域 |
---|---|---|
逻辑性 | 逻辑字段,在改变字段时 < br ztid="127" ow="0" oh="0"> 能改变对象的其他一些状态 | 不经过逻辑处理 |
存储性 | 不占用实际内存 | 占内存空间及位置 |
访问性 | 由 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# 常用类库
- System.Collections
集合 (Collection) 类是专门用于数据存储和检索的类. 常用的有:
集合类 | 常用方法 |
动态数组 < br ztid="188" ow="0" oh="0">ArrayList | Add(item)、Clear()、Contains()、IndexOf()、 Remove()、Sort()、Reverse() |
哈希表 < br ztid="194" ow="0" oh="0">Hashtable | Add(key,value)、Clear()、Remove(key)、 ContainsKey(key)、ContainsValue(value) |
堆栈 < br ztid="200" ow="0" oh="0">Stack | Clear()、Contains()、Peek()、 Pop()、PushToArray() |
队列 < br ztid="205" ow="0" oh="0">Queue | Clear()、Contains()、Dequeue()、 Enqueue()、ToArray()、TrimToSize() |
点阵列 < br ztid="211" ow="0" oh="0">BitArray | |
排序列表 < br ztid="216" ow="0" oh="0">SortedList | |
个人笔记型博客, 仔细学习可移步 C# 官方文档或菜鸟教程 - C# 教程 http://www.runoob.com/csharp/csharp-tutorial.html .
来源: https://www.cnblogs.com/mthz/p/unity0.html