首页 > 代码库 > C#基础
C#基础
C#基础
.NET
.net是基于internet协议和标准之上的新平台提供了一套无缝链接和沟通的工具
1,平台环境是指开发和运行软件的环境,基于Internet协议和环境
2,它是微软一切技术和产品的总和。
.net framework是.net的核心,是一个集成在Windows中的组件,它提供了生成和运行.net应用程序的环境,主要有公共语言运行时和。net类库组成。
优点:统一的编程模式,基于开放的标准,高效而功能强大的集成开发环境。
CLS是Common Language Specification 公共(通用)语言规范,定义了所有.net语言应遵循的规则,确保可以生成于其他语言操作的应用程序。
FCL是Fromework Class Library 框架类库,提供了一组丰富的数据类型,包含基类库和扩展类库。
CLR 是 Common Language RunTime 公共语言运行时,管理内存,执行代码,代码安全验证,编译其他系统服务。
CTS 是Common Type System 公共类型系统,定义了.net平台的所有的数据类型以及这些类型需要遵循的标准,主要包含标准.net数据类型和准则集。
C#
C#是专门为.net设计的面向internet和企业级应用的新一代的编程语言,综合了目前所有高级语言的特点,是一种简洁优雅,类型安全,完全面向对象的语言。
MSIL 是Microsoft Intermediate Language 微软中间语言, 是将.NET代码转化为机器语言的一个中间过程。它是一种介于高级语言和基于Intel的汇编语言的伪汇编语言。当用户编译一个.NET程序时,编译器将源代码翻译成一组可以有效地转换为本机代码且独立于CPU的指令。当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码。由于公共语言运行库支持多种实时编译器,因此同一段msil代码可以被不同的编译器实时编译并运行在不同的结构上。
编译运行的过程:
C#语言-->公共语言规范(CLS)的编译器-->MSIL(中间语言或程序集)-->公共语言运行库(CLR)中的编译器-->操作系统执行的代码。
两次编译的过程:第一次是为了将不同的语言编译成中间语言形成程序集,第二次为了CLR针对不同的操作系统做优化。
转义符
变量的命名规则
① 由字母,数字,下划线组成,不能以数字开头
②不能使用关键字
③不能包含特殊意义的字符
简单数据类型
类型 大小
整型 sbyte 有符号2的8次方
byte 无符号2的8次方
short 有符号2的16次方
ushort 无符号2的16次方
int 有符号2的32次方
uint 无符号2的32次方
long 有符号2的64次方
ulong 无符号2的64次方
非整型 float float f=1.7f; 默认为小数加后缀f区分
double
decimal decimal d=1.7m; 默认为小数加后缀m区
字符类型 char 单个字符用单引号 如 cha a=‘a‘;
string
日期类型 datetime datetime date;
布尔类型 bool
i++与++i
i++ 先返回值在自增 返回增加之前的数
++i 先自增再返回 返回增加之后的数
运算符分类
(按操作符的数量):一元, 二元, 三元
(按功能划分):
①.算术运算符 + - * / % ++ --
②.比较运算符 > < >= <= == != 返回值为bool类型
③逻辑运算符 && || !
④赋值和快捷运算符 = += -= *= /= %=
常量
内容不会发生变化的值
使用const 声明
建议命名全部大写 如:const double PI=3.1415。
数据类型的转换
隐式转换(数值类型间转换):由小范围到大范围的数值类型转换,不会失败,不会精度丢失,一般发生在数值类型之间
显示转换(强制转换):存在风险,可能会丢失精度。
语法:新类型 名称=(待转类型)名称
byte b = 9; int i = b;//隐式转换 b = (byte)i;//强制转换
.net 默认不检查强制转换错误,使用checked代码块检测强制转换错误。
checked { //转换代码 }
parse将字符串转换成其他类型 。
int a = int.Parse("1");
double ss = int.Parse("1");
tostring()从其他类型转到字符串
Int a=9; string str=a.Tostring();
Convert转换,被称为万能转换
Int a=Convet.ToInt32("1");
方法
1、定义
方法就是对一系列语句的命名,减少代码重复。
每个方法都有一个名字和方法体。
大部分方法可以处理传入的数据并返回处理的结果。
方法体没有大小。
2、语法
3、调用语句
方法名称(参数)
方法名必须与声明的一致
参数列表是可选的信息
不管参数列表有没有参数,都要有括号
4、Return语句
Return后面的语句不再执行。
如果方法有返回值,方法体中必须有return语句;没有返回值,有没有都可以。
Return关键字后必须返回相同类型的数据。
5、确定函数参数的原则:自己能确定的数据自己内部解决,自己确定不了的数据通过参数传递。
6、方法尽可能小,以便完成一个独立的工作,不要有与用户交互的代码。
7、如果方法需要信息(定义了参数),则必须传入参数
8、可以调用同一个类或者其他类中的方法;方法也可以调用其他方法。
参数
声明方法的参数,必须指定每个参数的类型和名称。
定义方法时声明的参数叫做形式参数,而在实际调用时传递给方法的参数叫做实际参数。调用方法时,参数类型和个数必须相同,但参数名可以不同。
1、值参数
方法默认值传递,传递的是变量的副本。
值类型参数传递给方法时,传递的是数据的副本而不是数据本身。
方法内部对形式参数的修改,不会影响方法外的实际参数。
2、引用参数
将引用类型的对象传递给方法时,引用类型的变量不直接包含其数据;它包含的是对其数据的引用(地址),即引用指向原始对象而不是副本。ref是关键字。
方法内修改形式参数,会影响实际参数。
在方法中修改外面已有变量时使用,更侧重于改变一个。
3、输出参数
Out关键字会导致参数通过引用来传递。这与ref关键字类似。若要使用out参数,方法定义和调用方法都必须使用out关键字。
侧重于输出一个值。
4、区别
Ref要求变量必须在传递前进行初始化(赋初值)。而作为out参数传递的变量不必在传递之前进行初始化,但是在离开方法之前,必须为变量赋值,有赋值操作。
5、用途
方法需要返回多个值时使用。
6、TryParse
? 通过Bool表达式配合TryParse使用,防止类型转换失败。
? 语法: TryParse(待转字符串,out 转出的变量名)
7、方法重载
方法签名:方法的名称、参数的类型及参数的修饰符(out/ref)可以构成有效的签名,每个方法的签名在同一个类中必须唯一。
方法重载:在同一个作用域中,两个方法的名称相同,但方法签名不同称为方法重载(OverLoad)。用来解决同一类型的问题。[out与ref的区别不可以构成]
8、递归方法
递归过程是指调用自身的过程。
必须考虑递归结束的条件。
例:计算阶乘
引申:6!是6*5!
选择语句
If语句
If(bool表达式)
{
//表达式为真,执行
}
else
{
//表达式为假执行
}
C#规定,每个else部分分总属于前面最近的那个缺少对应的else部分的if语句。
注意:Else可有可无;
单行语句可以不写{},但是提倡单行也要写;
If条件后不能加分号;
Switch-case语句
多路判断语句
?计算条件表达式并对照多个常数值进行检查
1、注意
l Break不能少
l Switch()中的变量可以是int、string、bool、char、枚举类型,
但必须有一个定值。
l 每个case标签后是常量表达式的值,不必连续,也不必按特定顺序排列,但不能相同,否则会出现错误。
每个case标签之后的语句数不限,有多个语句,也可以不用{}。
l default标签可选。意思是其余的结果。
2、区别
?相同点:都可以用来实现多路分支。
?不同点
多重if结构用来实现两路、三路分支比较方便。
Switch结构实现三路以上分支比较方便。
If结构用来判断一个值是否在某个区间的情况。
在使用switch时,case语句后面必须是常量表达式
循环语句
For语句
要求只在对特点条件进行判断后才允许执行循环,用于将某个语句或语句块重复执行预定次数的情形。
For(初始值;条件;增减变量)
{
…………
}
?首先赋初值,只执行一次。
?判断条件表达式是否满足,如果是执行{}内语句,如果不是,退出循环。
?每次执行完循环体内的语句都要执行增减变量。
?break用于退出循环
?continue用于跳出当前循环并开始本for的下一次循环。
?可以有死循环for(;;)
While语句
While(条件true)
{
//退出条件
//语句
}
?执行一个语句或语句块,直到指定的表达式计算为false退出循环。
?先判断表达式是否满足条件,是,执行语句;否,退出。
?大多数情况下,while语句可以和for语句互换,while常用语计算次数不确定的情形。
例子:用户输入考试分数,直到按q退出,否则一直提示输入
Do While语句
Do
{
//循环体
}
While(条件)
?重复执行{}内的语句,直到指定的表达式为false退出。
?与while区别:循环体至少执行一次
例子:乘法表
for (int i = 0; i <= 9; i++) { for (int j = 1; j <= i; j++) { Console.Write("{0}*{1}={2}",i,j,i*j); Console.Write("\t"); } Console.Write("\n"); }
数组
? 定义:存放一组类型相同的变量,是一种数据结构。
? 这些变量都可以通过计算索引(位置)进行访问。
数组属性
? 数组的索引从零开始,具有n个元素(变量)的数组的索引时从0到n-1(因为从0开始).
? 数组元素可以使任何类型,包括数组类型(数组嵌套)。
?数组类型是从抽象基类型Array派生的引用类型。
?可以对c#中的所有数组使用foreach遍历。
数组类型
一维数组
多维数组(有行还有列或者高)
交错数组
声明赋值数组的语法
●数组声明后必须赋值才能使用。
●访问数组,通过索引,使用for、foreach循环遍历。
●For循环可以读取、设置元素值,不必访问所有元素。
●循环遍历的方法:foreach和for
Foreach循环,不能对元素赋值,按顺序依次遍历,不能跳跃,拿不到索引。
数组常用方法及属性
1、 Length 长度
获取32位整数,该整数表示Array的所有维数中元素的总值。
语法:数组名称.Length
2、 Rank 维度
获取Array的维数。
语法:数组名称.Rank
3、 Array.Clear()清除元素值
将数组中的元素设置为0、null或fasle,具体取决于数组元素的数据类型。
语法:Array.Clear(被清除坐标数组名称,起始坐标,结束坐标)
4、 Array.copy 复制
将一个数组的一部分元素复制到另一个数组中,从索引0开始复制一定长度的元素。
语法:Array.Copy(被复制的数组名,复制到的数组名, 元素个数);
5、 CopyTo复制
将源数组元素内容复制到目标数组,从目标数组的某个索引处开始到结束复制,目标数组长度必须大于等于源数组长度。
语法:源数组名称.CopyTo(目标数组名,目标数组开始复制的元素位置)
注意:目标数组长度必须大于源数组;
从设定的起始元素起替换目标数组元素,目标数组大于源数组的的内容将保留
6、 Clone 克隆
克隆是将已知数组复制给新定义的数组,所以需要声明新数组用于接收;
克隆必须进行强制转换,即:(数组类型[])
语法:新定义的数组=(数组类型[])目标数组名.Clone();
7、 Array.IndexOf()正向查找第一个匹配项的索引(元素位置)
Array.LastIndexOf()反向查找第一个匹配项的索引
返回一对数组或部分数组中某个值第一个匹配项的索引,找不到返回-1。
语法:Array.IndexOf(数组名称,元素)
8、Array.Sort()排序
语法:Array.Sort(数组名称)
9、Array.Reverse()反转
反转数组中元素的顺序
语法:Array.Reverse(需要反转的数组名称)
冒泡排序
int[] number = {2,8,6,1,3 }; for (int i = 0; i < number.Length-1; i++) { for (int j = 0; j < number.Length-i-1; j++) { int temp = 0; if (number[j] > number[j + 1]) { temp = number[j]; number[j] = number[j + 1]; number[j + 1] = temp; } } }
二维数组
●二维数组就像具有行和列的表格。
●二维数组具有两个索引,分别代表行(前面)、列(后面)。
●int[,] score=new int[5,2];
声明初始化赋值
交错数组
●交错数组就是元素为数组的数组(数组的嵌套)。
●交错数组元素大小可以不同(元素就是数组,指的是交错数组中的数组大小可以不同)。
●声明一个由5个元素组成的一维数组,其中每个元素都是一个一维整数数组。
●Int[][] score =new int [5][] 5为外围数组(行) []为内在数组
Params参数数组
●通过关键字params定义参数数组
●用于方法参数不固定的场合
●可以传递数组,也可以传递类型相同的多个变量。
作用
●在对数组长度未知(可变)的情况下进行函数声明。
注意
●数量不限。
●参数数组必须是方法声明中的最后一个参数。
●方法最多只能有一个参数数组。
●只能在一维数组上使用params关键字。
●Console.WriteLine中使用占位符,就是使用参数数组实现的。
数据类型
值类型
●直接存储值。(数据存储在栈中)
●一个值类型变量赋给另一个值类型变量时,会复制一个数据副本给它(在栈中产生2个数据)。
●改变值类型不影响其他数值。(因为是2个数据,互不影响)
引用类型
●存储对数据的引用地址。(变量定义在栈中,而数据实际存储在堆中,数据只是引用到变量)
●赋值时只复制对对象的引用地址,而不复制对象本身。(实际数据只有一份)
●两个引用类型的变量可以指向同一对象。
●改变一个引用类型的变量可能会影响其他对象。(因为是一份数据)
String类型
●String是特殊的引用类型,外在表现类似于值类型。(因为引用类型存在堆中,可以存大量内容,所以string定义为引用类型)
●String再赋值后(s1=“二毛”),不会影响s1的值。但是原数据就会是垃圾。
●String赋值后的值,是不可以改变的(所以才会产生垃圾)。
●可变字符字符串:stringBuilder
比较值类型
在做==和!= 比较时,比较的是存储的数值(真实数据)。
比较引用类型
在做=和!= 比较时,比较的是引用的位置是不是同一个,而不是所引用的值。
枚举类型
●枚举意义在于限定变量的取值范围。
●用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。
●enum关键字用于声明枚举。
●语法:enum名字{值1,值2,值3,值4}
●在方法外声明枚举。
●每个枚举元素都是有枚举值。默认情况下,第一个枚举的值为0,后面每个枚举的值一次递增1,可以修改值,后面的枚举数的值一次递增。
●枚举元素默认基础类型为int,准许使用的枚举类型有byte、sbyte、short、ushort、int、uint、long或ulong。
结构
●是值类型,用来封装小型相关变量组(变量类型可以不一样)
●内存访问的开销较小
●类是引用类型,有些类仅仅包含很少的数据,它使用的堆的代价就有点不成比例了。
字符串操作
属性
●使用s.Length属性来获得字符串中的字符个数。
●字符串的内容一旦声明就不可变。所以只能读取,不能修改。
●如要修改字符串内容,先创建一个新的字符串,用s.ToArray()方法得到字符串的char数组,对数组进行修改后再调用new string(char[])这个构造函数来创建char数组的字符串。一旦字符串被创建,那么char数组的修改也不会造成字符串的改变。
●StringBuilder可变字符串。
1、字符串反转:“我要学习”
stringstr = "我要学习";
char[] toChar = str.ToArray();
Array.Reverse(toChar);
stringtoStrint = newstring(toChar);
Console.WriteLine(toStrint);
2、单词反转:I want to learn
stringstr = "I want to learning";
string[] toArry= str.Split(‘ ‘);
Array.Reverse(toArry);
stringtoString=string.Join(" ", toArry);
Console.WriteLine(toString);
装箱和拆箱
装箱;将值类型转换成引用类型 装箱容易拆箱难
拆箱;将引用类型转换成值类型
C#基础