目录
C#简介
C#是一个简单的,现代的,通用的,面向对象的编程语言,它是由微软(Microsoft)开发的。C#在很多Web应用程序、桌面应用程序也有广泛的应用,很多应用场景是在公司内部管理、专用软件、教育医疗、工控系统等等。
C#程序结构
一个C#程序主要包含以下部分:
1、命名空间(Namespace declaration)
2、一个类
3、类方法
4、类属性
5、一个Main方法
6、语句(Statement)& 表达式(Expressions)
7、注释
创建一个控制台程序(就是所谓的黑窗口)来显示“HelloWorld”
步骤:新建项目->选择 Visual C#->控制台应用程序->在main方法中添加代码。
具体代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
/*我的第一个C#程序*/
Console.WriteLine("hello world");
Console.ReadKey();
}
}
}
程序各部分解析
1、程序的第一行using System;using关键字用于在程序中包含System的命名空间。一个程序可以有多个using,即包含多个命令空间(和C语言中的#include< stido.h> 用处相似)
下一行是namespace声明。一个namespace里面包含了一系列的类。HelloWorld命名空间包含了类Program。
下一行是类声明。 类Program包含了程序使用的数据和方法声明。类一般包含多个方法,方法定义了类的行为。在这里Program类只有一个方法Main。
下一行定义了Main方法,是所有C#程序的入口点。Main方法说明当执行时,类将做什么动作。
下一行/…/是注释,将会被编译器忽略。
Main方法通过语句**Console.WriteLine(“hello world”); 指定了它的行为。
WriteLine是一个定义在System命名空间中的Console类的一个方法。该语句会在屏
幕上显示信息“hello World”。
最后一行Console.ReadKey(); 是针对VS.NET用户的。这使得程序会等待一个按键
的动作,防止程序从Visual Studio .NET启动时屏幕会快速运行并关闭。
C#基本语法
C# 注释符
1、注销代码
2、解释代码
②C#具有3种注释符
单行注释 //
多行注释 /*要注释的内容*/
文档注释 /// 多用来解释类或方法
C# 变量(Variable)
变量用来在计算机当中存储数据
变量数据类型 变量名;//声明或者定义某个数据类型的变量
变量名 = 值;//给这个变量进行赋值
变量数据类型 变量名 = 值;//声明并且给变量赋值的简写形式
注:=在这里并不是表示等于而是表示赋值
③ 变量的基本数据类型
整数类型:int 只能存储整数,不能存储小数
小数类型:double 既能存储整数,也能存储小数,小数点后的位数 15~16位。
金钱类型:decimal 用来存储金钱,值后面需要加一个m。
字符串类型:string 用来存储多个文本,也可以存储空,字符串类型的值需被双引号引用。
字符类型:char 用来存储单个字符,最多、最少只能存储一个字符,不能存储空,字符类型的值需被 单引号引用。
布尔类型:bool类型用来描述对或错。bool类型的值只有true和false两个值。
④ 变量的使用规则
如果你要是用变量的话,应该先声明再赋值最后使用。
⑤ 变量的命名
首先要保证的就是这个变量的名字要有意义。
1、必须以“字母”、“_”、“@”开头。(后两个具有特殊意义)
2、后面可以跟任意“字母”、数字、下划线,不能有特殊符号
3、以下划线“_”的变量用于结构中的字段、类中的字段。
注意
1、你起的变量名不能与C#系统中的关键字重复。
2、在C#中,大小写是敏感的。如Show跟show是不一样的
3、同一个变量名在相同的作用域下不允许重复定义
4、给变量起名字的时候要规范。(每个公司要求都不一样)
命名规范:要求变量的字母是类型的简写,然后每个单词的首字母都要大写,其余字母小写。
⑥ 变量的作用域
1、变量的作用域就是你能够使用到这个变量的范围。
2、变量的作用域一般从声明它的那个括号开始到那个括号所对应的结束的括号结束。
3、在这个范围内,我们可以访问并使用变量。超出这个范围就访问不到了。
C# 运算符
由XX运算符连接的表达式称为XX表达式。如:由算术运算符连接的表达式称为算术表达式。
赋值运算符中最常见的是等号,除了等号以外还有很多赋值运算符,它们通常都是与其他运算符连用起到简化操作的作用。
运算符 | 说明 |
= | x = y,等号右边的值赋值给等号左边的变量,即把变量 y 的值赋给变量 x |
注意:每个表达式我们都可以求解出一个定义,对于赋值表达式而言,等号左边的变量的值,就是整个赋值表达式的值。
复合赋值运算符
运算符 | 说明 |
+= | x+=y,等同于 x=x+y |
-= | x-=y,等同于 x=x-y |
*= | x*=y,等同于 x=x*y |
/= | x/=y,等同于 x=x/y |
%= | x%=y,等同于 x=x%y |
注意:当+号两边有一边是字符串的时候,+号就起到连接的作用。两边都是数字的时候,+号就起到相加的作用
② 算术运算符
运算符 | 说明 |
+ | 对两个操作数做加法运算 |
- | 对两个操作数做减法运算 |
* | 对两个操作数做乘法运算 |
/ | 对两个操作数做除法运算 |
% | 对两个操作数做取余运算 |
++ x ++ 或 ++ x,等同于x = x + 1
-- x -- 或 -- x,等同于x = x - 1
需要注意的是,++ 和 -- 运算符放在操作数前和操作数后是有区别的,如果放在操作数前,需要先将操作数加 1 或减 1,然后再与其他操作数进行运算;如果放在操作数后,需要先与其他操作数进行运算,然后操作数自身再加 1。
前加加减减示例a = 2,b = ++a + 3⟶ a += 1, b = 3 + 3
后加加减减示例a = 2,b = a++ + 3⟶ b = 2 + 3, a += 1
对于像++、--这样只需要一个操作数就能够完成运算的符号,我们称为一元运算符。
对于+、-、*、/、%这样需要两个或以上才能完成运算的操作符,我们称为二元运算符。
一元运算符的优先级要高于二元运算符。
如果在一个表达式当中,既有一元运算符,又有二元运算符,我们首先计算一元运算符。
③ 关系运算符
关系运算符也称比较运算符,是用来描述两个事物之间的关系
关系表达式的结果是bool类型
运算符 | 说明 |
== | 表示两边表达式运算的结果相等,注意是两个等号 |
!= | 表示两边表达式运算的结果不相等 |
> | 表示左边表达式的值大于右边表达式的值 |
< | 表示左边表达式的值小于右边表达式的值 |
>= | 表示左边表达式的值大于等于右边表达式的值 |
<= | 表示左边表达式的值小于等于右边表达式的值 |
④ 逻辑运算符
在使用逻辑运算符时需要注意逻辑运算符两边的表达式以及返回的结果都是布尔类型的
运算符 | 含义 | 说明 |
&& | 逻辑与 | 如果运算符两边都为 True,则整个表达式为 True,否则为 False;如果左边操作数为 False,则不对右边表达式进行计算,相当于“且”的含义 |
|| | 逻辑或 | 如果运算符两边有一个或两个为 True,整个表达式为 True,否则为 False;如果左边为 True,则不对右边表达式进行计算,相当于“或”的含义 |
! | 逻辑非 | 表示和原来的逻辑相反的逻辑 |
注:逻辑与的优先级要高于逻辑或
⑤ 三元运算符
if-else的简化写法
语法 表达式1?表达式2:表达式3;
如果表达式1可以计算出true,那么表达式2的值就是整个三元表达式的值
如果表达式1可以计算出false,那么表达式3的值就是整个三元表达式的值
注意:表达式2的结果类型必须跟表达式3的结果类型一致,并且也要跟整个三元表达式的结果类型一致。
⑥ C# 占位符
使用方法:先挖个坑,再填个坑;挖坑就是“,”后变量的个数,填坑就是占位符的使用。从0开始依次递增。
注:
你挖了几个坑,就应该填几个坑。如果你多填了,没效果;如果你少填了,抛异常。
输出顺序:按照挖坑的顺序输出
如: Console.WriteLine("第一个数字是{0},第二个数字是{1},第三个数字是{2}", n1, n2, n3);其中{0}就是一个占位符,一般多用于数据的类型转换和拼接。
⑦ C#转义符
转义符指的就是一个’ \ '加一个特殊的字符,组成了一个具有特殊意义的字符
转义字符 | 等价字符 |
\' | 单引号 |
\" | 双引号 |
\\ | 反斜杠 |
\0 | 空 |
\a | 警告(产生鸣笛音) |
\b | 退格(放在字符串两边没有效果) |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
⑧ @符号
取消\在字符串中的转义作用,使其单纯的表示为一个\
将字符串按照原格式输出
如:
加@符号不会报错:Console.WriteLine(@"今天天气好清凉
处处好风光");
不加@符号会报错:Console.WriteLine("今天天气好清凉
处处好风光");
C# 类型转换
我们要求等号两边参与运算的操作数的类型必须一致,如果不一致,满足下列条件会发生自动类型转化,称之为隐式类型转换,也叫自动类型转换。
满足下面两个条件才能发生隐式类型转换
两种类型相兼容。例如:int和double兼容(都是数字类型)
目标类型大于源类型。例如:double > int
② 显式类型转换(强制类型转换)
满足下面两个条件才能发生显式类型转换
两种类型相兼容。例如:int和double兼容
目标类型小于源类型。例如:int < double
③ Convert类型转换
两者不兼容的时候。例如:string和double、int不兼容。
面上必须要过得去。
比如字符串"123"看起来就能够转成int类型,而字符串"abc"看起来就不能转成int类型。
使用Convert进行转换,成功了就是成功了,失败了就抛异常。
④ TryParse类型转换
Convert底层就是使用Parse,所以Parse也会抛异常,而TryParse转化失败不会抛异常
ToString类型转换
所有类型都能够转换成string类型
C# 结构划分
1、顺序结构:程序从Main函数进入,从上到下一行一行的执行,不会落下任何一行。
2、选择结构:if、if-else、if-else-if、switch-case
3、循环结构:while、do-while、for、foreach
1、if 语句
语法:
if(判断条件)
{
代码块;
}
判断条件:一般为关系表达式或者bool类型的值亦或是bool类型的变量。
执行过程:当判断条件为 True 时执行代码块中的内容,否则不执行并跳出if-else结构。
if结构的特点:先判断再执行,最多执行一条代码。
作用:用于一种情况的判断
2、if-else 语句
语法:
if (判断条件)
{
代码块1;
}
else
{
代码块2;
}
判断条件:一般为关系表达式或者bool类型的值亦或是bool类型的变量。
执行过程:上面语句的执行过程是当 if 中的布尔表达式的结果为 True 时执行代码块1,否则执行代码块2。代码块1或者2执行完之后,就跳出if-else结构。
if-else结构的特点:先判断再执行,最少执行一条代码。else永远只跟离它最近的那个if配对。
作用:用于两种情况的判断
3、if-else-if 语句
语法
if (判断条件1)
{
代码块1;
}
else if (判断条件2)
{
代码块2;
}
...
else
{
代码块n;
}
判断条件:一般为关系表达式或者bool类型的值亦或是bool类型的变量。
执行过程:先判断条件1 的值是否为 True,如果为 True,执行代码块 1,整个语句结束,否则依次判断每个判断条件的值,如果都不为 True,执行else语句中的语句块 n。
作用:用于处理多种情况的区间判断
注意:在上面的语法中最后一个 else{} 语句是可以省略的。如果省略了 else{} 语句,那么多分支的 if 语句中如果没有判断语句的值为 True 的语句,则不会执行任何语句块。
4、switch-case 语句
语法
switch(变量或者表达式的值)
{
case 值1:要执行的代码;
break;
case 值2:要执行的代码;;
break;
case 值3:要执行的代码;
break;
......
default:要执行的代码;
break;
}
执行过程:程序执行到switch处,首先将括号中变量或者表达式的值计算出来,
然后拿着这个值依次跟每个case后面所带的值进行匹配,一旦匹配成功,则执行该case所带的代码,执行完成后,遇到break,跳出switch-case结构。
如果跟每个case所带的值都不匹配,就看当前这个switch-case结构中是否存在default,如果有default,则执行default中的语句,如果没有default,则该switch-case结构什么都不做。
作用:用来处理多条件的定值判断。只不过switch-case能够处理的,if-else也能够处理
注意:变量或者表达式的值不能是字符串,且一个case必须匹配一个break,不然逻辑上会接着执行下一个,导致结果跟预期不一样,但是编译器并不会报警。
1、while 循环
语法
while (循环条件)
{
循环体;
}
执行过程: 程序运行到while处, 首先判断while所带的小括号内的循环条件是否成立,
如果成立的话, 也就是返回一个true, 则执行循环体, 执行完一遍循环体后, 再次回到
循环条件进行判断, 如果依然成立, 则继续执行循环体, 如果不成立, 则跳出while循环。
在while循环当中, 一般总会有那么一行代码, 能够改变循环条件, 使之终有一天不再成立,
如果没有那么一行代码能够改变循环条件, 也就是循环条件永远都成立, 我们称之这种循环叫做死循环。
特点:先判断,再执行,有可能一遍循环都不执行
2、do-while循环
语法
do
{
循环体;
}while(循环条件)
执行过程: 程序首先会执行do中的循环体, 执行完成后, 去判断do-while循环的循环条件, 如果成立, 则继续执行do中的循环体, 如果不成立, 则跳出do-while循环。
特点: 先循环, 再判断, 最少执行一遍循环体。
3、for 循环
语法
for(表达式 1; 表达式 2; 表达式3)
{
循环体;
}
表达式1一般为声明循环变量,记录循环的次数 (int i=0;)
表达式2一般为循环条件 (i<10)
表达式3一般为改变循环条件的代码,使循环条件终有一天不再成立 (i++)。
执行过程:程序首先执行表达式1,声明了一个循环变量用来记录循环的次数,
然后执行表达式2 , 判断循环条件是否成立,如果表达式 2 返回的结果为true,
则执行循环体:当执行完循环体后,执行表达式3,然后执行表达式 2 继续判断循环条件是否成立,
如果成立则继续执行循环体,如果不成立,则跳出for循环。
C# 关键字
void关键字: 用作方法的返回类型,指定不返回值。
const关键字: 指定字段或局部变量的值是常数,不能被修改。
as关键字: 转换操作符,若转换失败返回null。
private关键字: 访问修饰符,是允许访问的最低访问级别。
public关键字: 访问修饰符,是允许访问的最高访问级别。
internal关键字:访问修饰符,允许在同一程序集的文件中内部类型和成员可以访问。
protected关键字:访问修饰符,允许在其所在类中可由派生类访问。
try关键字:异常处理代码块的组成部分,包括可能会抛出异常的代码。
catch关键字:定义一个代码块,在特定类型异常抛出时,执行块内代码。
base关键字:用于访问被派生类或构造中的同名成员隐藏的基类成员。
abstract关键字:标识一个可以扩展但不能被实体化的、必须被实现的类或方法。
delegate关键字:指定一个声明为一种委托类型,委托把方法封装为可调用实体,能在委托实体中调用。
event关键字:声明一个全新的事件。允许一个类或对象提供通知的成员,必须是委托类型。
checked关键字:确保编译器运行时,检查整数类型操作或转换时出现的溢出。
unchecked关键字:禁止溢出检查。
enum关键字:枚举类型,特殊的值类型。
goto关键字:跳转语句,将程序执行重定向到一个标签语句。
foreach关键字:遍历。
namespace关键字:定义一个逻辑组的类型和命名空间。
ref关键字:标识一个参数值可能会受影响的参数。
struct关键字:可以声明值类型。
throw关键字:抛出异常。
typeof关键字:操作符,返回传入参数的类型。
virtual关键字:标识可被覆载的方法。
using关键字:用于命名空间时,允许访问该命名空间中的类型而无需指定其全名。
static关键字:声明静态变量或静态函数。
extern关键字:声明在外部实现的方法。
object关键字:所有类型都是直接或间接从Object继承的,可以将任何类型的值赋给object类型的变量。
volatile关键字:标识一个可被操作系统、某些硬件设备或并发线程修改的attribute。
readonly关键字:标识一个变量的值在初始化后不可修改。
params关键字:声明一个参数数组。
operator关键字:声明或多载一个操作符。
interface关键字:将一个声明指定为接口类型,即实现类或构造必须遵循的合同。
out关键字:标识一个参数值会受影响的参数,但在传入方法时,该参数无需先初始化。
sizeof关键字:操作符,以byte为单位返回一个值类型的长度。
stackalloc关键字:返回在堆上分配的一个内存块的指针。
sealed关键字:防止类型被派生,防止方法和property被覆载。在声明中使用可以防止该类被其他类继承。
unsafe关键字:标注包含指针操作的代码块、方法或类。
override关键字:在派生类中声明对虚方法的重载。
implicit关键字:定义一个用户定义的转换操作符。通常用来将预定义类型转换为用户定义类型或反向操作。隐式转换操作符必须在转换时使用。
explicit关键字:一个定义用户自定义转换操作符的操作符。通常用来将内建类型转换为用户定义类型或反向操作。必须在转换时调用显式转换操作符。
C# 复杂数据类型
① 常量
与变量不同的是,常量在第一次被赋值后值就不能再改变。定义常量需要使用关键字 const 来完成。
语法
const 变量语法 变量名 = 值;
需要注意的是,在定义常量时必须为其赋值,因为不赋值的话以后就再也不能赋值了。
什么时候使用常量?
在程序中使用常量也会带来很多好处,包括增强了程序的可读性以及便于程序的修改。例如在一个计算率的程序中,为了保证程序中的税率统一,设置一个名为 TAX 的常量来完成,如果需要修改税率只修改该常量的值即可。
② 枚举(Enum)
枚举就是一种变量类型。只是枚举声明、赋值、使用的方式跟那些普通的变量类型不一样。
枚举的作用:枚举可以规范开发
语法
[public] enum 枚举名
{
值1,
值2,
值3,
......
}
public:访问修饰符。公开的公共的,哪都可以访问。
enum:关键字,声明枚举的关键字
枚举名:要符合命名规范
枚举的声明和使用
将枚举声明到命名空间的下面,类的外面,表示这个命名空间下,所有的类都可以使用这个枚举。
public enum Season
{春,夏, 秋,冬}
Season s = Season.春;
枚举与基本数据类型之间的转化
1、枚举类型和int类型相互转换
枚举类型默认是跟int类型相互兼容的,所以可以通过强制类型转换的语法互相转换。
当转换一个枚举中没有的值的时候,不会抛异常,而是直接将数字显示出来。
2、枚举类型和string类型相互转换
枚举同样也可以跟string类型互相转换,如果将枚举类型转换成string类型,则直接调用ToString();
如果将字符串转换成枚举类型则需要下面这样一行代码:
(要转换的枚举类型)Enum.Parse(typeof(要转换的枚举类型), "要转换的字符串");
如果转换的字符串是数字,则就算枚举中没有,也不会抛异常。
如果转换的字符串是文本,如果枚举中没有,则会抛异常。
C# 结构
结构作用:可以帮助我们一次性声明多个不同类型的变量。
[public] struct 结构名
{
成员; //字段
}
变量在程序运行期间只能存储一个值,而字段可以存储多个值。
C# 数组
数组作用:可以帮助我们一次性存储多个相同类型的变量。
通过下标或者索引去访问和赋值数组中的元素。
语法
数组类型[] 数组名 = new 数组类型[数组长度];
数组的长度一旦固定了,就不能够再改变了。
数组的排序
通过下方两个操作可以实现数组的升序和降序。
Array.Sort(数组); //升序
Array.Reverse(数组); //反转数组
C# 方法(函数)
方法就是将一堆代码进行重用的一种机制
语法
[public] static 返回值类型 方法名([参数列表])
{
方法体;
}
说明
public:访问修饰符,公开的, 公共的,哪都可以访问
static:静态的
返回值类型:如果不需要写返回值,写void
方法名:每一个单词的首字母都大写,其余字母小写
参数列表:完成这个方法所必须要提供给这个方法的条件。如果没有参数,小括号也不能省略。
关键字return
在方法中返回要返回的值。立即结束当前方法。
注意
1.不管是实参还是形参,都是在内存中开辟空间。
2.方法的功能要单一。
3.方法中最忌讳的就是出现提示用户输入的字眼,所以你需要尽可能地不使用Console.WriteLine()方法来达到目的。
out参数
如果你在一个方法中,返回多个相同类型的值的时候,可以考虑返回一个数组。
但是,如果返回多个不同类型的值的时候,返回数组就不行了,那么这个时候,我们可以考虑使用out参数。
out参数就侧重于在一个方法中返回多个不同类型的值。
out参数要求在方法的内部必须为其赋值。
out意思就是返回多余的值。
ref参数
能够将一个变量带入一个方法中进行改变,改变完成后,再讲改变后的值带出方法。
ref参数要求在方法外必须为其赋值,而方法内可以不赋值。
params可变参数
将实参列表中跟可变参数数组类型一致的元素都当作数组的元素去处理。
params 参数必须是形参表中最后一个参数。一个形参列表中只能有一个params参数。
方法的重载
方法的重载指的就是方法的名称相同,但是参数不同。
参数不同,分为两种情况
1.如果参数的个数相同,那么参数的类型就不能相同。
2.如果参数的类型相同,那么参数的个数就不能相同。
注:方法的重载跟返回值没有关系
方法的递归:方法自己调用自己
C# 异常
异常是指语法上没有任何错误,在程序运行的过程当中,由于某些原因出现了问题,使程序不能再正常的运行。
异常捕获
我们在程序中经常会出现各种各样的异常,你如果想要你的程序变得坚强一些。
在你的代码中应该经常性的使用try-catch来进行异常捕获。
哪行代码有可能出现异常,你就try它一脚。
语法
try
{
可能会出现异常的代码块;
}
//try和catch之间不能有其它的代码
catch
{
出现异常后要执行的代码块;
}
执行过程:如果try中的代码没有出现异常,那么catch中的代码不会执行。
如果try中的代码出现了异常,那怕这行出现异常的代码后面还有一百行都不会执行了。
而是直接跳到catch中执行代码。
学以致用
目的:用控制台做一个飞行棋游