概念:.net与c#
.net/dontnet:一般指.net framework框架,一种平台,一种技术
c#(charp):一种编程语言,可以开发基于.net的应用。
*java既是一种技术又是一种编程语言。
.net都能干什么?
开发桌面应用程序 Winform
internet应用程序 Asp.net/webservice
C/S:客户机(Client)/服务器模式(Server)
B/S:浏览器(Browser)/务器模式(Server)
两句话
第一句Console.WriteLine(“你想显示的内容”);
第二句Console.ReadKey();当程序执行到这句话的时候,程序会停在这里,等待用户在键盘上键入一个键,之后,程序继续执行。
PS:在C#中。每句话必须一:分号结束。
Main方法是我们程序的入口方法,当我们只想一个程序时,会首先找到Main方法,从Main的第一句程序开始执行,当Main方法执行完成后(即执行到Main方法的反大括号)程序就结束了。
基础知识
在C#中有三种注释,注释是给人看的,和程序无关:
第一种:单行注释 以//到本行结束
第二种:多行注释 以/*开始,*/结束,之间的都为注释
第三种: 文档注释 用于对类和方法进行注释的 连续输入3个///
Ps:计算机使用基本技巧
常用键:Home/End/PageUp/PageDown/Shift
删除文字:Del/Backspace
复制粘贴:Ctrl+C/V/P/
使用Ctrl+Z
; ;()等的全角半角的问题
快捷键:F5/F6
折叠一段代码:#Region和#EndDregion
变量
RAM:内存有个特点,断电后里面的数据就会丢失
变量:变量代表着一块内存空间,我们可以通过变量名称向内存存/取数据
向内存空间声明变量的语法格式:
数据类型 变量名;
给变量赋值:
变量名=值;
变量的使用和命名规则
整数在C#中的数据类型叫int
小数 double
字符型,一个字符 char
字符串,就是把一个或多个字符连接起来 string
变量声明的三种方法:
1数据类型 变量名称;
2数据类型 变量名称=值;
3一次声明多个相同类型的变量
数据类型 变量名=值,变量名=值,变量名=值;
PS:变量一定要先声明,再赋值,才能取值/调用
变量的命名规则:
1必须以“字母”或@开头
后面可以跟任意“字母”,数字,下划线
Ps:)变量名不能和C#系统中的关键字重复
)在C#中,大小写是敏感的
)同一个变量名不允许重复定义(新手先这么认为)
定义变量时变量名要有意义
)变量命名编码规范-首个单词的字母小写,其余单词的字母大写
输出变量的值连_赋值符_连接符_占位符
赋值运算符:=
A=A+1;这里的=号是赋值运算符,不是数学上意义上的相等
变量可以重复赋值,一旦给一个变量赋了新值,那么变量中的老值就不存在了
+在C#中有两种意义:
)是数学中的加法运算:两边参与加法运算的数据类型为数字类型,则+表示数学上加法的意义
)是连接的意思:两边参与加号运算的数据,有一个不是数据类型,那么这个加号表示连接的意义
在console.writelin();
第一个变量/字符串可以使用占位符
占位符又{数字}
{0}第一个占位符
{1}第二个占位符
{2}第三个占位符
……
Console.writeline();有多个参数时,输出都是第一个参数的内容,从第二哥参数开始,都是用来替换第一个参数占位符的值,所以从第二个参数开始,要不要输出,就要看第一个参数中有没有相关的占位符
变量交换_输入
学习一句话,用于让用户从键盘上输入一句话,当程序执行到下面这句话,就会暂停,然后等待用户从键盘上输入一句话,按回车键程序继续执行,如果想得到用户输入的内容,就需要定义一个String类型的变量,谢在下面这句话的前面,接收用户输入的内容
String 变量名=Console.ReadLine();
数据类型的自动转换
转义字符:
什么时候用,当我们需要在字符串中输入一些特殊的字符时,比如:半角引号,换行,退格等就需要转义字符
转义字符是一个特殊的字符,它由一个\+一个字母来组成具有特殊意义的一个字符。
常用的转义字符:
\n: 换行
\b: backspace 退格
\t: tab 有多个空格组成的一个字符,具有行与行之间的对齐功能
\:表示一个\
在字符串前面加一个@有2种意义:
)字符串中如果有\,则不理解为转义符
)使字符串可以换行
Ps:如果字符串前面加@,在字符串上用两双引号代表一个双引号
在C#中,有五个算术运算符:+,-,*,/,%
二元运算符,要求:参与的两个操作数类型必须相同,并且经过运算后的结果也与操作数的类型相同
在算术表达式中,如果要改变计算的优先级
用小括号,小括号可以无限套用,必须成对出现
发生自动转换的条件:
)参与运算的两个数据类型必须相兼容
)必须一边的数据类型表示范围小,,一边的范围大,并且把小的转换大的不丢书精度
类型的强制转换语法:
(数据类型名)待转换的值
强制类型转换,数据类型一定要相兼容
类型转换
参与运算(算术运算和赋值运算)的操作数和结果类型必须一致,当不一致时,满足以下条件,系统自动完成类型转换
两种类型兼容:
目标类型大于源类型
对于表达式:
如果一个操作数为double类型,则整个表达式可提升为double类型
在自动转换中,是不会丢失精度的。如果丢失精度,那么这个转换就不是自动完成
强制类型转换
语法:(数据类型名)待转换的值;
PS:强制类型转换,数据类型一定要相兼容
Convert不仅是内存级别的转换,而是考虑数据意义的转换,是一个加工改造的国产
语法:
convert.toint32(待转字符串);
Convert.tostring();//一切类型都可以转换成string类型
try-catch
C#中异常捕获:
Try
{
有可能出现错误的代码写这里
}
Catch
{
出错后烦人处理
}
上面的程序如何执行:
如果try中的代码没有出错,则程序正常运行try中的内容,不会执行catch中的内容。
如果try中的代码一旦出错,程序立即跳入catch中去执行代码,那么try中的代码后面的代码不再执行了
自加自减复合赋值-关系表达式
算术运算符:
++自加1 有前加和后加
–自减1 有前减和后减
Ps:一元运算符++/–比二元运算符+/-优先级高
)+=
)-=
)*=
)/=
)%=
在C#中,有6个关系运算符,用于比较两个事物之间的关系
关系运算符(比较运算):
)>,<
)==/!=
)>=/<=
Bool(布尔)类型
在计算机中,一个条件成立与不成立可以用bool类型来表达
Bool类型值只有2个:
真:true
假:false
逻辑表达式
三个逻辑运算符:
&&、||、!
关于表达式:由关系运算符连接起来的式子
表达式1&&表达式2:当表达式1、2全为true时,其表达式的结果为true
表达式1||表达式2:当表达式1、2有一个为ture时,其结果为true
!表达式:如果表达式的结果为true,则去反为false,反之为true
if
If结构的基本语法:
If(条件)
{
语句块1;……
}
执行过程:
首先判断条件的结果,如果条件为true,则执行语句。如果为false,则跳过语句块1。执行后面的语句
PS:if后面括号中的条件要能计算成一个bool类型的值即true/false。if语句只能带if后面大括号中的代码
if-else
If-slse语法:
If(条件)
{语句块1;}
Else
{语句块2;}
执行国过程:
)如果条件为true,则执行if带的语句块1,
并且跳过else带的语句块2
)如果条件为false,则跳过if带的语句块1,执行else带的语句块2
)上面的2个语句块,根据条件结果为true或false,总要执行一个
if-else if
在if-else if语句中,只有当上一个条件不成立时(即结果为false),才会进入下一个if语句并进行if语句后面的条件判断,一旦有一个if后面的条件为true, 则执行次if所带的语句块,语句块执行完成后,程序跳出if-else if结构。如果所有的if条件都不成立,最后如果有else则执行else所带的语句。否则什么都不执行
switch-case
switch-case语法:
Switch(表达式/变量)
{
Case 值1:语句块1;
Break;
Case 值2:语句块2;
Break;
Default:语句块3;
Break;
}
执行过程:
)首先计算表达式,然后根据计算结果与匹配case后面的值,如果有匹配项,则执行匹配项后面的语句,直到break语句跳出switch-case。如果所有的case值都不匹配,那么有default则执行default后面的语句块,知道break结束,如果没有default,则跳出switch-case,什么都不执行
总结分支结构
If-else if和switch的比较:
相同点:都可以实现多分支结构
不同点:
Switch:一般只能用于等值比较
If-else if:可以处理范围
while
特点:先判断,后执行
|While循环语法:
While(循环条件)
{
循环体;
}
执行过程:
)1先判断循环条件,如果条件为true,则转向)2如果条件为false,则转向)3;
)2执行循环体,循环体执行完成后,转向)1;
)3跳出循环,循环结束
PS:在循环体中,一定要有那么一句话,改变循环条件中的某个变量的值,使循环条件终有那么一天为false
do-while
特点:先执行,后判断
语法:
Do
{
循环体;
}
While(循环条件);
执行过程:
)1执行循环体,执行完循环体后转向)2;
)2判断条件是否成立,如果条件为true,则转向)1,如果条件为false,则转向)3;
)3跳出循环,循环结束;
While和do-while区别:
)1语法不同;
)2初始值不满足循环条件时
While循环一次都不会执行;
Do-while循环会执行一次。
调试
程序调试:
)1设置断点;
)2单步运行;
)3观察变量。
for
特点:一般用于已知循环次数的循环
For语法:
For(表达式1;表达式2;表达式3)
{
循环体;
}
执行过程:
)1计算表达式1,转向)2;
)2计算表达式2(循环条件),如果表达式2的值为true转向)3。如果表达式2的值为false,转向)5;
)3执行循环体,转向)4;
)4执行表达式3.转向)2;
)5循环结束。
PS:一般情况下
表达式1:用于定义循环变量和对循环变量赋初值;
表达式2:循环条件;
表达式3:用于改变循环变量的值。
eak/continue
Break:用于循环中,退出当前循环
)1可以用于switch-case判断中,用于跳出switch
)2用在循环中,用于立即跳出(终止)循环。
Ps:用于循环中时,跳出的是break所在的循环
Continue:立即本次循环,判断循环条件,如果成立,则进入下一次循环,否则退出循环。
用于循环中,程序一旦执行到continue语句,立即结束本次循环(就是不在执行循环体中continue下面的语句了),直接进行下一次循环,(do-while、while直接进行下一次循环条件的判断,如果成立则再次进入循环。对于for循环,先执行表达式3,再判断循环条件是否成功!)
常量枚举
常量
语法:
Const 类型 常量名=常量值;
在定义时赋值,在其他地方不允许赋值
枚举
特点:
)1限制用户不能随意赋值,只能在定义枚举时列举的值中选择;
)2不需要死记每一个值是什么,只需要选择相应的值。
语法:
Enum 自己起的类型名称(值1,值2,值3…值N);
PS:定义枚举时,值不能是int类型。枚举的值在定义时都可以强制转换成一个int类型。枚举的值在定义时是有一个默认编号的,编号从0开始。 枚举的定义一般和类定义在同一级别,这样在同一个命名空间下的所有类就都可以使用这个枚举了,(方法中、类中都可以)。
如何把一个字符串转换成枚举类型:
(枚举名)(enum.parse(typeof(枚举),“待转换的字符串”);
结构体
语法:
访问修饰符 struct 结构名
{
定义的结构成员;
}
PS:定义好一个结构后,就可以直接声明相应的变量了。
声明好变量后,通过变量名.成员名。来访问结构的成员
计算机中国最小的单位叫“位”,bit 比特 01011 b
把8个二进制位分成1组,那么8个二进制位叫做 字节
Byte b 计算机能够处理的最小单位
1KB=1024B;
1MB=1024KB;
1GB=1024MB;
1TB=1024GB;
数组
特点:可以帮我们一次声明多个同类型的变量,这些变量在内存中是连续储存的,
语法:
定义数组:数据类型[] 数组名=new 数据类型[数组长度];赋值:数据名[编号]=值;
定义数组时直接赋值:数据类型[] 数组名=new 数据类型[值1,值2,值3,…]
如何访问数组:通过下标(索引)来访问数组:数组名[编号]。
通过 数组名.length可以获得数组的长度
PS:int类型数组一旦声明,里面的每一个元素被初始化成0
清屏:
Console.Clear();
冒泡排序
让数组中的元素两两比较(第i个和第i+1个比较),经过n(i-1)遍两两比较,数组中的元素能按照我们预期的规律排序
语法:
For(int i=0;i<数组名.length-1-i;i++)
{
For(int j=0;j<数组名.length-1-i;j++)
{
If(>)
{
交换
}
}
方法
特点:用来复用代码的,当我们在一个程序中反复的写同样的代码,那一般情况下,我们可以把需要重复写的代码定义在一个方法中,用的时候只需要调用就行了。
语法:
[访问修饰符] [static] 返回值类型 方法名()
{
方法体;
}
PS:
)1一般情况下,方法一般要定义在类中;
)2如果方法没有分返回值,返回值类型写void;
)3如果没有参数,()不能省略;
在方法后面的括号内定义变量,叫做定义这个方法的参数,这里定义的变量用于接收调用者传过来的数据。如果一个方法,一旦有参数,那么调用者就必须传参数的个数与对应位置上的类型必须一致。
方法命名规则:方法名开头大写,参数名开头小写,参数,变量名要有意义、
方法的调用:对于静态方法,如果在同一个类中,直接写名字调用就可以了
Retun:可以立即退出方法
返回值
当调用者想访问我们方法中的变量时,可以通过返回值返回。
只要在方法中返回了值,那么在调用方法中,前面就应该用一个变量来接收返回值。
一旦一个方法有了返回值,那么在这个方法值中就必须通过tesutn语句返回一个值,并且这个值要与返回值类型是相同的。
语法:rsturn 值;
PS:一个方法只能有一个返回值
参数
在方法名后面的括号内定义变量,叫做定义这个方法的参数,这里的定义的变量用于接收调用者传过来的数据。
PS:如果一个方法一旦有参数,那么调用者就必须传参数,并且传参数的个数与对应位置上的类型必须一致
变量的作用域:
在方法中定义称为局部变量,其作用域从定义开始,到期所在的大括号结束为止。
当被调用者想得到调用者方法中的变量时,则可以让调用者通过参数的形式给被调用者。
[访问修饰符] [static] 返回值类型 方法名(参数)
{
方法体;
}
out / ref
Out用于传出值,在方法中必须对out修饰的参数进行赋值。
Ref可以理解成双向的,既可以传入,也可以传出。
在传参数的过程中,如果参数有out或ref修饰的话,那么改变方法中的参数变量的值,调用者方法中的变量的值也会相应改变
一个变量一定定义在方法外,类的里面,就叫做类的字段,这个变量可以被本类的所有方法所访问,但是要注意,静态方法只能访问静态字段
由const修饰的常量不能静态的
什么叫方法的重载:
一般在同一个类中,方法名相同,并且方法的参数的个数不同或者对应位置上的类型不同,才能构成方法的重载
PS:方法重载和返回值没有关系
通过参数来返值:
)1在方法的参数类型前加out,那么传参数的时候,也必须在调用方法的()里的参数前加OUT 表示这个参数不是传入的,而是用来传出值的;
)2如果参数是以out形式传入的,那么在传入前可以不赋初值;
)3在方法中对于由out修饰的参数,必须赋值,并且必须在使用前赋值;
类
类是对象的类型
定义类的语法:
[访问修饰符] class 类名
{
成员;
……
}
在我们写的类中先不用加static
如何通过一个类来产生一个对象了:
通过类产生一个对象叫做类的实例化
语法:
类 实例名 =new 类();
访问类的属性:实例名.属性名
访问类的方法:实例名.方法名()
只要是没有加static的方法或属性,都必须先实例化,在通过实例名.方法名或实例名.属性来访问;
加static的方法或属性,可以直接通过 类名。方法名活 类名.属性来访问
属性
允许外部访问的便利一定要声明为属性
什么叫属性:
定义一个public的具有get/set方法的变量,这个变量用来保护私有变量的。
读写属性:具有get/set方法的属性;
只读属性:只有get方法的属性,这个属性只能读取,不能写入;
只写属性:这个属性只能写,不能写读(只写属性用的很少)。
在C#中有4个访问修饰符:
Public:可以在任何地方访问
Internal:只能在本项目访问
Private:只能在本类中被访问
Preotected:只能在本类和子类中访问
在类这个级别,不写访问修饰符默认为internal
在一个类中定义变量或方法时,没有写访问修饰符,那么默认的访问修饰符为private
构造方法
定义构造方法语法:
构造方法是一个特殊的方法,他的名字和类的名字相同,并且没有返回值,连void都可以省略不写,我们一旦手写一个构造方法后,系统原先默认给我们添加的那个无参数的构造方法就不再为我们添加了
Ps:当我们定义好一个类之后,如果没有写构造方法,那么系统会自动给我们加上一个默认的没有参数的构造方法,在这个构造方法中,什么也不做我们也看不到。
特点:
)1对多个属性进行赋值时,不需要写实例名
)2可以保证用户在new一个对象的时候必须对某一个属性进行赋值
)3和第二类似,在创建对象时,对只读属性进行初始化
当我们实例化一个类时,系统会自动对这个类的属性进行初始化:
数字类型初始化为:0/0.0
String类型初始化为:null
Char类型初始化为:\0
要实例化一个类,就必须调用它的构造方法
析构函数
*析构函数:
)1不能在结构中定义析构函数。只能对类使用析构函数;
)2一个类只能有一个析构函数
)3无法调用析构函数,他们是被自动调用的
)4析构函数既没有修饰符,也没有参数
要想抛一个异常,可以这样写:
Throw new exception(“错误信息”);
命名空间空间
Namespace(命名空间),用于解决类的重名问题,可以看作“类的文件夹”。
不在同一个命名空间下的类,不能被直接访问,要想访问别的命名空间下的类有两种方法:
)1通过using 引用对方的命名空间
)2写全称.命名空间.类名
String类
String可以看作是char的只读数组。
C#中字符串有一个重要的特性:不可变性,字符串一旦声明就不再可以改变,所以只能通过索引来读取指定位置的char,不能对指定位置的char进行修改:
Char 变量名=string变量名[1];
字符串讲解
String类常用的方法:
比较字符串的方法:
Trim():去掉字符串两端的空白。
tolower():可以得到字符串的小写形式。
Toupper():得到字符串的大写形式
Ps:字符串是不可变的,所以这个方法都不会直接改变字符串的内容,而是把修改后的字符串的值通过方法的返回值的形式返回。
Str1.equals(s2.stringcomparison.ordinallgnoercase):两个字符串进行不区分大小写的比较
分割字符串的方法:
String[] split(params char[] separator):将字符串按照指定的分割符分割为字符串数组;
String [] split(char[] separator,stringsplitoptions):将字符串按照指定的char分割符分割为字符串数组(options取removeemptyentries的时候移除结果中的空白字符串)。