c#入门到高级(全)

一、
1.
.cs 类
2.
引用命名空间
3.
Main函数是程序的主入口,程序写在Main函数下才可被执行
4.
.sln : 解决方案文件
.csproj :项目文件
二、
1.
Console,WriteLine("要打印的内容");
Console,ReadKey();//暂停当前程序,等待用户按下任意键继续
三、
1.Ctrl+K+D 快速对齐
2.Shift+Home Shift+End
3.Ctrl+K+C注释选中的代码
4.Ctrl+K+U取消注释选中的代码
5.折叠冗余代码: #region #endregion
四、
1.
储存整数100
数据类型:整数
在内存中开辟的空间应该是整数类型 int
2.
存储变量的语法:
变量类型 变量名;
变量名=值;
3."="在这里并不表示等于,而是赋值,表示把等号右边的值赋值给等号
左边的变量
4.数据类型
1)、整数类型:int 只能存储整数,不能存储小数。
2)、小数类型:double 既能存储整数,也能存储橡树,小数点后面的位
数 15~16位。
3)、金钱类型:decimal 用来存储金钱,值后面需要加上一个m。
4)、字符串类型:string 用来存储多个文本,也可以存储空,字符串类
型需要被双引号引起来
5)、字符类型:char 用来存储单个字符,最多最少只能有一个字符,不
能储存空,字符类型的值需要用单引号引起来
三、
1.给变量命名的时候要满足两个规范:
1)、Camel 骆驼命名规范,要求变量名首单词的首字母要小写,其余每
个单词的首字母要大写,多用于给变量或字段命名。
highSchoolStudent
2)、Pascal 命名规范:要求每个单词的首字母都要大写,其余字母小写,
多用于给类或者方法命名。
HighSchoolStudent
2.赋值运算符
=; 表示赋值的意思,表示把等号右边的值赋值给等号左边的变量。
由等号连接的表达式称之为赋值表达式。
注意:每个表达式我们都可以求解除一个定值,对于赋值表达式而言,等
号左边的变量的值,就是整个赋值表达式的值。
int number=10;
3.+号的作用
1)、连接:当+号两边有一边是字符串的时候,+号就起到连接的作用
2)、相加:当+两边是数字的时候,+号就起到相加的作用
4.占位符
使用方法:先挖个坑,再填个坑。
使用占位符需要注意的地方:
1、你挖了几个坑,就填几个坑,如果你多填了,没效果
如果你少填了,报异常
2、输出顺序:按照挖坑的顺序输出
3.异常
异常是指:语法上没有任何错误,只不过在程序运行期间,由于某些原因
出现了问题,使程序不能再正常运行,也被称作Bug
4.转义符
转义符值得就是一个'\'+一个特殊的字符,组成了一个具有特殊含义的字
符。
\n 表示换行
\" 表示一个英文半角的双引号
\t 表示一个TAB键的空格
\b 表示一个退格键,放到字符串的两边没有效果
\\ 表示一个\
@符号
1.取消\在字符串中的转义作用
2.将字符串按照编辑的原格式输出
5.算数运算符
+
-
*
/
%
6.类型转换
隐式类型转换:
我们要求等号两边参与运算的操作书的类型必须一致,如果不一致,满足
下列条件会发生自动类型转换,或者称之为隐式类型转换。
两种类型兼容
列如:int 和 double 兼容(都是数字类型)
目标类型大于原类型
列如:double > int (小的转大的)
显式类型转换:
1.两种类型相兼容 int-->double
2.大的转成小的 double-->int
语法:
(待转换的类型)要转换的值;
总结:
自动类型转换:int-->double
显示类型转换:double-->int
五、
1.如果两个变量的类型相兼容,可以使用自动类型转换或者强制类型转换,
但是,如果两个类型的变量不兼容,比如 string 和 int,这时候我们可
以使用一个叫做Convert的转换工厂进行转换。
注意:使用Convert进行转换,也要满足一个条件:
面上要过的去,比如:
string a = "123"// 可以转成 int 或 double
string b = "123abc"//不可以转成 int 或 double
2.算数运算符
++:分为前++和后++,不管是前++还是后++,最终的结果都是给这
个变量加一。
去别表现在表达式当中,如果是前++,则先给这个变量自身加一,然后
带着这个加一后的值去参与运算。
如果是后++,则先拿原值参与运算,运算完成后,再将这个变量自身加
一。
--:同上。
3.
对于像++或--这样只需要一个操作数就能完成的运算,我们称之为一元
运算符。
+ - * / %对于这些需要两个或以上才能完成运算的操作符,我们称之为
二元运算符。
一元运算符的优先级要高于二元运算符。
如果在一个表达式当中,既有一元运算符,又有二元运算符,我们首先计
算一元运算符。
4.关系运算符
>
<
>=
<=
==
!=
关系运算符是用来描述两个事物之间的关系
由关系运算符连接的表达式称之为关系表达式。
5.bool类型
在c#中我们用bool类型来描述对或者错。
bool类型的值只有两个 一个true 一个false
6.逻辑运算符
&&逻辑与
||逻辑或
!逻辑非
逻辑运算符两边放的一般都是关系表达式或者bool类型的值
5>3&&true
3>5||false
!表达式
逻辑表达式的结果同样也是bool类型
7.复合赋值运算符
+=
-=
*=
/=
%=
8.顺序结构:程序从Main函数进入,从上到下一行一行的执行,不会落下
任何一行。
分支结构:if if-else
选择结构:if else-if switch-case
循环结构:while do-while for foreach
9.if语句:
语法:
if(判断条件)
{
要执行的代码;
}
判断条件:一般为关系表达式或者bool类型的值。
执行过程:程序运行到if处,首先判断if所带的小括号中的判断条件,
如果条件成立,也就是返回true,则执行if收带的大括号中的代码,
如果判断条件不成立,也就是返回一个false,则跳过if结构,继续向下
执行。
if结构的特点,先判断,再执行,有可能一行代码都不执行
用于一种情况的判断
如果你想表示的含义是当b的值为true的时候去执行if中的代码,
那么语法上==true可以省略
但是,如果你想表达的是当b==false的时候去执行if中的代码,
语法上==false不能省略
10.if-else
语法:
if(判断条件)
{
执行的代码;
}
else
{
执行的代码;
}
执行过程:程序执行到if处,首先判断if所带的小括号中的判断条件是否
成立,
如果成立,也就是返回一个true,则执行if所带的大括号中的代码,
执行完成后,跳出if结构。
如果if所带的小括号中的判断条件不成立,也就是返回一个false,
则跳过if语句,执行else所带的大括号中的语句,执行完成后,
跳出if-else结构。
if-else结构的特点:先判断,再执行,最少都要执行一条代码。
用于两种情况的判断
10.if else-if
作用:用来处理多条件的区间性的判断。
语法:
if(判断条件)
{
要执行的代码;
}
else if(判断条件)
{
要执行的代码;
}
else if(判断条件)
{
要执行的代码;
}
else if(判断条件)
{
要执行的代码;
}
......
else
{
要执行的代码;
}
执行过程:程序首先判断第一个if所带的小括号中的判断条件,如果条件
成立,也就是返回一个true,
则执行该if所带的大括号中的代码,执行完成后,立即跳出if else-if
结构。
如果第一个if所带的判断条件不成立,也就是返回一个false,则继续向
下进行判断,依次的判断每一个if的判断条件,如果成立,就执行该if所
带的大括号中的代码,如果不成立,则继续行侠判断,
如果每个if所带的判断条件都不成立,就看当前这个if else-if结构中是
否存在else。
如果有else的话,则执行else中所带的代码,如果没有else,则整个
if else-if结构什么都不做。
else可以省略。
一、
1.
.cs 类
2.
引用命名空间
3.
Main函数是程序的主入口,程序写在Main函数下才可被执行
4.
.sln : 解决方案文件
.csproj :项目文件
二、
1.
Console,WriteLine("要打印的内容");
Console,ReadKey();//暂停当前程序,等待用户按下任意键继续
三、
1.Ctrl+K+D 快速对齐
2.Shift+Home Shift+End
3.Ctrl+K+C注释选中的代码
4.Ctrl+K+U取消注释选中的代码
5.折叠冗余代码: #region #endregion
四、
1.
储存整数100
数据类型:整数
在内存中开辟的空间应该是整数类型 int
2.
存储变量的语法:
变量类型 变量名;
变量名=值;
3."="在这里并不表示等于,而是赋值,表示把等号右边的值赋值给等号
左边的变量
4.数据类型
1)、整数类型:int 只能存储整数,不能存储小数。
2)、小数类型:double 既能存储整数,也能存储橡树,小数点后面的位
数 15~16位。
3)、金钱类型:decimal 用来存储金钱,值后面需要加上一个m。
4)、字符串类型:string 用来存储多个文本,也可以存储空,字符串类
型需要被双引号引起来
5)、字符类型:char 用来存储单个字符,最多最少只能有一个字符,不
能储存空,字符类型的值需要用单引号引起来
三、
1.给变量命名的时候要满足两个规范:
1)、Camel 骆驼命名规范,要求变量名首单词的首字母要小写,其余每
个单词的首字母要大写,多用于给变量或字段命名。
highSchoolStudent
2)、Pascal 命名规范:要求每个单词的首字母都要大写,其余字母小写,
多用于给类或者方法命名。
HighSchoolStudent
2.赋值运算符
=; 表示赋值的意思,表示把等号右边的值赋值给等号左边的变量。
由等号连接的表达式称之为赋值表达式。
注意:每个表达式我们都可以求解除一个定值,对于赋值表达式而言,等
号左边的变量的值,就是整个赋值表达式的值。
int number=10;
3.+号的作用
1)、连接:当+号两边有一边是字符串的时候,+号就起到连接的作用
2)、相加:当+两边是数字的时候,+号就起到相加的作用
4.占位符
使用方法:先挖个坑,再填个坑。
使用占位符需要注意的地方:
1、你挖了几个坑,就填几个坑,如果你多填了,没效果
如果你少填了,报异常
2、输出顺序:按照挖坑的顺序输出
3.异常
异常是指:语法上没有任何错误,只不过在程序运行期间,由于某些原因
出现了问题,使程序不能再正常运行,也被称作Bug
4.转义符
转义符值得就是一个'\'+一个特殊的字符,组成了一个具有特殊含义的字
符。
\n 表示换行
\" 表示一个英文半角的双引号
\t 表示一个TAB键的空格
\b 表示一个退格键,放到字符串的两边没有效果
\\ 表示一个\
@符号
1.取消\在字符串中的转义作用
2.将字符串按照编辑的原格式输出
5.算数运算符
+
-
*
/
%
6.类型转换
隐式类型转换:
我们要求等号两边参与运算的操作书的类型必须一致,如果不一致,满足
下列条件会发生自动类型转换,或者称之为隐式类型转换。
两种类型兼容
列如:int 和 double 兼容(都是数字类型)
目标类型大于原类型
列如:double > int (小的转大的)
显式类型转换:
1.两种类型相兼容 int-->double
2.大的转成小的 double-->int
语法:
(待转换的类型)要转换的值;
总结:
自动类型转换:int-->double
显示类型转换:double-->int
五、
1.如果两个变量的类型相兼容,可以使用自动类型转换或者强制类型转换,
但是,如果两个类型的变量不兼容,比如 string 和 int,这时候我们可
以使用一个叫做Convert的转换工厂进行转换。
注意:使用Convert进行转换,也要满足一个条件:
面上要过的去,比如:
string a = "123"// 可以转成 int 或 double
string b = "123abc"//不可以转成 int 或 double
2.算数运算符
++:分为前++和后++,不管是前++还是后++,最终的结果都是给这
个变量加一。
去别表现在表达式当中,如果是前++,则先给这个变量自身加一,然后
带着这个加一后的值去参与运算。
如果是后++,则先拿原值参与运算,运算完成后,再将这个变量自身加
一。
--:同上。
3.
对于像++或--这样只需要一个操作数就能完成的运算,我们称之为一元
运算符。
+ - * / %对于这些需要两个或以上才能完成运算的操作符,我们称之为
二元运算符。
一元运算符的优先级要高于二元运算符。
如果在一个表达式当中,既有一元运算符,又有二元运算符,我们首先计
算一元运算符。
4.关系运算符
>
<
>=
<=
==
!=
关系运算符是用来描述两个事物之间的关系
由关系运算符连接的表达式称之为关系表达式。
5.bool类型
在c#中我们用bool类型来描述对或者错。
bool类型的值只有两个 一个true 一个false
6.逻辑运算符
&&逻辑与
||逻辑或
!逻辑非
逻辑运算符两边放的一般都是关系表达式或者bool类型的值
5>3&&true
3>5||false
!表达式
逻辑表达式的结果同样也是bool类型
7.复合赋值运算符
+=
-=
*=
/=
%=
8.顺序结构:程序从Main函数进入,从上到下一行一行的执行,不会落下
任何一行。
分支结构:if if-else
选择结构:if else-if switch-case
循环结构:while do-while for foreach
9.if语句:
语法:
if(判断条件)
{
要执行的代码;
}
判断条件:一般为关系表达式或者bool类型的值。
执行过程:程序运行到if处,首先判断if所带的小括号中的判断条件,
如果条件成立,也就是返回true,则执行if收带的大括号中的代码,
如果判断条件不成立,也就是返回一个false,则跳过if结构,继续向下
执行。
if结构的特点,先判断,再执行,有可能一行代码都不执行
用于一种情况的判断
如果你想表示的含义是当b的值为true的时候去执行if中的代码,
那么语法上==true可以省略
但是,如果你想表达的是当b==false的时候去执行if中的代码,
语法上==false不能省略
10.if-else
语法:
if(判断条件)
{
执行的代码;
}
else
{
执行的代码;
}
执行过程:程序执行到if处,首先判断if所带的小括号中的判断条件是否
成立,
如果成立,也就是返回一个true,则执行if所带的大括号中的代码,
执行完成后,跳出if结构。
如果if所带的小括号中的判断条件不成立,也就是返回一个false,
则跳过if语句,执行else所带的大括号中的语句,执行完成后,
跳出if-else结构。
if-else结构的特点:先判断,再执行,最少都要执行一条代码。
用于两种情况的判断
10.if else-if
作用:用来处理多条件的区间性的判断。
语法:
if(判断条件)
{
要执行的代码;
}
else if(判断条件)
{
要执行的代码;
}
else if(判断条件)
{
要执行的代码;
}
else if(判断条件)
{
要执行的代码;
}
......
else
{
要执行的代码;
}
执行过程:程序首先判断第一个if所带的小括号中的判断条件,如果条件
成立,也就是返回一个true,
则执行该if所带的大括号中的代码,执行完成后,立即跳出if else-if
结构。
如果第一个if所带的判断条件不成立,也就是返回一个false,则继续向
下进行判断,依次的判断每一个if的判断条件,如果成立,就执行该if所
带的大括号中的代码,如果不成立,则继续行侠判断,
如果每个if所带的判断条件都不成立,就看当前这个if else-if结构中是
否存在else。
如果有else的话,则执行else中所带的代码,如果没有else,则整个
if else-if结构什么都不做。
else可以省略。
1)、程序调试
1)、写完一段程序后,想看一下这段程序的执行过程
2)、当你写完这段程序后,发现程序并没有按照你想象的样子去执行
调试方法:
1)、F11逐语句调试(单步调试)
2)、F10逐过程调试
3)、断点调试
2、for循环
语法:
for(表达式1;表达式2;表达式3;)
{
循环体;
}
表达式1一般为声明循环变量,记录循环的次数(int i=0;)
表达式2一般为循环条件(i<10)
表达式3一般为改变循环条件的代码,使循环条件终有一天不在成立(i++)
执行过程:程序首先执行表达式1,声明了一个循环变量用来记录循环的次数,
然后执行表达式2,判断循环条件是否成立,如果表达式2返回的结果为true,
则执行循环体,如果不成立,则跳出for循环。
4、三元表达式
语法:
表达式1?表达式2:表达式3;
表达式1一般为一个关系表达式。
如果表达式1的值为true,那么表达式2的值就是整个三元表达式的值。
如果表达式1的值为false,那么表达式3的值就是整个三元表达式的值。
注意:表达式2的结果必须跟表达式3的结果类型一致,并且也要跟整个三元表
达式的结果类型一致。
1、常量
声明常量的语法:
const 变量类型 变量名=值;
6、枚举
语法:
[public] enum 枚举名
{
值1,
值2,
值3,
......
}
public:访问修饰符,公开的公共的,哪儿都可以访问。
enum:关键字,声明枚举的关键字
枚举名:要符合Pascal命名规范
将枚举声明到命名空间下面,类的外面,表示这个命名空间下,所有的类都可
以使用这个枚举
枚举就是一个变量类型,只是枚举声明、赋值、使用的方式跟那些普通的变量
类型不一样
7、所有的类型都能转换成string类型,调用ToString()
8、结构
可以帮助我们一次性声明多个不同类型德变量。
语法:
[public] struct 结构名
{
成员;//字段
}
变量在程序运行期间只能存储一个值,而字段可以存储多个值。
9、数组
一次性存储多个相同类型的变量。
语法:
数组类型[] 数组名=new 数组类型[数组长度];
10、冒泡排序:就是将一个数组中的元素按照从大到小或者从小到大的顺序进
行排列。
11、方法
函数就是将一堆代码进行重用的一种机制。
函数的语法:
[public] static 返回值类型 方法名([参数列表])
{
方法体;
}
public:访问修饰符,公开的,公共的,哪儿都可以访问。
static:静态的
返回值类型:如果不需要返回值,写void
方法名:pascal 每个单词的首字母都大写,其余字母小写
参数列表:完成这个方法所必须要提供给这个方法的条件,如果没有参数,小
括号也不能省略。
方法写好后,如果想要被执行,必须要在Main()函数中调用。
方法的调用语法:
类名.方法名();
12、return
1.在方法中返回要返回的值。
2.立即结束本次方法。
一、我们在Main()函数中,调用Test()函数,我们管Main()函数称之为调用者,
管Test()函数称之为被调用者。
如果被调用者想要得到调用者的值:
1.传递参数。
2.使用静态字段来模拟全局变量。
1.返回值
二、不管是形参还是实参,都是在内存中开辟了空间的。
三、方法的功能一定要单一。
方法中最忌讳的就是出现让用户输入等字眼
四、out、ref、params
1.out参数。
如果你在一个方法中,返回多个相同类型的值的时候,可以考虑返回一个数组。
但是,如果返回多个不同类型的值的时候,返回数组就不行了,那么这个时候,我们可以考虑使用out参数。
out参数就侧重于在一个方法中可以返回多个不同类型的值。
2.ref参数
能够将一个变量带入一个方法中进行改变,改变完成后,再将改变后的值带出方法。
ref参数要求在方法外必须为其赋值,而方法内可以不赋值。
3.params可变参数
将实参列表中跟可变参数类型一致的元素都当作数组的元素去处理。
params可变参数必须是形参列表中的最后一个元素。
五、方法的重载
概念:方法的重载指的就是方法的名称相同,但是参数不同。
1.如果参数的个数相同,那么参数的类型就不能相同。
2.如果参数的类型相同,那么参数的个数就不能形同。
*方法的重载跟返回值没有关系。
六、方法的递归
方法自己调用自己。
找出一个文件夹中所有的文件。
一、面向过程------>面向对象
面向过程:面向的是完成这件事的过程,强调的是完成这件事的动作
1.打开冰箱门
2.把大象塞进冰箱
3.关闭冰箱门
如果我们用面向过程的思想来解决这件事儿,当执行这件事的人不同的时候,我们需要为每一个不同的人量身定做解决事情的方法
面向对象:找个对象帮你做事
把大象塞进冰箱里
1.冰箱门可以被打开
2.大象可以被塞进冰箱里
3.冰箱门可以被关闭
面向对象意在写出一个通用的代码,屏蔽差异
关门
面向过程:关门
张三:一脚把门踹紧了
李四:轻轻的把门带上了
王五:门没关严,留了个尾巴
面向对象:关门
门可以被关闭
姓名:孙全
特征:
性别:男
身高:180cm
体重:70kg
年龄:22岁
行为:
吃喝拉撒睡一切正常 健康
吃喝嫖赌抽
特征:
姓名:颜德伟
性别:男
身高:160cm
体重:60kg
年龄:18
行为:
脑残 身体健康
我们在代码中描述一个对象,通过描述这个对象的属性和方法
对象必须是看的见摸得着的
灯:属性和方法
属性:
外形:圆的
功耗:500w
颜色:白色
牌子:xx
方法:发光
电风扇:属性、方法
外形:三个叶片
颜色:白色
品牌:xx
方法:转动、扇风
我们把这些具有相同属性和相同方法的对象进行进一步的封装,抽象出来“类”这个概念
类是一张图纸,确定了对象具有的属性和方法
对象是根据类创建出来的
类就是一个盖大楼的图纸,对象就是盖出来的大楼
2、类
语法:
[public] class <类名>
{
字段;
属性;
方法;
}
写好了一个类后,我们需要创建这个类的对象,
我们称创建这个类的过程叫做实例化。
使用关键字new
this:表示当前这个类的对象
类是不占内存的,而对象是占内存的
3、属性
属性的作用就是保护字段、对字段的赋值和取值进行限定
属性的本质就是两个方法,一个叫 get ( ) 一个叫 set ( )
既有get( )也有set( )我们称之为可读可写属性
只有get( )没有set( )我们称之为只读属性
没有get( )只有set( )我们称之为只写属性
Field 字段
Method 方法
property 属性
4、访问修饰符
public:公开的公共的,在哪儿都能访问。
private:私有的,只能在当前类内部进行访问,出了这个类就访问不到了
5、
当我们创建好一个类的对象后。需要给这个对象的每个属性去赋值
我们管这个过程称之为对象的初始化
6、静态和非静态的区别
1.在非静态类中,既可以有实例成员(非静态成员),也可以有静态成员
2.在调用实例成员的时候,需要使用对象名.实例成员;
在调用静态成员的时候,需要使用类名.静态成员名;
总结:静态成员必须使用类名去调用,而实例成员使用对象名调用。
静态函数中,只能访问静态成员,不允许访问实例成员。
静态函数中,既可以使用静态成员,也可以使用实例成员
静态类中只允许有静态成员,不允许出现实例成员
使用:
1.如果你想要你的类当作一个“工具类”去使用,这个时候可以考虑将类写成静态的
2.静态类在整个项目中资源共享
只有在程序结束之后,静态类才会释放资源
堆 栈 静态存储区
释放资源 GC Garbage Collection 垃圾回收器
7、构造函数
作用:帮助我们初始化对象(给对象的每个属性依次的赋值)
构造函数是一个特殊的方法:
1.构造函数没有返回值,连void也不能写。
2.构造函数的名称必须和类名一样。
创建对象的时候会执行构造函数
构造函数是可以重载的
***
类当中会有一个默认的无参数的构造函数,当你写了一个新的构造函数之后,不管是不是无参数的,那个默认的无参数的构造函数都被干掉了。
8、new关键字
Person zsPerson=new Person( );
new帮我们做了3件事儿:
1.在内存中开辟一块空间
2.在开辟的空间中创建对象
3.调用对象的构造函数进行初始化对象
9、this关键字
1.代表当前类的对象
2.在类当中显示的调用本类的构造函数 :this
10、析构函数
当程序结束时,析构函数才执行,帮助我们释放资源,不写析构函数GC会自动清理释放资源
语法:
~类名( ) { }
二、面向对象继承
1、命名空间
可以认为类是属于命名空间的。
如果在当前项目中没有这个类的命名空间,需要我们手动导入这个类所在的命名空间(类似C语言的头文件,python里的import)
2、在一个项目中引用另一个项目的类
1.添加引用
2.引用命名空间
3、值传递和引用传递
区别
1.值传递和引用传递在内存上存储的地方不一样。
2.在传递值类型和传递引用类型的时候,传递的方式不一样。
值类型我们称之为值传递,引用类型我们称之为引用传递。
目前学过的值类型和引用类型:
值类型:int、double、bool、char、decimal、struct、enum
引用类型:string、数组、自定义类
存储:
值类型的值是存储在内存的栈当中的。
引用类型的值是存储在内存的堆中的。
3、字符串
1.字符串的不可变性
当你给一个字符串重新赋值之后,旧值并没有被销毁,而是重新开辟一块内存空间存储新值。
当程序结束后,GC扫描整个内存,如果发现有的空间没有被指向,则立即把它销毁。
2.我们可以将字符串看作是char类型的一个只读数组。
ToCharArray( );将字符串转换为char数组
new string( char[ ] chs);能够将char数组转换为字符串
4、字符串提供的各种方法
1.Length:获得当前字符串中字符的个数
2.ToUpper( )将字符串转换为大写形式
3.ToLower( )将字符串转换为小写形式
4.Equals(lessonTwo,StringComparison.OrdinalIgnoreCase)比较两个字符串,并忽略大小写
5.Split( )分割字符串,返回字符串类型的数组
6.Substring( )截取字符串,在截取的时候包含要截取的那个位置
7.Indexof( )判断某个字符串中第一次出现的位置,如果没有则返回-1
8.LastIndexOf( )确定字符串中最后一次出现的字符串,如果没有则返回-1
9.StartsWith( )判断以...开始,结束:判断以…结束
11. Replace( )将字符串中某个字符替换成一个新的字符串
12.Contains( )确定字符串是否包含指定的字符串
13.Trim( )去掉字符串中前后的空格
14.TrimEnd( )去掉字符串后面的空格
15.TrimStart( )去掉字符串前面的空格
16.isnulloempty( )确定字符串是空的还是null
17.string.Join( )将数组按照指定的字符串连接并返回一个字符串
5、继承
我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员,单独的封装到一个类中,作为这些类的父类。
Student、Teacher、Driver 子类 派生类
Person 父类 基类
子类继承了父类,子类从父类那里继承过来了什么?
首先,子类继承了父类的属性和方法,但是子类并没有继承父类的私有字段。
问题:子类有没有继承父类的构造函数?
答:子类没有继承父类的构造函数,但是,子类会默认的调用父类的无参数的构造函数,创建父类对象,让子类可以使用父类中的成员。
所以,如果在父类中重写了一个有参数的构造函数之后,那个无参数的就被干掉了,子类就调用不到了,所以子类会报错。
解决办法:
1.在父类中重新写一个无参数的构造函数。
2.在子类中显示的调用父类的构造函数,使用关键字:base( )
6、继承的特性
1.继承的单根性:一个子类只能有一个父类。
2.继承的传递性
7、查看类图
8、object是所有类的基类。
9、new关键字
1.创建对象
2.隐藏从父类那里继承过来的同名成员
隐藏的后果就是子类调用不到父类的成员
三、
1、里氏转换
1)子类可以赋值给父类:如果有一个地方需要一个父类作为参数,我们可以给一个子类代替
2)如果父类中装的是子类对象,那么可以将这个父类强转为子类对象,
2、
子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员。
3、
is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false
as:表示类型转换,如果能够转换则返回对应的对象,否则返回一个null
4、protected修饰符
protected:受保护的,可以在当前类的内部以及该类的子类中访问
5、ArrayList集合
1)集合与数组的区别
集合:很多数据的一个集合
数组:长度不可变、类型单一
集合的好处:长度可以任意改变,类型任意
2)ToString的问题
我们将一个对象输出到控制台 默认情况下 打印的就是这个对象所在的类的命名空间
3)ArrayList的方法
list.Clear();//清空所有元素
list.Remove(true);//删除单个元素,写谁就删谁
list.RemoveAt(0);//根据下标删除元素
list.RemoveRange(0, 3);//根据下标去移除一定范围的元素
list.Sort();//升序排列
list.Reverse();//反转
list.Insert(0,'我');//插入单个元素
list.InsertRange(5, new string[] {"张三","李四"});//在指定的位置插入一个集合
4)长度的问题
每次集合中实际包含的元素个数(count)超过了可以包含的元素个数(capcity)的时候,集合就会向内存中多开辟一倍的内存空间,来保证集合的长度一直够用。
6、Hashtable键值对集合
在键值对集合中,是根据键去找值的
例如通过字典找字 sun --> 孙,拼音是“键”,找出来的字是“值”
键值对对象[键]=值;
注意***:键值对集合当中,键必须是唯一的,而值是可以重复的
7、var推断类型
var:能够根据值推断出来类型
C#是一门强类型语言:在代码当中,必须对每一个变量的类型有一个明确的定义
//int n = 15;
js是一门弱类型语言:会根据值对类型做出判断(ps:B站就是因为使用了弱类型语言导致了一次崩溃。具体详见:BV18U4y1B7nA)
//12 3.14 true "fdfds" 'c' 都能用var
8、foreach循环
语法:
foreach (var item in collection) {
}
//item表示集合中元素的标识符,collection表示集合
9、Path类
常用的Path.方法:
//获得文件名
Path.GetFileName(str);
//获得文件名但是不包含拓展名
Path.GetFileNameWithoutExtension();
//获得文件的拓展名
Path.GetExtension();
//获得文件所在的文件夹的名称
Path.GetDirectoryName();
//获得文件的全路径
Path.GetFullPath();
//连接两个字符串作为路径
Path.Combine(@"c:\a\" , "b.txt");
10、File类
//创建一个文件
//File.Create(@"盘符:\路径\文件名.拓展名");
//删除一个文件
//File.Delete();
//复制一个文件
File.Copy(@“盘符:\路径\要复制的文件名.拓展名” , @"盘符:\路径\复制后的文件名.拓展名")