c#语言基础
一、简介
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/25473ce4ab75d5cfd55231ecf629ebd6.png)
.NET简介(dotnet),是Microsoft新一代多语言的开发平台
C#,是Microsoft专为.NET推出的高级编程语言
Mono是支持在其他操作系统下开发.NET程序的框架
CLS公共语言规范:定义了.NET平台上运行的语言所支持的规范,用以避免不同语言特性产生的错误,实现语言间互操作。
CLR公共语言运行库,负责内存分配、垃圾收集、安全检查等工作。
源代码(.cs的文本文件)——CLS(公共语言规范)编译——CIL中间语言(exe dll)——CLR(公共语言运行库)编译——机器码0 1
目的:跨语言 目的:优化 跨平台
2.功能补充
- 更换字体:菜单栏->工具->环境->字体和颜色
- 显示行号:文本编辑器->所有语言->行号
- 快捷键:ctrl+K+F语句自动对齐
ctrl+K+C注释选中的代码
ctrl+K+U取消注释 - 调试:排除能力的错误(查看程序运行时,各个变量的取值)
步骤:1.在可能出错的行加断点
2.按F5,启动调试
3.按F11,逐语句执行
4.按shift+F5,停止调试 - Exception指异常
- 运行:CTRL+f5
- 切换项目内部程序运行:解决方案右键-属性-通用属性-启动项目-当前选定内容
- 折叠代码:#region
#endregion - 代码对齐:CTRL+k+d
- 移动调整代码 调整一行:按住Alt键同时,按方向键上或下可以调整代码的顺序
二、写代码
.cs->生成exe->运行
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
正在使用xx命名空间【引入命名空间】
namespace Day01
定义命名空间【类的住址】
作用:对类进行逻辑上的划分,避免重名
class Program
定义类【做工具】
static void Main(string[] args)
定义主函数 主方法【做功能】
程序的主入口
Console.Title = “第一个程序”;
Console.Write();
作用:所有内容写在一行
Console.WriteLine(“你好,世界!”);
快捷键:cw+两次tab
//console控制台.写一行(“内容”)
//现象:在控制台中显示括号中的文本
//作用:将括号的文本写道控制台中,每次写一行
Console.ReadLine();
//console控制台.读一行()。如果没有,生成的exe不能读。
//现象:暂停程序,按回车继续
//作用:将用户在控制台中输入的文本读取到程序中
Console.ReadKey()
作用:暂停
Console是类,是一个工具。工具. WriteLine/ ReadLine,
“.”相当于包含
“WriteLine/ ReadLine”是方法/功能(动词)在vs中是个正方体标志,要写小括号
“Title”是属性/修饰(名词)在vs中是个扳手标志,不用写小括号
类.方法(); 调用语句【使用某个类中的功能】
三、变量
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e3a59047319bee46a74f7cbac94d57bc.png)
程序运行在内存中,c、d、e、f盘叫磁盘,程序处理的是数据。
1.变量是内存中开辟的一块用于存储数据的空间。
2.内置数据类型
容量单位:bit位/比特——放0/1,电脑记忆体中的最小单位
字节byte,电脑中存储的最小单位
1byte=8bit,1kb=1024byte,1MB=1024KB,1G=1024MB
在vs中打int,选中int,按f12可以查看它的范围
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3fec3b314b99bcb2f61a2c8e67f94dd3.png)
整形/整数:1个字节:有符号sbyte,无符号byte(0-255)
2个字节:有符号short,无符号ushort
4个字节:有符号int(32位),无符号uint
8个字节:有符号long,无符号ulong
小数:4个字节:单精度浮点 类型float [倾向于unity]
8个字节:双精度浮点 类型double
16个字节:128位数据类型decimal
float写小数要加后缀f,如果不加默认为double。
浮点型运算会出现舍入误差:bool a=1.0f-0.9f==0.1f,二进制无法精准表示0.1f,可以用decimal
非数值型:char字符,2字节,存储单个字符,使用单引号
String字符串,存储文本,使用双引号
Bool类型,1字节,赋值true,false
值类型:int char bool double float 枚举 结构体
引用类型:string 类 接口 委托
3.语法
声明:在内存中开辟一块空间
变量类型 变量名;
命名规则:1.变量名由字母、数字、下划线和@组成,不能以数字开头。不能用保留关键字,即vs蓝色单词。
2.驼峰命名法:myNameIsQi
变量名以小写字母开头。如果包含多个单词,除第一个单词以外,后面的单词首字母大写。
3.定义名称要有意义,增加类型前缀便于理解。如:int intAge; string strAge;
4.在同一范围,变量不能重复定义
赋值:在该空间中存储数据
变量名=数据;
变量在使用前必须赋值
string gunName=“AK47”;
tring fullBulletNumber = “10”;
//方法一:在字符串中插入变量
Console.WriteLine(“枪的名称是:” + gunName + “,弹匣容量:” + fullBulletNumber );
//方法二:占位符{一个数字:位置的编号},代码可读性强
string str = string.Format(“枪的名称是:{0},弹匣容量:{1}”, gunName, fullBulletNumber);
Console.WriteLine(str);
//标准字符串格式化,以货币形式展示,在占位符后加”:c“,变成:¥10.00
Console.WriteLine(“金额:{0:c}”,10);
//限制位数用d,加2表示限制两位
Console.WriteLine("{0:d2}", 5);//05
Console.WriteLine("{0:d2}", 15);//15
//f是四舍五入,根据指定精度显示,f后的数字表示精度
Console.WriteLine("{0:f1}", 5.22);//5.2
Console.WriteLine("{0:f1}", 5.26);//5.3
//p是百分号,0表示小数点位数
Console.WriteLine("{0:p}", 0.1);//10.00%
Console.WriteLine("{0:p0}", 0.1);//10%
Console.WriteLine("{0:p1}", 0.1);//10.0%
//转义符\ 改变字符原始含义
Console.WriteLine(“我爱"unity”");
char a = ‘’’;//’
char b = ‘\0’;//空字符
string s = “”;//空字符串
//\r\n换行符,\t相当于tab
Console.WriteLine(“hello,\r\nworld\t!”);
四. 数据的基本运算
1. 赋值运算符:将右边结果复制给左边。
= += -= = /= %=
2.算数运算符:加+、减-、乘、除/、取余%
int n1 = 5, n2 = 2;
int num = n1 / n2;//截断删除 =2
float num = n1 / n2;//截断删除 =2.0
%作用:1.判断一个数字能否被另外一个数整除2.获取个位
3.关系运算符/比较运算符:判断数值间数值大小关系的符号。>、<、>=、<=、==、!=
4.逻辑运算符:判断bool值关系的符号。&&与、或||、非!
与:一假俱假;或:一真俱真
5.快捷运算符:+=、*=、/=、%=
6.根据操作数划分,运算符左边和右边的数字个数
一元运算符:++、–
++在前,先加再运算;++在后,先运算再加
无论是先加还是后加,对于下一条指令,都是自增以后的值
二元运算符:上面的基本都是二元,比如a=n1/n2; /两边有两个数字
7.三元运算符:数据类型 变量名=条件?满足条件结果:不满足条件结果
两个结果数据类型必须一致
8.优先级:先乘除 后加减 小括号优先级最高
9.隐式转换:由小范围到大范围的自动转换
byte b3 = 100;
int i3 = b3;
10.显式转换/强制转换:由大范围到小范围的强制转换。有可能发生精度的丢失,不会四舍五入
int i4 = 10;
byte b4 = (byte)i4;
隐式、显式通常发生在数值之间
由多种类型变量参与的运算,会自动向较大的类型提升
float和decimal不能相加,因为内存结构不一样,float是近似存储,decimal是精确的存储
int a = 1;
a = a + 3;
a += 3;
byte b = 1;
b += 3;//快捷运算符不做自动类型提升
b = (byte)(b + 3);//1个byte和1个数相加很容易超过byte表示的范围,所以会做自动提升
11.ToString 转换:任意类型转换为string类型
int number=18;
string str = number.ToString();
12.Parse转换:string转换为其他数据类型。待转数据必须“像”该数据类型。
string strNumber = “18”;
int num01 = int.Parse(strNumber);
float num02 = float.Parse(strNumber);
double num02 = double.Parse(strNumber);
五. 判断/选择语句
if (a == "+")
sum = num1 + num2;
else if (a == "-")
sum = num1 - num2;
else if (a == "*")
sum = num1 * num2;
else if (a == "/")
sum = num1 / num2;
else if (a == "%")
sum = num1 % num2;
else
Console.WriteLine("运算符错误");
switch(op)
{
case "+":
result = number1 + number2;
break;
case "-":
result = number1 - number2;
break;
default:
Result = 0;
break;
}
If else实现2、3路分支,switch case实现3路以上分支比较好。
//短路逻辑
int n1 = 1, n2 = 2;
//重点是看需不需要计算后面的自增
bool re1 = n1 > n2 && n1++ > 1;
Console.WriteLine(n1);//1
bool re2 = n1 < n2 && n2++ > 1;
Console.WriteLine(n2);//2
Foreach
foreach (var item in collection)
{
var 要循环访问中对象的集合类型
item 集合中元素标识符
collection 要循环访问的集合的名称
}
例:用类型或var都可以
string s = “abc”;
foreach (char/var item in s)
{
Console.WriteLine(item);
}
六. 循环语句
1 2 5 4 7
for(初始值;循环条件;增减变量)
{3 6
循环体
}
快捷键:for+2次tab键
while (条件)
七. 跳转语句
用于将控制转移到另一段代码。
continue:退出本次循环,执行下次循环
break:退出最近的的循环体或switch语句
while(true)
{
if(退出条件)
{
break;//满足条件则退出循环体
}
循环体
}
return:
有返回值的方法,写return,作用:返回数据
没有返回值的方法,写return,作用:退出方法
八. 方法/函数
各种语言都有方法的概念,有的语言称其为函数或者过程。
方法:对一系列语句的命名,表示一个功能或行为。
使用方法可以提高代码的可重用性和可维护性。
- 语法
定义方法:[访问可修饰符/访问级别][可选修饰符]返回值类型 方法名称(参数列表)
{
//方法体
return 结果;
}
访问可修饰符:public/private
可选修饰符:static
返回值类型:int string void…
调用方法:方法名称(参数)
方法名称/类名命名采用帕斯卡命名法:每个单词首字母均大写。MyNameIsQi
返回值类型void:没有返回值
方法的参数列表的参数称为形式参数,调用方法的参数称为实际参数。
实参与形参要一一对应(类型、数量、顺序)
九. 数据结构
包括:数组、链表、字典、队列栈
数组定义:数据类型[] 变量名称=new 数据类型[]; 中括号里是数值长度
定义方式:int[] nums = new int[6];//指定长度
int[] nums1 = { 1, 2, 3 ,4,5,6};//指定内容
int[] nums2 = new int[6] { 1, 2, 3, 4, 5, 6 };//指定长度和内容
int[] nums3 = new int[] { 1, 2, 3 };//不指定长度,可以后期添加
链表定义: List list = new List();
list.Add(10);//list添加元素
list.Add(52);
list.Add(63);
list.Count//集合长度
list[0] = 100;
list.Clear();//集合清空
list.Remove(list[0]);//移除某个元素
list.RemoveAt(0);//移除list中该索引的元素
字典定义:Dictionary<int, string> dic = new Dictionary<int, string>();
dic.Add(1, “abc”);//添加元素
dic.Add(3, “beihang”);
dic.Count//字典长度
dic[1] = “def”;//修改字典内容
foreach (var item in dic)//遍历字典
{
Console.WriteLine(item.Key+" "+item.Value);
}
foreach (var item in dic.Keys)//遍历序号
{
Console.WriteLine(item+" "+dic[item]);
}
dic.ContainsKey(2);//判断字典中是否有某个值,返回bool
十. 函数重载
构成重载的条件:方法名相同,参数列表不同,类型或个数不同
比如:同一个技能,需要不同的效果,就需要用函数重载
十一. Ref和out
ref:既进又出。可以从函数中计算后,从主函数中继续用
Out:只出不进。外面的值不能传递给函数
十二. 类
类是有共同特征的物体的统称
定义:访问修饰符 class 类名{字段,属性,方法}
类名命名采用帕斯卡命名法:每个单词首字母均大写。MyNameIsQi
在另一个类中调用时,main函数中初始化类
属性:get返回,set读取
This指当前类
构造函数:public 类名
十三. 面向对象
实例化:
封装:保护类 字段 方法
特征:get set
快速封装和重构快捷键:Ctrl+R+E
继承:父类和子类(基类和派生类)。
可以多继承 student:people,eat
多态:多种形态,是在继承的状态下,多个子类调用相同方法而表现的不同的行为
实现方式:1.虚方法:在父类的函数public后面加上virtual,在子类调用父类函数时,在public后面加上override,表示重写函数。但在调用时,仍是同一函数名
2. 抽象类:在父类的类名public后面加上abstract,在父类的函数public后面加上abstract,在子类调用父类函数时,在public后面加上override
实例化时,无法创建抽象类或接口函数的实例化,于是直接new 子类
或
3. 接口
定义:interface I+功能名称+able(代表功能性接口) { void 函数名称(); }
接口里不能有字段属性,也不能有访问修饰符
子类必须把功能实现
接口与接口之间不需要实现功能