1.注释
单行注释 //
多行注释 /* */
快捷键 注释Ctrl+k Ctrl+c 取消注释Ctrl+k Ctrl+
2.变量:
整数类型:int 只能存储整数,不能存储小数
小数类型:double 既能存储整数,也能存储小数,小数点后面的位数 15~16位 float存储6~9位
浮点类型:decimal:decimal 类型具有更高的精度和更小的范围,用来存储货币,
bool类型:true真,或者 false假 判断对错
字符串类型:string,用来存储多个文本,也可以存储空,字符串类型的值需要被 双引号引来
字符类型:char,用来存储单个字符,最多、最少只能有一个字符,
带有 f 或 F 后缀的文本的类型为 float
带有 m 或 M 后缀的文本的类型为 decimal
=:表示赋值的意思,表示把等号右边的值,赋值给等号左边的变量。
3.输入输出
输出:Console.writeLine(内容);
输入:Consol.ReadLine();从控制台获取用户输入的数据;
4.转义字符
分为两种
第一种 \
\':表示单引号
\":表示十一号
\n:表示换行
\r:回车
\t:表示一个tab键的空格
\b:表示一个退格键,放到字符串的两边没有效果。
\f:换页
\b:退格
\:表示一个\
第二种 @
1、取消\在字符串中的转义作用,使其单纯的表示为一个" 例: @"C:\\temp" 就表示 C:\temp
2、将字符串按照编辑的原格式输出
5.类型转换
类型转换⽅法:
隐式类型转换 - 这些转换是 C# 默认的以安全⽅式进⾏的转换, 不会导致数据丢失。例如,从⼩的整数类型转换为⼤的整数类型,例如:double > int 小的转大的。
显式类型转换 - 显式类型转换,即强制类型转换。显式转换需要强制转换运算符,⽽且强制转换会造成数据丢失 两种类型相兼容 int–double;大的转成小的 double----int int a=50
Double b=(double)a;
6.运算符,条件语句
(1)、算述运算符 ++、–、+、-- ,*、/、%、
(2)、关系运算符 < <= > >= == !=
(3)、逻辑运算符 && 逻辑 与|| 逻辑或 !逻辑非 (4)、条件语句
If(条件){方法体}
If(条件){方法体}else{方法体}
if(条件){方法体}else if(条件){方法体}
小节 : ++:分为前++和后++,不管是前++还是后++,最终结果都是给这个变量加—;
7.switch分支语句可以用来代替简单的、拥有多个分枝的 if else语句
switch (表达式)
{
case 整型数值1: 语句 1;
case 整型数值2: 语句 2;
......
case 整型数值n: 语句 n;
default: 语句 n+1;
}
default:可以没有
8. for , while , do-while 循环语句 ,break,Continue
for( 表达式1; 表达式2; 表达式3)
{
语句;//"可以控制循环次数用于知道循环次数的循环"
}
while (表达式) //表达式为循环条件{
语句;
}
do{
循环体 //“先执行循环体内的内容,再对循环条件进行判断”
} while(表达式); //这里注意一定要加分号,
continue 跳出当前循环进行判断 条件符合继续循环 否则跳出循环
break一般不单独的使用,而是跟着if判断一起使用,表示,当满足某些条件的时候,就不再循环了。
9.数组,字符串
数组(Array)是一种用来存储同一种类型的集合、
int arr1[5] = {1,2,3,4,5};数组类型[] 数组名=new 数组类型[数组长度];索引不能超过下界 数组的长度一旦固定了,就不能再被改变了
null和“ ”空不一样 null没有开辟空间而空有
比较数组中的最大值最小值最好就是随便把数组内的一个值赋值给最大最小值 不要赋值为0
遍历:foreach(临时变量 in 需要遍历的数组){Console.write(需要遍历的数组 + “”)}
字符串操作的常用方法:
ToLower(); ToUpper(); Trim(); TrimStart(); TrimEnd(); Split()
10,方法(函数)的定义和调用
函数定义的一般形式: [public] static 返回值类型 方法名([参数列表]){方法体}
2.调用:
我们在Main()函数中,调用Test()函数,我们管Main()函数称之为调用者,
管Test()函数称之为被调用者。
如果被调用者想要得到调用者的值:传递参数。
3.重载
方法名字相同,参数不同
参数不同:个数相同 则类型不能相同,类型相同 则个数不能相同,函数重载与返回值没关系
4.递归函数
:所谓递归函数是指一个函数的函数体中直接调用或间接调用了该函数自身的函数。
5.枚举类型
定义用关键字enum标识,形式为:
enum 名字
{
枚举数据表(用“,”隔开)
};
enum是关键字,标识枚举类型。定义枚举类型必须用enum开头。
枚举数据表的值都是整数。第一个枚举成员的默认值为整形的0,后续枚举成员的值在前一个成员上加1。也可以人为设定枚举成员的值,从而自定义某个范围内的整数。
使用:
枚举类型名 变量名=枚举类型名.值1;
6.结构体
定义:struct 结构体名{
成员列表
};
把某一类型的变量进行整合,组合成一个新的数据类型
结构体中除了可以定义属性还可以定义函数
7.委托
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
面向对象
1.异常处理
在C#语言中异常与异常处理语句包括三种形式,即try catch、try finally、try catch finally。
try:用于检查发生的异常,并帮助发送任何可能的异常
catch:以控制权更大的方式处理错误,可以有多个catch子句
finally:无论是否引发了异常,finally的代码块都将被执行
2.类,对象
:具有相同特性(数据元素)和行为(功能)的对象的抽象就是类
类是对象的抽象,它用于描述一组对象的共同特征和行为。
对象是根据类创建的,一个类可以创建多个对象。
类名 对象名 = new 类名();
访问修饰符:
Public:公开的
Prive:私有的
3.构造函数
构造函数就是专门用来描述一类对象统一结构的函数,在反复创建多个相同结构对象时,都要先定义统一的构造函数,在使用构造函数反复创建对象
定义构造函数时,类型名的首字母要大写。用new调用构造函数,传入具体对象的属性值
构造函数(参数列表)
{
语句块;
}
4.值类型和引用类型
区别:
1)值类型和引用类型在内存上存储的地方不一样
2)在传递值类型和传递引用类型的时候,传递的方式不一样
值类型我们称之为值传递,引用类型我们称之为引用传递
值类型:int、double、bool、char、decimal、struct、enum
引用类型:string、自定义类、数组
5.继承
object类是所有类的父类,所有类都直接或者间接继承了object类
super注意点:
1.super调用父类的构造方法,必须在构造方法的第一个
2.super必须只能出现在子类的方法或者构造方法中
3.super和thi不能同时调用构造方法
vs this
代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的应用
前提
this:没有继承也才可以使用
super:只能在继承条件才能使用
构造方法
this();本类的构造
super();父类的构造
在子类中,我们可以使用this关键字访问本类成员,使用base关键字访问父类成员。
6.抽象类和密封类
如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类,在抽象类中声明方法时,如果加上abstract时就是抽象方法。
抽象类与非抽象类的主要区别:
①抽象类不能直接被实例化
②抽象类中可以包含抽象成员,但非抽象类中不可以。
③抽象类不能被密封。
抽象方法
在抽象类中也可以使用关键字abstract定义抽象方法,要求所有派生的非抽象类都要重载实现抽象方法,引入抽象方法的原因在于抽象类本身是一种抽象概念,有的方法并不需要具体实现,而是留下来让派生类重载实现。
注意点:备注:抽象方法必须声明在抽象类中,并且不能包含方法体。
①抽象方法必须声明在抽象类中
②声明抽象方法时,不能使用virtual、static和private修饰符。
③抽象方法声明引入一个新的方法,但是不提供具体的实现。
④当从抽象类中派生一个非抽象类时,需要在非抽象类中重写所有抽象类中的方法,提供具体实现细节,重写抽象方法时候使用override关键字。
密封类
密封类可以用来限制扩展性,如果密封了某个类,则其他类不能从该类继承;如果密封了某个成员,则派生类不能重写该成员的实现。
密封类的声明格式为:
访问修饰符 sealed class 类名:基类或接口
{
类体
}
说明:
①密封类不能作为基类被继承,但它可以继承别的类或接口。
②在密封类中不能声明受保护成员或虚成员,因为受保护成员只能从派生类进行访问,而虚成员只能在派生类中重写。
③由于密封类的不可继承性,密封类不能声明为抽象的,即sealed修饰符不能与abstract修饰符同时使用。
7.接口
【访问修饰符】 interface 接口名
{
}
接口是引用类型,类似于类。接口和抽象类的相似之处有三点:
①不能实例化
②包含为实现的方法声明。
③派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)
接口具有如下特性:
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而这些成员都被定义为公有的。除此之外,不能包含任何其他成员,例如常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。
接口与抽象类两者的区别
①抽象类可以有构造方法,接口中不能有构造方法。
②抽象类中可以有普通成员变量,接口中没有普通成员变量。
③抽象类中的出现方法的访问类型可以是public、protected,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
④抽象类中可以包含静态方法,接口中不能包含静态方法。
⑤一个类可以实现多个接口,但只能继承一个抽象类。
⑥抽象类实现的具体方法默认为虚方法,但实现接口的类中的接口方法却默认为非虚方法,当然用户也可以声明为虚方法。
8.List集合 创建List:
List<变量类型> 列表名=new List<变量类型>;
列表中插入数据:
列表名.Add(需要插入的数据);
遍历:
通过for循环进行遍历
或通过foreach进行遍历
9.泛型
ToString:
默认情况下用来输出这个类的完整路径;
重写后可以输出对象的数据;
1、泛型只存在于编译期间
2、泛型在语法中的特征就是尖括号
3、泛型的核心原理:利用Object引用可以指向任意类型的对象
4、使用泛型
A<Strirng> a = new A <> ();
B<Strirng,String> b = new B <> ();
C<Random,Strirng,Random,Scanner> c = new C <> ();