C#教程 - C#介绍(Introducing C#)
更新记录
转载请注明出处。
2022年9月10日 发布。
2022年9月10日 从笔记迁移到博客。
C#介绍
C#介绍(是什么)
编程语言。特点:
- 微软开发,亲儿子。
- 2002年正式发布。
- 基于.Net(.NET Framework、.NET Core)平台的编程语言。
C#作者
Anders Hejlsberg(安德斯·海尔斯伯格)
C#特点(优势)
- 类似C\C++高效灵活,类似VB可视化编程,类似Java的强大且规范的类库。
- 使用地球最强大的Visual Studio IDE进行高效开发。
- 微软官方首推的编程语言,亲儿子。
- 既保持高效的开发效率,又可以调用Windows底层平台功能。
C#软件的开发与执行过程
-
编译时:编写C#代码,C#编译器编译C#代码生成程序集。
-
运行时:载入程序集中的IL代码到运行时,即时编译器编译中间语言代码(IL)成本机代码,然后执行本机代码。
C#版本更新
说明
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
C# 1.0在2002年发布,实现了基本的面向对象。
C# 2.0
C# 2.0在2005年发布,加入的主要语言特性如下。
Feature | Topic |
---|---|
Nullable value types | Making a value type nullable |
Generics | Making types more reusable with generics |
C# 3.0
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
C# 4.0在2010年发布,加入的主要语言特性如下。
Feature | Topic |
---|---|
Dynamic types | The dynamic type |
Named/optional arguments | Optional parameters and named arguments |
C# 5.0
C# 5.0在2012年发布,加入的主要语言特性如下。
Feature | Topic |
---|---|
Simplified asynchronous tasks | Understanding async and await |
C# 6.0
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
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
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
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
C# 7.3在2018年发布,加入的主要语言特性如下:改进ref变量,指针,stackalloc。
C# 8.0
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#程序的源代码本质是:使用类型(预定义类型、自定义类型)、定义各种类型的交互。
C#源代码最终被编译器编译成程序集,程序集的外在文件表现:exe文件、dll文件。 程序集的主要内容:CIL/元数据/清单。
C#源代码文件后缀
.cs
C#语言语法
构成C#语言的基本语法元素(细节)
- 关键字(Keyword)
- 标识符(Identifier)
- 操作符(Operator)
- 标点符号
- 字面值
- 注释与空白
标识符(Identifier)
标识符概念:字符,人为创造用于指代某物。
标识符规则:首字母只可以是字母或@或_,后续字符可以是字母、数字、下划线。
注意:
- 标识符可以是任何Unicode字符。
- 如果非要将关键字作为标识符,可以使用@做前缀。
- @前缀可以放在任何标识符前面,和没用@前缀是一样的。
标识符命名规范类型:
- Pascal:每个单词的首字符大写,其他字母小写。
- Camel:首个单词字母小写其余单词首字母大写,其他字母小写。
注意:C#的标识符区分大小写(case-sensitive)。
建议:
- 不要使用单词缩写要使用清晰的单词全写。
- 局部变量使用camel风格。
关键字(Keywords)
关键字:为了帮助编译器解释代码,给某些单词(或字符)特别的意义,这些单词(或字符)称为语言的关键字。
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条 或 多条语句。
提示:块后不需要分号结尾。
注释(Comments)
说明
辅助解释说明代码的文本。注释不影响代码编译/执行。
分类
单行(single-line comments)
// 单行注释
多行(multiline comments)
/* 多行注释 */
文档注释(Comments embed XML documentation tags)
/// <summary>
/// 文档注释
/// </summary>
/// <param name="args">参数描述</param>
规范
书写好理解的代码,而不是满篇注释。
文档注释(XML Documentation)
作用:在代码文件中插入文档注释可以在日后直接提取到文档中。
格式:
/// <summary>
/// 文档注释
/// </summary>
/// <param name="args"></param>
常用文档注释标签:
空白
说明:通常空白没有影响,可以增加美观。分类:
- 换行符\n
- 回车符\r
- 空格
- 制表符\t
Main多种形式
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形式,取决于是否需要返回值、是否需要参数。
变量(variable)
变量概念
在计算机中变量代表存储地址,而变量的类型决定了存储在内存中数值的类型。变量名是符号,该符号指代指定的内存区域。变量名是内存区域地址的符号命名,类似房间的门牌号。
声明变量
修饰符 数据类型 变量名;
为什么要声明变量?向编译器申请一块内存区域,并说明内存区域内的数据如何存储,并给内存区域命名。类似住酒店,告诉前台你要多大的房间,几个人入住,房间号多少。
值类型 和 引用类型 的差异
差异
- 值类型内存的变量直接指向存储实际的数据。
- 引用类型变量的内存指向存储的一个引用,该引用指向实际数据区域。
实例:
int var1; //定义值类型变量
int var2; //定义值类型变量
float var3; //定义值类型变量
Dealer theDealer; //定义引用类型变量
示意图:
C#变量分类
名称 | 描述 |
---|---|
本地变量 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回收,直到程序运行结束才会回收。
常量
引用本地类型(Ref Locals)
可以定义本地变量引用的类型:
- 数组的元素(array element)。
- 类型的字段(field)。
- 本地的变量(local variable)。
- 适合场景:减少内存分配,使用引用方式使用值。方法返回引用。
注意:
- 从C# 7版本开始支持。
- 使用的时候双方都需要带ref修饰。
实例:引用类型实例的成员
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/
本文来自博客园,作者:重庆熊猫,转载请注明原文链接:https://www.cnblogs.com/cqpanda/p/16675929.html