注意:这是我学C#(面向过程部分)的一些学习笔记,知识点繁多,有点琐碎,不过对于0基础的人看看还是不无裨益的
1)解决方案中可以包含多个项目,项目可以包含多个文件,文件有命名空间,命名空间里有类,类里有方法。方法里是我们写的程序。类文件以.cs结尾。解决方案以.sln结尾。项目文件以.csproj。一般打开解决方案。
2)using System;引用命名空间
namespace 定义一个命名空间
class 定义了一个类
Main 方法。Main方法是我们程序的入口方法,一般情况下有且只有一个Main方法
3)Console.WriteLine("");向屏幕输出。快捷输入,cw+tab键
Console.Write("");不是另起一行
Console.ReadKey();停留等待用户从键盘输入,用户输入后,程序继续执行。
在c#中,每一句话以分号结束
生成(快捷键F6)能帮我们检测是否有语法错误
4)一些基本设置:①重置开发环境:可以使我们的开发工具恢复默认状态,工具→导入导出→重置开发环境。一般窗口关闭在视图中找;
②设置vs中的字体及大小:工具→选项
行号显示:工具→选项→文本编辑器→所有语言→行号打勾
③启动项的设置:右键解决方案→属性→当前选定内容
5)c#中的注释:对我们写的程序进行解释,注释给人看的
第一种:单行注释:以//开始,到本行结束
第二种:多行注释:结束
第三种: 文档注释:
用于对类和方法进行注释,在类和方法前面连续输入///
6)下面一对指令,可以折叠一段代码:
#region和#endregion
7)一些常用类型:
数值,整型 int 10 (范围正负二十多亿)
非整数: double 3.14
非整数:decimal (财务)
非数值:char(字符型)只能存储一个字符,并且要求要用单引号 不能没有字符
String (字符串类型) 字符串,就是把0个或1个字符串链接起来,字符串用双引号
decimal:存储金钱 decimal的精度大于double
在c#环境开发环境中,直接写一个由小数点的数字,这个数字是double类型的。decimal在小数后面要加m或M
1.先声明,再赋值 int a;a=3;
2.定义变量时,直接赋值。int a=3;
3.一次声明多个同类型的变量,多个变量名称之间用逗号分隔,最后用分号结束
变量一定要,先声明,后赋值,最后使用(取值或者调用或者写这个变量名)
9)变量的命名规则:
1 必须以“字母”_下划线或者@符号开头(不能以数字开头)。
2 后面可以跟任意“字母”数字,下划线。
注意:
1 你起的变量名不要与c#系统中的关键字重复。
2 在c#中大小写是敏感的。
3 同一个变量名不允许重复定义(先这么认为,不严谨)
定义变量时,变量要有意义,要见名知意。
10)c#变量名编码规范
Camel 命名法:
首个单词的首字母小写,其余单词第一个字母都大写
Pascal 命名规范:每一个单词第一个字母都大写
如果使用到英文单词的缩写,全部用大写!
在方法Main中定义变量,要使用Camel命名法。
Camel命名法:例如:studentName zsAge 只有一个单词,首字母小写,如;mane
Pascal命名规范:每一个单词第一个字母都大写如:SoftwareName,SystemVcrsion
11)“+”在c#中有两种意义
1 是数学中的加法运算;两边参与加法运算的数据类型为数字类型(int,double,decimal),则“+”表示数学上的加法意义
2 是链接的意思:两边参与加号运算的数据,有一个是字符类型,那么这个“+”就是连接的意义
12)占位符:由{数字}组成,数字由0开始编号
第一个占位符;{0}
第二个占位符;{1}
第三个占位符:{2}
......
占位符可以重复使用,有多个参数时,输出都是第一个参数中的内容,从第二个参数开始,都是用来替换第一个参数中的占位符的值,所以从第二个参数开始,要不要输出,就要看第一个参数中有没有相关的占位符,参数与参数之间用逗号隔开
13)转义字符:当我们需要在字符串中输入一些特殊字符时,比如:半角引号,换行,退格时就需要使用转义字符,转义字符是一个字符,他由一个+一个字母组成具有特殊意义的一个字符。
常用的转义字符:
n 换行;
b (backspace)退格
t tab键 由多个空格组成的一个字符,具有行与行之间的对齐功能
\表示一个
在字符串前加一个@符号有两种意义:
1 字符串中如果有,则不再理解为转义符;
2 使字符串可以转行
如果字符串前面加了@符号,在字符串上用两个双引号代表一个双引号
14)在c#中有五个算术运算符:+ - * / % 他们都是二元运算符,要求:参与的两个操作数的类型必须相同,并且经过运算后的结果也与操作数的类型相同。
在算术表达式中,如果要改变计算的优先级,用小括号,小括号可以无限极的出现,但必须成对出现。
15)发生自动转换的条件:
1 参与运算的两个数据类型必须相兼容
2 必须一边的数据类型表示范围小,一边的范围大,并且把小的转向大的不丢失精度。
当需要丢失精度的转换时,系统是不会帮我们自动转换,需要我们程序员来写代码完成转换,转换语法为:(数据类型名)待转换的值
强制类型转换,类型必须兼容
把字符串转换成数字int 变量名= Convert.Tolnt32(待转字符串)
把待转字符串转化成int类型后赋给变量。
16)try-catch的使用(简单用法)
try
{
有可能出现错误的代码;
}
catch
{
如果try中的代码出现异常,则进去catch中
}
如果try中的代码没有出错,则程序正常运行try中的内容后,不会执行catch中的内容,如果try中的代码一旦出错,程序立即跳入catch中去执行代码,那么try中的出错代码后面的代码不再执行了。
17)二元运算符
b=a++-10中,a取原值减10等到b值,然后a再自加1
b=++a-10中,a先自加1然后减10等到b值
一元运算符++或--比二元运算符优先级高
a=a+3←→a+=3 同理可得 -= *= /= %=
能够改变变量中的值的运算符:= ++ -- ==(等于),!=(不等于)
18)逻辑运算
逻辑与运算
表达式1&&表达式2
逻辑与连接的两个表达式,要能够求解成booll类型,一般情况下都是关系表达式。
整个逻辑与运算的结果也是bool类型
当两个表达式都为ture,其结果为ture,否则为false
逻辑或运算
表达式1||表达式2。两边只要有一个是true,其结果为true
逻辑非!
(取反)这是一个一元运算符。用法:!(布尔类型的表达式)
&&的优先级大于||
19)C#中结构大体可以分为三类:顺序结构,分支结构(判断结构),循环结构
分支结构(判断结构)
① if结构
基本语法:
if(条件)
{
语句1;语句2;
}
执行过程:首先判断条件的结果,如果条件为true,则执行语句1,如果条件为false,则跳过语句1,执行后面的语句。
注意:1 if后面括号中的条件,要能计算成一个bool类型的值。
2 默认情况下,if语句只能带1句话,即和if语句有关系的语句只有语句1
if-else结构
语法:
if(条件)
{语句1;}
else
{语句2;}
执行过程:
如果条件为true,则执行if后的语句,跳过else语句,如果条件为false,则跳过if后的语句,执行else后的语句。
else与离他最近的if是一对
② switch-case
语法:
switch(表达式/变量)
{
case 值1: 语句块1;
break;
case 值2: 语句块2;
break;
default:语句块3;
break;
}
匹配项和default的位置没有关系,只和值有关系
20)循环结构
① while循环
语法:
while(循环条件)
{
循环体;
}
执行过程:
1 先判断循环条件,如果条件为true,则转向2,如果条件为false,则转向3
2 执行循环体,循环体执行完后,转向1
3 跳出循环,循环结束
注意:在循环体中一定要有一句能够改变循环体中的某个变量的值,使循环条件为false
n次循环,如果i从0开始,则循环条件为i
n次循环,如果i从1开始,则循环条件为i<=n
不要忘了写改变循环体中的条件(i++)避免死循环
特点:while先判断,再执行
② do-while循环
语法:
do{循环体;}
while(条件);
执行过程:
1 执行循环体,执行完转向2
2 判断条件是否成立,如果条件为true,则转向1,如果条件为false,则转向3
3 跳出循环,循环结束。
假如循环条件一开始就不成立,对于while循环,一次都不会执行,对于do-while循环体会执行一次,所以do-while循环体至少会执行一次。
特点:do-while为先执行,再判断
③for循环
语法:
for(表达式1;表达式2;表达式3)
{循环体;};
已知循环次数,可以用for循环
一般情况下,表达式1用于定义循环变量和对循环变量赋初值
表达式2 循环条件
表达式3 用于改变循环变量的值
执行过程
1 执行表达式1,转向第2步
2 计算表达式2 如果表达式的值为true,转向第3步,如果表达式2的值为false,转向第n步
3 执行循环体 转向第4步
4 执行表达式3 转向第2步
5 循环结束
21)break和continue;
break
1 可以用于switch-case判断中。用于跳出switch
2 用在循环中,用于立即跳出(终止)循环
注意:在循环嵌套中,break跳出的仅仅是break所在循环中
continue;
用于循环中,程序一旦执行到continue语句,立即结束本次循环(就是不再执行循环体中continue下面的语句了)直接进行下一次循环(do-while/while直接进行下一次循环条件的判断,如果条件成立,则再次进入循环,对于for循环,先执行表达式3,再判断循环条件是否成立)
22)三元表达式:表1?表2:表3
执行过程:
首先计算表达式1,表达式1应该是一个能够计算成bool类型的值,如果表达式1的值为true,则表达式2的值做为整个表达式的值,如果表达式1的值为false,则表达式3的值为整个表达式的值。
表达式2和表达式3的类型一定要相同或相兼容!
23)常量:(不可改变的量)
语法:
const 类型 常量名 = 常量值;
常量只能在初始化时赋值,其他过程不能赋值
24)枚举
让我们定义一种枚举类型,并且在定义这种类型时我们要指定这个类型的所有值。
语法:
enum 自己定义的类型名称{值1,值2,值3,...值n};
枚举的定义,一般和类定义在同一个级别,这样在同一个命名空间下的所以类型都可以使用这个枚举了。
枚举的作用:
1 限制用户不能随意赋值,只能在定义枚举时列举的值中选择
2 不需要死记每一个值是什么,这需要选择相应的值。
注意:定义枚举时,值不能是int类型
枚举类型的变量都可以强制转换成int类型。
枚举的值在定义时是有一个默认编号的,编号从0开始
如何把一个字符串转换成枚举类型:
(自己定义的枚举类型)(Enum.Parse( typeof(自己定义的枚举类型),"带转换的字符串");
25)结构
为什么要使用结构(类一个层次)
1 为了存储一个人的信息,要声明一组变量,当我们存储n个人的信息时,就要声明n组变量,麻烦
2 存储一个人信息的这几个变量间没有关系,容易乱
语法:
访问修饰符 struct 结构名
{
定义结构成员
}
例如:
public struct Person
{
public string Name;
public int Age;
public string Hobby;
public int Popularity;
public void SayHi()
{
// ….
}
}
定义好一个结构后就可以直接声明相应的变量了,声明好变量后,通过 变量名.成员名 就可以访问变量了。
26)数组:可以帮我们一次声明多个同类型的变量,这些变量在内存中是连续存储的。
数组声明语法:
数据类型[]数组名=new数据类型[数据长度];
例如:int[]score=new int[5];就声明了一个长度为5的数组,数组名叫score
通俗点说:就是声明了一个数组,里面包含5个lnt类型的变量,这5个变量叫做数组的元素
如何访问数组:通过下标(索引)来访问数组,
比如,我们要向第0个元素赋一个3,就可以这么写:score[0]=3;
简便方法:int[]number={1,2,3}
通过 数组名.Length 可以获得数组的长度
① 数组中一共N个元素进行头尾交换
1 交换n/2
2 在一个循环中,第i个元素与第length-i-1进行交换
string temp;
for(inti-0;i
{
//交换数据
temp=numbers[i];
temp=numbers[i]=numbers[numbers.Length-i-1];
numbers[numbers.Length-i-1]=temp;
}
//输出
for(int i=0,i
{
Console.WriteLine(numbers[i]);
}
②数组元素倒输出
for(int i=numbers.length-1;i>=0;i--)//先给i赋了一个数组长度-1也就是最大下标的数字,对应的是最后一个数字,然后i--
{
Console.WriteLine(numbers[i]);
}