终于看完了Unity3D基础,进入到编程的学习咯 ٩(๑>◡<๑)۶
.NET dotnet
- Microsoft新一代多语言的开发平台,用于构建和运行应用程序。
C# csharp
- Microsoft 专为.NET推出的高级编程语言。
mono
- Novell公司支持在其他操作系统下开发.NET程序的框架
编程基础
选择代码段后:
- Ctrl + K + F - 自动对齐;
- Ctrl + K + C 注释选中代码段;
- Ctrl + K + U 取消注释。
- 变量命名:小写字母开头,除第一个单词外其他单词首字母大写,增加前缀便于理解。
//example
string strAge;
int intAge;
- 浮点数
二进制无法精确标识1/10,就像十进制无法精确标识1/3,所以二进制表示十进制会有一些舍入误差。对于精度较高的场合(如货币),可以使用decimal。
float num01 = 3.0f;
float num02 = 2.9f;
float result = num01 - num02;
bool b1 = result == 0.1f;
Console.WriteLine(b1);
//output : false
//example for decimal
decimal money = 100m;
- 调试:排除错误的能力(查看程序运行时,各个变量的取值);
-
步骤:
- 在可能出错的行加断点;
- 按 F5 启动调试;
- 按 F11 逐语句执行,鼠标可以放置在变量上看数值;
- 按 Shift + F5 停止调试。
-
步骤:
- 代码大纲功能
使用 #region 和 #endregion 关键字来定义可以展开和折叠的代码区域的开头和结尾。
//example
#region Using//名字
using System;
using System.Collections.Generic;
#endregion
- 一字不变的字符串@
//example_1
@"A short List:
item 1
item 2"
//example_2
"C:\\Temp\\MyDir\\MyFile.doc"
@"C:\Temp\MyDir\MyFile.doc"
- 占位符,字符串格式化
{0:c} //货币符号
{0:d2} //不足两位0补足
{0:f1} //指定精度四舍五入
{0:p} //百分数(2位精度)
{0:p0} // 百分数,不带小数
- 编译
源代码 cs. → CLS(公共语言规范)编译(goal:跨语言)→ 通用中间语言(exe dll)→ CLR(公共语言运行库)编译(goal: 优化optimize,跨平台) → 机器码 - %作用
- 判断一个数字能否被另外一个数字整除。
- 获取整数的个位
- 一元运算
- 无论先加还是后加,对于【下一条指令】都是自增以后的值。
- 后加后自增,先返回值。先加先自增,后返回值。
- 三元运算
string str = 1>2?"ok":"no";
- 格式转换
1.Parse(从语法上分析)转换: string 转换为其他数据类型
string str = "18";
int num = int.Parse(str); //18
float num02 = float.Parse(str); //18.0
2.任意类型转换为string类型
int num = 18;
string str = num.ToString();
- 学会调用别人提供的方法
- 看名字猜,看描述;
- 看参数(类型,名字,描述);
- 看返回值;
- 测试;
- 在定义的方法前输入///编写注释!
- 完成一个显示年历的小程序练习!
程序在此!YOYOYO! - foreach 从头到尾依次取出数组元素(只能读,不能改)
int[] array = { 1, 2, 3 }; //一维数组
foreach (int item in array)
{
Console.WriteLine(item);
}
- !!!!按Tab补全(好神奇,效率UP技能)
- var - 推断类型
var v1 = 2; √
var v1 = "hello"; √
Array arr = new int[2]; √
二维数组
int[,] array = new int[5,3]; //五行三列的二维数组
array.GetLength(0); //行,数字代表维度
array.GetLength(1); //列
- 交错数组
- 不属于多维数组!Getlength不能用;
//交错数组
int[][] array02;
//创建具有4个元素的交错数组
array02 = new int[4][];
//创建一维数组 赋值给 交错数组的第一个元素
array02[0] = new int[3];
array02[1] = new int[5];
array02[2] = new int[4];
array02[3] = new int[1];
//数据1赋值给交错数组的第一个元素的第一个元素
array02[0][0] = 1;
foreach(int[] array in array02)
{
foreach(int element in array)
{
Console.WriteLine(element);
}
}
for(int r = 0; r < array02.Length; r++)
{
for(int c=0; c < array02[r].Length ; c++)
{
Console.Write(array02[r][c[ + "\t");
}
Console.WriteLine();
}
- 函数传输数组,可用于当类型确定,个数不确定的情形;
参数
- params参数数组:
- 对于方法内部而言:就是个普通数组;
- 对于方法外部(调用者)而言: 可以传递数组, 可以传递一组数据类型相同的变量集合,可以不传递参数;
- 作用:简化调用者调用方法的代码;
private static void add(paramas int[] arr)
值参数:按值传递--传递实参变量存储的内容;
引用参数:按引用传递--传递实参变量自身的内存地址。作用:改变数据;
输出参数:按引用传递--传递实参变量自身的内存地址。区别1:方法内部必须为输出参数赋值;区别2:输出参数传递之前可以不赋值;作用:++可返回多个结果++;
private static void Fun1(ref int a) //ref = int*
{
a = 2; //通过指针改变堆中a的值
}
private static void Fun2(out int a) //输出参数加out
{
a = 2; //通过指针改变堆中a的值
}
main()
{
int a = 1;
Fun1(ref a);
int b;
Fun2(out b);
}
//TryParse方法,返回2个结果
//out:转换后的结果
//返回值:是否可以转换
int result;
bool re = int.TryParse("250+",out Parse);
字符串
避免拆装箱!
- 字符串池,字符串的不可变性;
- 可变字符串StringBuilder
- 优点:可以在原有空间修改字符串;
- 适用性:频繁对字符串操作;
StringBuilder builder = new StringBuilder();
//StringBuilder builder = new StringBuilder(10); 如果已知将要使用的大小
for (int i = 0;i<10;i++)
{
builder.Append(i);
}
string result = builder.ToString();
//不断改变字符串生成0123456789,不产生超多垃圾
- 字符串常用方法
- ToArray -- 创建一个数组
- Contains -- 比较序列是否包含指定的元素
- ToUpper -- 返回大写形式的副本
- Substring -- 返回子字符串
- Split -- 从指定字符处分割字符串,返回交错数组String[]
- Join --用指定字符将字符串String[]连起来
- Insert -- 指定位置插入一个string
- ToLower
- IndexOf -- 报告string中第一个指定char的索引
- Trim -- 移除所有前导空白和尾部空白字符
- Replace -- 返回一个新String,所有指定的char都替换为另一个
枚举
- 列举某种数据的所有取值;
- 作用:增强代码的可读性,限定取值;
- 默认int;
- 默认第一个值为0;默认每个加1
- 选择多个枚举值,用运算符|;条件:
- 任意多个枚举值做|运算的结果不能与其他枚举值相同(值以2的n次方递增);
- 定义枚举时使用[Flags]特性修饰(增强代码可读性,没有也可);
- 判断标志枚举是否包含指定枚举值,用运算符& 011 & 001 ==> 001
- 字符串转换成枚举
MoveDirection = (MoveDircetion)Enum.Parse(typeof(ParsonStyle),"Up")
- int ==>Enum
MoveDirection direc1 = (MoveDirection)2;
//显示转换
[Flags]
enum MoveDirection//:int
{
Up = 1;
Down = 2;
Left = 4;
Right = 8;
}
private static void Move(int[,] , MoveDirection direction)
switch(direction)
{
case MoveDirection.Up:
MoveUp(map);
break;
case MoveDirection.Down:
MoveDown(map);
break;
case MoveDirection.Left:
MoveLeft(map);
break;
case MoveDirection.Right:
MoveRight(map);
break;
}
类和对象
- 字段首字母小写,属性首字母大写!
- 如果不希望在类的外部被创建对象,就将构造函数私有化;
//构造函数
public Wife()
{
Console.WriteLine("创建对象就执行");
}
public Wife(string name):this() //调用无参数构造函数
{
this.name = name;//不执行属性代码块
}
public Wife(string name,int age):this(name) //调用一个参数的构造函数
{
Console.WriteLine("创建对象就执行");
//this.name = name;
this.Age = age; //执行属性代码块
}
class User
{
//字段
private strin loginId;
//属性
public string LoginId
{
get
{return this.loginId;}
set
{this.loginId = value;}
}
//自动属性 包含1个字段2个方法
//prop + Tab + Tab快捷键
public string Password{get;set;}
//构造函数
//方法
}
c#泛型集合
List<数据类型>
List<User> list02 = new List<User>(2);
list02.Add(new User()); //增加
list02.Insert(); //插入
list02.RemoveAt(); //删除某处
list02.Remove(); //删除
list02.Count; //个数
字典集合--根据?查找
方便找其中的某一个;
不适合全部读取;
Dictionary<string,User>dic = new Dictionary<string,User>;
dic.Add("01",new User());
User user01 = dic["01"];
继承
class Student:Person
{
}
- 子类不能用父类的private,可以用public,protect; 外部不能访问private,protect;
- 父类的引用指向子类的对象,只能使用父类成员;强制类型转换后可以使用;
- 静态成员变量属于类,类被加载时初始化,且只有一份(共享区域);static;通过类引用;
Student.Count;
//实例构造函数:提供创建对象的方式,初始化类的实例数据成员;
public Student()
{
}
- 实例成员变量属于对象,每个对象呗创建时初始化,每个对象一份;通过哦实例(对象)引用;
- 存在优先于对象,被所有对象共享,常驻内存;
stu01.InstanceCount;
//静态构造函数:初始化类的静态数据成员;
//执行时机:类加载时调用一次且仅一次;
static Student()
{
}
- 静态类
- 所有对象需要共享的数据;
- 在没有对象前就要访问成员;
- 工具类 e.g Math
结构体 struct
- 用于封装小型相关变量的值类型;与类语法相似,但结构属于值类型,类属于引用类型;
- 适用:表示点,颜色等轻量级对象;
- 不能初始化,除非被声明为const或static;
消除类游戏做法
- 逻辑控制 与显示(界面代码) 松散耦合 数据(位置)↓↓;
- MVC架构 --model,view,controller;
FINISH 2020-3-18