Part 2. C#基础

终于看完了Unity3D基础,进入到编程的学习咯 ٩(๑>◡<๑)۶

.NET dotnet

  • Microsoft新一代多语言的开发平台,用于构建和运行应用程序。

C# csharp

  • Microsoft 专为.NET推出的高级编程语言。

mono

  • Novell公司支持在其他操作系统下开发.NET程序的框架

编程基础

选择代码段后:

  1. Ctrl + K + F - 自动对齐;
  2. Ctrl + K + C 注释选中代码段;
  3. 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;
  • 调试:排除错误的能力(查看程序运行时,各个变量的取值);
    • 步骤:
      1. 在可能出错的行加断点;
      2. 按 F5 启动调试;
      3. 按 F11 逐语句执行,鼠标可以放置在变量上看数值;
      4. 按 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,跨平台) → 机器码
  • %作用
    1. 判断一个数字能否被另外一个数字整除。
    2. 获取整数的个位
  • 一元运算
    1. 无论先加还是后加,对于【下一条指令】都是自增以后的值。
    2. 后加后自增,先返回值。先加先自增,后返回值。
  • 三元运算
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();
  • 学会调用别人提供的方法
    1. 看名字猜,看描述;
    2. 看参数(类型,名字,描述);
    3. 看返回值;
    4. 测试;
  • 在定义的方法前输入///编写注释!
  • 完成一个显示年历的小程序练习!
    程序在此!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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容