更新记录
转载请注明出处。
2022年9月10日 发布。
2022年9月10日 从笔记迁移到博客。
编程语言。特点:
Anders Hejlsberg(安德斯·海尔斯伯格)
编译时:编写C#代码,C#编译器编译C#代码生成程序集。
运行时:载入程序集中的IL代码到运行时,即时编译器编译中间语言代码(IL)成本机代码,然后执行本机代码。
C# 8主要用于.NET Core 3和.NET Standard 2.1标准,C# 8部分语言特性只有.NET Core 3实现支持。C# 7主要用于.NET Framework 4.6/4.7/4.8和.NET Core 2.x和.NET Standard 2.0标准。
C# 1.0在2002年发布,实现了基本的面向对象。
C# 2.0在2005年发布,加入的主要语言特性如下。
Feature | Topic |
---|---|
Nullable value types | Making a value type nullable |
Generics | Making types more reusable with generics |
C# 3.0在2007年发布,加入的主要语言特性如下。
Feature | Topic |
---|---|
Implicitly typed local variables | Inferring the type of a local variable |
LINQ | Querying and Manipulating Data Using LINQ |
C# 4.0在2010年发布,加入的主要语言特性如下。
Feature | Topic |
---|---|
Dynamic types | The dynamic type |
Named/optional arguments | Optional parameters and named arguments |
C# 5.0在2012年发布,加入的主要语言特性如下。
Feature | Topic |
---|---|
Simplified asynchronous tasks | Understanding async and await |
C# 6.0在2015年发布,加入的主要语言特性如下。
Feature | Topic |
---|---|
static imports | Simplifying the usage of the console |
Interpolated strings | Displaying output to the user |
Expression bodied members | Defining read-only properties |
C# 7.0在2017年发布,加入的主要语言特性如下。
Feature | Topic |
---|---|
Binary literals and digit separators | Storing whole numbers |
Pattern matching | Pattern matching with the if statement |
out variables | Controlling how parameters are passed |
Tuples | Combining multiple values with tuples |
Local functions | Defining local functions |
C# 7.1在2017年发布,加入的主要语言特性如下。
Feature | Topic |
---|---|
Default literal expressions | Setting fields with default literal |
Inferred tuple element names | Inferring tuple names |
async Main | Improving responsiveness for console apps |
C# 7.2在2017年发布,加入的主要语言特性如下。
Feature | Topic |
---|---|
Leading underscores in numeric literals | Storing whole numbers |
Non-trailing named arguments | Optional parameters and named arguments |
private protected access modifier | Understanding access modifiers |
You can test == and != with tuple types | Comparing tuples |
C# 7.3在2018年发布,加入的主要语言特性如下:改进ref变量,指针,stackalloc。
C# 8.0在2019年发布,加入的主要语言特性如下。
Feature | Topic |
---|---|
Nullable reference types | Making a reference type nullable |
Switch expressions | Simplifying switch statements with switch expressions |
Default interface methods | Understanding default interface methods |
C#程序源代码组成:
编写C#程序的源代码本质是:使用类型(预定义类型、自定义类型)、定义各种类型的交互。
C#源代码最终被编译器编译成程序集,程序集的外在文件表现:exe文件、dll文件。 程序集的主要内容:CIL/元数据/清单。
.cs
标识符概念:字符,人为创造用于指代某物。
标识符规则:首字母只可以是字母或@或_,后续字符可以是字母、数字、下划线。
注意:
标识符命名规范类型:
注意:C#的标识符区分大小写(case-sensitive)。
建议:
关键字:为了帮助编译器解释代码,给某些单词(或字符)特别的意义,这些单词(或字符)称为语言的关键字。
C#所有关键字都是小写。关键字官方文档。
C#中所有关键字:
关键字 | 关键字 | 关键字 | 关键字 |
---|---|---|---|
abstract | enum | long | stackalloc |
as | event | namespace | static |
base | explicit | new | string |
bool | extern | null | struct |
break | false | object | switch |
byte | finally | operator | this |
case | fixed | out | throw |
catch | float | override | true |
char | for | params | try |
checked | foreach | private | typeof |
class | goto | protected | uint |
const | if | public | ulong |
continue | implicit | readonly | unchecked |
decimal | in | ref | unsafe |
default | int | return | ushort |
delegate | interface | sbyte | using |
do | internal | sealed | virtual |
double | is | short | void |
else | lock | sizeof | while |
上下文关键字:只在指定语言结构上下文存在的关键字。
C#中上下文关键字
add | dynamic | join | select |
---|---|---|---|
alias | equals | let | set |
ascending | from | nameof | value |
async | get | on | var |
await | global | orderby | when |
by | group | partial | where |
descending | into | remove | yield |
注意:关键字不可以用作自定义标识符,如果非要用作标识符,可以使用@修饰
class class {...} // Illegal class @class {...} // Legal
注意:如果使用@修饰自定义标识符,是没有影响的,都表示同一个标识符
static void Test() { int @panda = 666; int panda = 666; //error,已在此范围定义了名为“panda”的局部变量 }
提示:@修饰符常用于多种语言编写的.NET库之间的互相操作,可减少关键字冲突。
语句:描述一个类型 或 告诉程序去执行某个动作 的指令。
注意:通常使用分号表示语句结束,但使用分号结尾的不一定是语句(如:using)。
块:由一个成对的大括号包围的 0条 或 多条语句。
提示:块后不需要分号结尾。
辅助解释说明代码的文本。注释不影响代码编译/执行。
单行(single-line comments)
// 单行注释
多行(multiline comments)
/* 多行注释 */
文档注释(Comments embed XML documentation tags)
/// <summary> /// 文档注释 /// </summary> /// <param name="args">参数描述</param>
书写好理解的代码,而不是满篇注释。
作用:在代码文件中插入文档注释可以在日后直接提取到文档中。
格式:
/// <summary> /// 文档注释 /// </summary> /// <param name="args"></param>
常用文档注释标签:
说明:通常空白没有影响,可以增加美观。分类:
public static void Main(); public static int Main(); public static void Main(string[] args); public static int Main(string[] args); public static Task Main(); public static Task<int> Main(); public static Task Main(string[] args); public static Task<int> Main(string[] args);
本质就是参数和返回值的不同而已。返回值是:void / int / Task。参数是:string[] 或者 空。
注意:Main首字母大写。
注意:C#中参数接收的数组第一个元素为接收的第一个值,不是程序名。
如何选择Main形式,取决于是否需要返回值、是否需要参数。
在计算机中变量代表存储地址,而变量的类型决定了存储在内存中数值的类型。变量名是符号,该符号指代指定的内存区域。变量名是内存区域地址的符号命名,类似房间的门牌号。
修饰符 数据类型 变量名;
为什么要声明变量?向编译器申请一块内存区域,并说明内存区域内的数据如何存储,并给内存区域命名。类似住酒店,告诉前台你要多大的房间,几个人入住,房间号多少。
差异
实例:
int var1; //定义值类型变量 int var2; //定义值类型变量 float var3; //定义值类型变量 Dealer theDealer; //定义引用类型变量
示意图:
名称 | 描述 |
---|---|
本地变量 local variable | 在方法作用域内保存的临时数据 |
成员字段 field (instance or static) | 保存类或结构类型自身或实例相关的数据,是类型成员 |
方法参数 parameter (value, ref, out, or in) | 从一个方法传递到另一个方法的临时变量,不是类型成员 |
数组元素 array element | 数组的成员,可以是本地变量,也可以是类型成员 |
本地变量(Local variables) 和 函数参数(Function arguments) 必须手动初始化。其他变量会自动初始化。
变量类型 | 存储位置 | 自动初始化 | 用途 |
---|---|---|---|
本地变量 | 栈或堆 | 否 | 方法内部的变量 |
类类型字段 | 堆 | 是 | 类型或实例的成员字段 |
结构类型字段 | 栈或堆 | 是 | 结构成员字段 |
方法参数 | 栈 | 否 | 实参或形参 |
数组元素 | 堆 | 是 | 数组成员 |
实例:
int var1; int var2 = 17; float var3 = 26.834F; Dealer dealer1; Dealer dealer2 = null;
示意图:
注意:堆也存储静态字段,在程序运行过程中不会被GC回收,直到程序运行结束才会回收。
可以定义本地变量引用的类型:
注意:
实例:引用类型实例的成员
using System; namespace ConsoleApp1 { class TestClass { public string website = "Panda666"; public static int Code = 666; } class Program { static void Main(string[] args) { //引用类的字段成员 TestClass pandaTest = new TestClass(); ref string localWebsite = ref pandaTest.website; localWebsite = "www.panda666.com"; Console.WriteLine(pandaTest.website); //www.panda666.com //引用类的字段成员(静态) ref int localCode = ref TestClass.Code; localCode = 666666; Console.WriteLine(TestClass.Code); //666666 //wait Console.ReadKey(); } } }
实例:引用数组的成员
using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { //引用数组成员 int[] arr = new int[] { 1, 2, 3 }; ref int localIntRef = ref arr[0]; localIntRef = 10; Console.WriteLine(arr[0]); //10 //wait Console.ReadKey(); } } }
实例:引用本地变量
using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { //引用本地变量 string pandaWebsite = "www.panda666.com"; ref string localStringRef = ref pandaWebsite; localStringRef = "panda666.com"; Console.WriteLine(pandaWebsite); //panda666.com //wait Console.ReadKey(); } } }
实例:返回引用本地变量和引用类型参数
static ref string GetWebsite(ref string stringLocalRef) { return ref stringLocalRef; }
实例:和 readonly 结合使用,防止
https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/