C#基本语法(参考官方文档)
1·注释
- 单行注释 //
- 多行注释 /**/
- 文档注释 ///
- 代码块说明 #region #enregion
- 注释原则:尽量对所有自定义名称说明逻辑含义
2·命名规则
- 定义变量、字段:驼峰命名法,首字母小写,其他单词首字母大写
- 定义方法、类、属性:帕斯卡命名法,每个单词首字母大写
3·数据类型
- 数据类型
- 值类型:int,float,double,char,byte,Boolean,枚举等,存入栈
- 引用类型:Datetime,string,所有类等,存入堆,地址存入栈
- 可空类型:例:int? a;传参时a可空,类型后加一个?表示可空
- 类型转换
- 值类型:小到大自动转,大到小强制转,Convert.To***(),ToString()
- 引用类型:需要继承关系才能转
4·流程控制
- 判断 if else,switch case
- 循环 for,while do
- 遍历 foreach
- 异常捕捉 try catch finally throw
- 非托管资源管理 using{}
5·一维数组
- TYPE[] array=new TYPE[]{};
- 索引从0开始
- 属性Length获取元素个数
- 长度不可变
6·字符串
- 重载运算符
- +拼接字符串但不改变原字符串
- +=拼接并改变原字符串
- str[i]:字符串可以看作是一个自左向右的字符数组
- IndexOf(str,index):从index的位置开始查找并返回str第一次出现的位置,没找到返回-1
- Replace(oldstring,newstring):替换字符串
- Trim():去掉左右侧空格,TrimStart()、TrimEnd()
- SubString(index,length):从index开始截取长度为length的字符串,省略length表示截取到末尾
7·DateTime时间类
- 属性Now:获取当前时间
- TimeSpan类:时间差值计算,属性为返回值形式(时、分、秒)
8·.NET程序执行的过程
graph LR
A[.NET源代码管理] -->|预编译|B(语言编译器)
B -->C(MSIL+元数据)
C -->D(CLR 公共语言运行时)
D -->E(机器代码)
D -->D1(管理内存)
D -->D2(代码安全验证)
D -->D3(跨语言互动集成)
D -->D4(JIT编译器)
D -->D5(垃圾回收机制)
D -->D6(异常收集)
E -->F[被执行]
CLR(公共语言运行时)是.NET程序运行的核心,.Net程序通过语言编译器编译后,不再由线程负责执行和监控,而是托管给CLR
9·预处理命令
- 预处理命令列表
指令 | 描述 |
---|---|
#define | 允许将字符定义为一个符号 |
#undef | 取消定义符号 |
#if | 条件指令,测试符号是否为真 |
#else | 创建符合条件指令,配合#if |
#elif | 创建符合条件指令,配合#if |
#endif | 指定一个条件指令的结束 |
#line | 允许修改编译器的行数以及(可选地)输出错误和警告的文件名 |
#error | 允许在代码指定位置生成一个错误 |
#warning | 允许在代码的指定位置生成一个一级警告 |
#region | 允许在使用 Visual Studio Code Editor 的大纲特性时,指定一个可展开或折叠的代码块 |
#endregion | 标识#region的结束 |
#pragma | 为编译器给出特殊指令以编译它所在的文件 |
- 预处理命令使用示例
- #define
#define symbol //#define 预处理器指令创建符号常量;作为表达式传递给#if时返回true
- #if #else #endif
#define PI
using System;
namespace PreprocessorDAppl
{
class Program
{
static void Main(string[] args)
{
#if (PI)
Console.WriteLine("PI is defined");
#else
Console.WriteLine("PI is not defined");
#endif
Console.ReadKey();
}
}
}
//输出结果:PI is defined
#define DEBUG
#define VC_V10
using System;
public class TestClass
{
public static void Main()
{
#if (DEBUG && !VC_V10)
Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && VC_V10)
Console.WriteLine("VC_V10 is defined");
#elif (DEBUG && VC_V10)
Console.WriteLine("DEBUG and VC_V10 are defined");
#else
Console.WriteLine("DEBUG and VC_V10 are not defined");
#endif
Console.ReadKey();
}
}
//输出结果:DEBUG and VC_V10 are defined
- #warning #error
当编译器遇到它们时,会分别产生警告或错误。如果编译器遇到 #warning 指令,会给用户显示#warning
指令后面的文本,之后编译继续进行。如果编译器遇到#error
指令,就会给用户显示后面的文本,作为一条编译错误消息,然后会立即退出编译。使用这两条指令可以检查#define
语句是不是做错了什么事,使用#warning
语句可以提醒自己执行某个操作。
#if DEBUG && RELEASE
#error "You've defined DEBUG and RELEASE simultaneously!"
#endif
#warning "Don't forget to remove this line before the boss tests the code!"
Console.WriteLine("*I hate this job.*");
- #line
#line 指令可以用于改变编译器在警告和错误信息中显示的文件名和行号信息,不常用
#line 164 "Core.cs" // 在文件的第 164 行
// Core.cs, before the intermediate
// package mangles it.
// later on
#line default // 恢复默认行号
- #pragma
只有两种#pragma warning
和#pragma checksum
- #pragma warning:可以启用或禁用特定警告
// pragma_warning.cs using System; #pragma warning disable 414, CS3021//禁用编号为414和3021的警告 [CLSCompliant(false)] public class C { int i = 1; static void Main() { } } #pragma warning restore CS3021 //启用编号为3021的警告 [CLSCompliant(false)] // CS3021 public class D { int i = 1; public static void F() { } }
- #pragma checksum
参数#pragma checksum "filename" "{guid}" "checksum bytes"
“filename”
需要监视更改或更新的文件的名称。
“{guid}”
哈希算法的全局唯一标识符 (GUID);
“checksum_bytes”
表示校验和字节的十六进制数字的字符串。 必须是偶数个十六进制数字。 奇数个十六进制数字会导致编译时警告出现,且指令遭忽略。class TestClass { static int Main() { #pragma checksum "file.cs" "{406EA660-64CF-4C82-B6F0-42D48172A799}" "ab007f1d23d9" // New checksum } }