PS:本系列笔记将会记录我此次在北京学习Unity开发的总体过程,方便后期写总结,笔记为日更。
笔记内容均为 自己理解,不保证每个都对。
C#笔记未按照难度排列
Part 1 面向对象编程类的定义
1、简介:
面向对象编程是一种强有效的编程方法,在最开始都是采用面向过程编程,但随着代码长度的变化,面向过程编程的重复利用率低,可维护性差,因此就有了面向对象编程,将长代码进行分割成为一个个小零件(类),提高了代码的重复利用率以及可维护性。
2、包含:
1、属性:描述性的,例如HP, EXP, SKILL等。
2、方法:动作性的,例如发动攻击,开始跑步等。
3、封装:让对象代码与其他对象无关。可拓展性,可维护性。
4、继承:派生类继承基类的部分属性和部分方法,提高代码的复用率。
5、多态:父类的指针指向子类,而调用子类的方法。提高代码的多样性。
3、类:
1、命名:权限 + class + 方法名
2、权限
3、Class表示抽象出一个类
4、Player为类名, 驼峰命名法 每个单词的首字母都大写
例如:
public class Player
{
//在本类的方法体内可以任意访问 类里静态或非静态的属性
//Static、Const:实例化后放在全局静态区内,只会实例化一次
//实例化时非Static、Const修饰的都会重新拷贝一份,Static、Const只会被实例化一次
private byte bloodCount; //血量 public byte bloodCount; //血量
protected int coinCount; //金币 本类和子类能访问
private int exp; //经验 本类能访问
public static byte level; //等级
public const bool sex = true; //性别
}
例如:
4、权限:
系统默认的权限是private
名字 | 权限 |
---|---|
Public | 在类外的任意地方都可以访问 |
Protected | 只能在类里或者子类里才能访问 |
Private | 只能在本类里访问,子类不能访问 |
Internal | 表示值在本程序集内使用 |
5、构造函数:
构造函数分为:无参构造函数、有参构造函数、静态构造函数 三种
系统自带一个无参构造函数
例如:
public Player() //无参构造函数
{
Console.WriteLine("Player的构造函数!!!");
}
public Player(int age) //有参构造函数
{
Console.WriteLine("Player的构造函数!!!");
}
//全局静态构造函数
//1、不能有参数
//2、不能被权限修饰
//3、优先级高于普通构造函数
//static修饰的静态构造函数、成员属性、方法
//1、在第一次涉及静态修饰的时候都会被同时调用
static Player() //静态构造方法必须无参
{
level = 50; //static修饰的可以互相访问
Console.WriteLine("Player的静态构造方法");
}
实例化使用:
Player tmpPlayerA = new Player();
6、方法: 功能
public void Attack(byte temp) //方法
{
//this 表示当前类的实例
this.bloodCount -= temp;
}
public void Debug()
{
Console.WriteLine("bloodCount == " + bloodCount);
Console.WriteLine("level == " + level);
}
set方法和get方法:
public byte BloodCount
{
get //访问器
{
Console.WriteLine("Get Success!!!");
//使用 没有赋值就是get方法
return bloodCount;
}
set //修改器
{
Console.WriteLine("Set Success!!!");
//赋值就是set方法
//value为等号右侧的值
bloodCount = value; //value为关键词
}
}
方法的使用:
tmpPlayerA.BloodCount = 100; //调用set方法
Console.WriteLine("PlayerA HP:" + tmpPlayerA.BloodCount); //调用get方法
tmpPlayerC.Attack(50); //调用Attack方法
tmpPlayerC.Debug(); //调用Debug方法
7、析构函数: 回收垃圾,自动调用 手动调用:System.GC.Collect();
//析构函数 ~ + 类名
//1、在类使用完的时候会释放
//2、系统自动调用
~Player()
{
Console.WriteLine("析构成功");
}
Part 2 访问属性的方法:
外部:
访问非静态 成员变量的方法:
1、直接访问 类.成员变量 player.bloodCoint = 10
2、get和set方法 public byte BloodCount { get set}
3、索引访问 public int this[int index] 类型可以更改,可以定义多个索引器
内部:
直接用变量的名字
This.变量的名字
外部:
访问静态 成员变量的方法:
1、类名.属性 Player.level
内部:
直接用变量的名字
This.变量的名字
索引访问:
//public表示外部可以访问
//int为返回类型
//this[int index]为方法 即为索引器
//索引器是一个特殊的set 和 get方法
public int this[int index]
{
get
{
Console.WriteLine("index == " + index);
if (index == 0)
{
return coinCount;
}
else
if(index == 1)
{
return level;
}
else
{
return 10;
}
}
set
{
if(index == 0)
{
coinCount = value;
}
else
if(index == 1)
{
level = 100;
}
else
{
Console.WriteLine("Something else");
}
}
}
索引方法的使用:
tmpPlayerD[0] = 500;
tmpPlayerD[1] = 400;
tmpPlayerD[2] = 300;
Part 3 注意项:
封装性:
1、一般不讲成员属性直接暴露在外面 例如 tmpPlayerB.bloodCount = 100;
2、提升代码的可维护性
Static和Const:
1、Static、Const:实例化后放在全局静态区内,只会实例化一次
2、实例化时非Static、Const修饰的都会重新拷贝一份,Static、Const只会被实例化一次
3、static修饰的静态构造函数、成员属性、方法,在第一次涉及静态修饰的时候都会被同时调用
例如:
Player player;
Console.WriteLine("player level == " + Player.level); //涉及static所以 同时调用static的构造函数
Readonly:只读属性
public readonly int age = 18;
//readonly只读属性,不能对其进行赋值
//可以在声明时赋值
//也可以在构造函数内赋值
//不能在其他的方赋值
全局方法:
1、能够访问全局变量或者全局方法
2、不能访问非全局的变量和方法
静态构造函数:
1、不能有参数
2、不能被权限修饰
3、优先级高于普通构造函数
4、只会调用一次
传参:
1、传参时尽量不要传入与成员变量相同名字的参数
2、使用 this.成员变量
3、在方法体内没有加this的变量,程序优先使用局部遍历即传进的参数