目录
1. 变量常量
1.1 变量
1.变量必须在使用前初始化赋值
2.创建变量是类或结构的字段,若没有显示初始化,则默认值为0
1.2 常量
1.常量必须在声明时初始化,指定值后,不能再改
const int a = 10; //总是隐式静态的,不允许常量声明中包含修饰符static
2.常量的值必须能在编译时用于计算,不能从变量中提取的值来初始化常量
2. 预定义数据类型
2.1 值类型和引用类型
值类型存储在堆栈上,引用类型存储在堆上,堆栈的执行效率大于堆的执行效率,堆栈的资源小于堆,不适合处理逻辑复杂大对象。
2.1.1 值类型
1.直接存储值
2.struct, bool, long等都为值类型
2.1.2 引用类型
1.存储对值的引用
2.大多复杂的数据类型,我们自己定义的类都为引用类型
2.2 .Net类型
数据类型的C#关键字(如int, short, string)从编译器映射到.Net数据类型。例如,在C#中声明一个int类型的数据是,声明的实际上是.Net结构System.Int32的一个实例。例如:
//类型实际上仍存储为基本类型,基本类型在概念上用.Net结构表示,所以肯定没有性能损失
string s = i.ToString();
2.3 预定义的值类型
内置的.Net值类型表示基本类型,有以下这些:
byte, int, short, long 整型
float, double 浮点类型
char 字符类型
bool 布尔类型
在C#中,所有数据类型都以与平台无关的方式定义。
2.3.1 整数
示例代码:
//x为十六进制long值
long x = 0x12ab;
//对于uint,int,ulong,long无显示声明,默认都为int,long
uint uu = 123U;//无符号int
long ll = 1234L; //long
ulong ul = 1234UL; //无符号long
2.3.2 浮点类型
decimal不是基本类型,在计算该类型时会有性能损失。
//指定数字为decimal类型,后缀为M
decimal d = 12.30M
2.3.3 布尔类型
bool和整数值不能相互隐式转换,试图用0表示false,则报错。
2.3.4字符类型
char用单引号括起来(例如:'A')。
2.4 预定义的引用类型
C#支持两种引用类型:object(根类型,其他类型都是从它派生来的,包括值类型)和string(unicode字符串)
2.4.1 object类型
Object是最终的父类型,所有内置和用户定义的类型都从它派生而来。
2.4.2 string类型
字符串是不可改变的,修改其中一个字符串,就会创建一个全新的string对象,而另一个字符串不发生任何变化。
//字符串中不能出现未经转义的反斜杠字符
string path = "C:\\test.txt"; //必须为\\,如果是\则报错
string path = @"C:\text.txt"; //加@,则@后面的字符都看为原来的含义
string path =@"This is
a apple"; //允许在字符串字面量中包含换行符
Console.WriteLine($"s1 is {path}"); //在字符串前加上$,就允许把花括号放在包含一个变量或代码表达式的字符串中
3. 程序流控制
3.1 条件语句
3.1.1 if
测试特定条件是否满足。if字句中的表达式必须等于布尔值(Boolean)
3.1.2 switch
比较表达式和多个不同的值,从一组互斥的可执行分支中选择一个执行分支。
//case值必须是常量表达式
int parameters = 1;
switch (parameters)
{
case 1:
Console.WriteLine("one");
break;
case 2:
Console.WriteLine("two");
break;
default:
Console.WriteLine("number");
break;
}
注意:
1. case值必须是常量表达式,不允许使用变量
2. 任何两条case值都不能相同,包括值相同的不同常量
//eng和bri就是值相同的不同变量,不可以这么写,case会报错
string country = "cn";
const string eng = "uk";
const string bri = "uk";
switch(country)
{
case eng:
case bri: //case语句报错
Console.WriteLine("language");
break;
}
3.2 循环
3.2.1 for
for循环在执行下一次迭代前,测试是否满足某个条件,适用于一个语句或者语句块重复执行预定的次数。在每次迭代外部循环时,内部循环都要彻底执行完毕
for(int i = 0; i <= 10; i++)
{
Console.WriteLine(i);
}
3.2.2 while
适用于在循环开始前,不知道重复执行一个语句或语句块的次数。
//只要con这个条件为真,它会重复执行一个目标语句,直到con为false时,它才走紧挨着while语句的下一条语句
while (con)
{
Console.WriteLine("hello");
}
3.2.3 do...while
适用于循环体至少执行一次的情况
//Console.WriteLine("WORLD");会执行一次,然后while判断con值是否为true,为true则执行do循环体中的语句,为false,则跳出循环,执行下一条语句
do
{
Console.WriteLine("WORLD");
} while (con)
3.2.4 foreach
可以迭代集合中的每一项。不能改变集合中各项的值
//item的值不能在foreach循环中改变
foreach(var item in list)
{
Console.WriteLine("FOREACH");
}
3.3 跳转语句
3.3.1 goto(大多数情况下不允许使用)
可以直接跳转到程序中用标签指定的另一行,不能跳转到像for循环的代码块中,不能跳出类的范围,不能退出try...catch块后面的finally块
goto Label:
Console.WriteLine("One");
Label:
Console.WriteLine("One");
3.3.2 break
用于退出for, foreach, while, do... while,switch中的case语句,该语句会控制流执行循环后面的语句。break放在switch语句或者循环外部,会产生编译错误。
3.3.3 continue
用于退出for, foreach, while, do... while,退出循环的当前迭代,开始执行循环的下一次迭代,而不是退出循坏
List<string> list = new List<string>();
foreach(var item in list)
{
if(item.Contains("A"))
{
//退出当前item,进行下一个item遍历
continue;
}
}
3.3.4 return
用于退出类的方法。把控制权返回方法的调用者。方法有返回类型,则return必须返回这个类型的值,如果是void,应使用没有表达式的return语句。
public int NumFun()
{
int i = 0;
return i;
}
public void StringFun()
{
return;
}
4. 枚举
枚举是用户定义的整数类型(值类型),在语法上把枚举当成结构不会造成性能损失,实际上,代码一旦编译好,枚举就成为基本类型。使用枚举的代码易于维护, 代码清晰,易于输入。
public enum TimeOfDay
{
Morning = 0,
Afternoon = 1,
Evening = 2
}
//会返回Afternoon字符串
TimeOfDay time = TimeOfDay.Afternoon;
//从字符串中获取枚举值
//将其从字符串转为数字,要用Enum.Parse()方法
TimeOfDay time2 = (TimeOfDay)Enum.Parse(typeof(TimeOfDay), "afternoon", true);
5.名称空间
1. 名称空间提供了一种组织相关类和其他类型的方式。不允许声明嵌套在另一个名称空间中的多部分名称空间,名称空间与程序集无关,同一个程序集中可以有不同的名称空间,也可以在不同的程序集中定义同一个名称空间中的类型。
2. using语句用来引用名称空间中的类型
6. Main()方法
C#程序是从Main()方法开始运行的,它使用了static修饰符,在任意类中,返回Int或者void类型,给它指定什么访问级别不重要,把它标记为private,它也可以运行。
7. C#预处理器指令
使用预处理器可以禁止编译器编译代码的某一部分,也可以禁止编译器编译与附加功能相关的代码。
预处理器指令的开头都有符号#
7.1 #define和#undef
必须把#define和#undef命令放在C#源文件的开头位置,在声明要编译的任何对象的代码之前。#define本身没什么用,但是与#if结合使用时,功能强大
//告诉编译器存在给定名称的符号DEBUG,类似声明一个变量,但是这个变量并没有真正的值
//若DEBUG符号已经存在,#define不起作用
#define DEBUG
//删除DEBUG符号的定义,若符号DEBUG不存在,则#undef没有任何作用
#undef DEBUG
7.2 #if、#elif、#else、#endif
//这段代码只有在前面有#define DEBUG才执行
#if DEBUG
Console.WriteLine("DEBUG");
#endif
#elif(= else if)和#else指令可以用在#if块中
7.3 #warning、#error
7.4 #region、#endregion
7.5 #line
7.6 #pragma
8. C#编程准则
1. 标识符区分大小写
2. 标识符以字母或下划线开头
3. 不能把C#关键字用作标识符
4.名称使用Pascal大小写首字母大写:EmploySalary(一般用作方法,类名等命名)
camel大小写形式:employSalary(一般用作字段命名)