目录html
第一次见到 C# 程序可能会有一些奇怪,程序中有一些 {
、}
、[]
这样的符号。然而在逐渐深刻了解 C# 语言的过程当中,对这些符号和 C# 语言特有的其余符号会愈来愈熟悉,甚至会喜欢上它们。程序员
本篇,咱们继续从演示一个简单的程序示例开始,解释该程序的功能和它的各组成部分。同时,介绍一些 C# 语言的基本语法。express
using System; /* 告诉编译器这个程序使用 System 命名空间中的类型 */ namespace ConsoleApp /* 声明一个新命名空间,名称为 ConsoleApp */ { class Program /* 声明一个新的类类型,名称为 Program */ { /// <summary> /// Main 是一个特殊方法,编译器用它做为程序的起始点 /// </summary> static void Main() { int number; /* 声明一个名为 number 的变量 */ // 为 number 赋值 number = 1; // 输出一行文字 Console.WriteLine("C# 语法基础"); // 仍是输出一行文字 Console.WriteLine($"变量 number 的值是:{number}"); } } }
输出数组
C# 语法基础 变量 number 的值是:1
上面程序中每一行代码的做用:框架
第 1 行
: 告诉编译器这个程序使用 System
命名空间中的类型async
第 3 行
: 声明一个新命名空间,名称为 ConsoleApp
ide
- 新命名空间从第 4 行的左大括号(`{`)开始一直延伸到第 24 行与之对应的右大括号(`}`)结束 - 在这部分里声明的任何类型都是该命名空间的成员
第 5 行
: 声明一个新的类类型,名称为 Program
post
- 任何在第 6 行和第 23 行的两个大括号中间声明的成员都是组成这个类的成员
第 10 行
: 声明一个名称为 Main
的方法ui
- `Main` 是一个特殊方法,编译器用它做为程序的起始点
第 12 行
: 声明一个名为 number
的变量this
第 15 行
: 为 number
赋值
第 18 行和第 21 行
: 输出一行文字
关于 C# 的语法,要介绍的内容有不少,咱们从简单的开始。
为了使编译器可以解释代码,C# 中的某些单词具备特殊地位和含义,它们称为关键字。关键字是预约义的保留标识符,对编译器有特殊意义。在上面的代码中,class
,static
和 void
均是关键字。
编译器根据关键字识别代码的结构与组织方式。因为编译器对这些单词有着严格的解释,因此必须将关键字放在特定位置。如违反规则,编译器会报错。
abstract | as | base | bool |
break | byte | case | catch |
char | checked | class | const |
continue | decimal | default | delegate |
do | double | else | enum |
event | explicit | extern | false |
finally | fixed | float | for |
foreach | goto | if | implicit |
in | int | interface | internal |
is | lock | long | namespace |
new | null | object | operator |
out | override | params | private |
protected | public | readonly | ref |
return | sbyte | sealed | short |
sizeof | stackalloc | static | string |
struct | switch | this | throw |
true | try | typeof | uint |
ulong | unchecked | unsafe | ushort |
using | using static | virtual | void |
volatile | while |
上下文关键字用于在代码中提供特定含义,但它不是 C# 中的保留字。 一些上下文关键字(如 partial
和 where
)在两个或多个上下文中有特殊含义。
add | alias | ascending |
async | await | by |
descending | dynamic | equals |
from | get | global |
group | into | join |
let | nameof | on |
orderby | partial(类型) | partial(方法) |
remove | select | set |
unmanaged(泛型类型约束) | value | var |
when(筛选条件) | where(泛型类型约束) | where(查询子句) |
yield |
标识符是一种字符串,开发者用来命名如变量、方法、参数和许多后面将要阐述的其余程序结构。有效标识符必须遵循如下规则:
a-z A-Z
或下划线 _
符号开头。a-z A-Z
,数字 0-9
和下划线 _
符号。!@ $ *.’[]
等),除了下划线 _
。@
”前缀可做为标识符使用,例如:可命名局部变量 @return
相似地,可命名方法 @throw()
。选择简洁而有意义的名称,这使代码更容易理解和重用。要选择清晰(甚至是详细)的名称,尤为是在团队中工做,或者开发要由别人使用的库的时候。
标识符区分大小写。例如,变量名 myVar
和 MyVar
是不一样的标识符。举个例子,在下面的代码片断中,变量的声明都是有效的,并声明了不一样的整型变量。但使用如此类似的名称会使代码更易出错并更难调试,后续须要调试代码的人会很不爽。
// 语法上有效,但很是混乱 int totalCycleCount; int TotalCycleCount; int TotalcycleCount;
标识符有两种基本的大小写风格:
PascalCasing 约定用于除参数名称以外的全部标识符,将每一个单词的第一个字符大写(包括超过两个字母的首字母缩写),如如下示例所示:
PropertyDescriptor
HtmlTag
(在 HtmlTag
中, 因为首字母缩写词 HTML
的长度超过两个字母,因此仅首字母大写。)
这里有一种特殊状况,即遇到两个字母的首字母缩略词时,两个字母都要大写,以下面的标识符所示:
IOStream
camelCasing 约定仅用于参数名称,将除第一个单词以外的每一个单词的第一个字符大写,如如下示例所示。 该示例还显示,以 camelCasing 标识符开始的双字母缩写词都是小写的。
propertyDescriptor
ioStream
htmlTag
标识符命名规范
参考微软官方“框架设计准则”,连接地址:https://docs.microsoft.com/zh-cn/dotnet/standard/design-guidelines/
C# 全部代码都出如今一个类型定义的内部,最多见的类型定义以关键字 class
开头。
类型名称(本例是 Program
)能够随便取,但根据约定,它应当使用 PascalCase 风格。就本例来讲,可选择的名称包括 Greetings
,HelloInigoMontoya
,Hello
或者简单地称为 Program
。
class Program { // ... }
Main
方法Main
方法是 C# 应用程序的入口点。 (库和服务不要求使用 Main
方法做为入口点)。Main
方法是应用程序启动后调用的第一个方法。
static void Main() { // ... }
C# 要求 Main
方法返回 void
或 int
, 并且要么无参,要么接收一个字符串数组。
static int Main(string[] args) { // ... return 0; }
args
参数是用于接收命令行参数的字符串数组,用 System.Environment.CommandLine
获取执行程序所用的完整命令。
Main
返回的 int
是状态码,标识程序执行是否成功。返回非零值一般意味着错误。
虽然 Main
方法声明可进行某种程度的变化,但关键字 static
和方法名 Main
是始终都是须要的。如下是有效 Main
示例:
static void Main() { } static int Main() { } static void Main(string[] args) { } static int Main(string[] args) { } static async Task Main() { } static async Task<int> Main() { } static async Task Main(string[] args) { } static async Task<int> Main(string[] args) { }
{ ... }
通常来讲,全部的 C# 方法都使用花括号标记方法体的开始和结束。这是规定,不能省略。只有花括号({}
)能起这种做用,圆括号(()
)和方括号([]
)都不行。
花括号还可用于把方法中的多条语句合并为一个单元或块。
语句是描述一个类型或告诉程序去执行某个动做的一条源代码指令,C# 一般用分号标识语句结束。每条语句都由代码要执行的一个或多个行动构成。声明变量、控制程序流程或调用方法,全部这些都是语句的例子。
例如,下面的代码是一个由两条简单语句组成的序列。第一条语句定义了一个名称为 var1
的整型变量,并初始化它的值为 5
。第二条语句将变量 var1
的值打印到屏幕窗口。
int var1 = 5; System.Console.WriteLine("The value of var1 is {0}", var1);
语句能够是以分号结尾的单行代码,也能够是语句块中的一系列单行语句。 语句块括在括号 {}
中,而且能够包含嵌套块。 如下代码演示了两个单行语句示例和一个多行语句块:
namespace ConsoleApp { class Program { static void Main() { // Declaration statement. int counter; // Assignment statement. counter = 1; // Error! This is an expression, not an expression statement. // counter + 1; // Declaration statements with initializers are functionally // equivalent to declaration statement followed by assignment statement: int[] radii = { 15, 32, 108, 74, 9 }; // Declare and initialize an array. const double pi = 3.14159; // Declare and initialize constant. // foreach statement block that contains multiple statements. foreach (int radius in radii) { // Declaration statement with initializer. double circumference = pi * (2 * radius); // Expression statement (method invocation). A single-line // statement can span multiple text lines because line breaks // are treated as white space, which is ignored by the compiler. System.Console.WriteLine("Radius of circle #{0} is {1}. Circumference = {2:N2}", counter, radius, circumference); // Expression statement (postfix increment). counter++; } // End of foreach statement block } // End of Main method body. } // End of SimpleStatements class. }
因为换行与否不影响语句的分隔,因此可将多条语句放到同一行,C# 编译器认为这一行包含多条指令。例如,下面的代码在同一行包含了两条语句。
int var1 = 5;System.Console.WriteLine("The value of var1 is {0}", var1);
C# 还容许一条语句跨越多行。一样地,C# 编译器根据分号判断语句结束位置。
System .Console. WriteLine ("The value of var1 is {0}", var1);
程序中的空白指的是没有可视化输出的字符,程序员在源代码中使用的空白将被编译器忽略。但使代码更清晰易读。空白字符包括:空格(Space)、制表符(Tab)、换行符、回车符。
例如,下面的代码段会被编译器彻底相同地对待而无论它们表面上的区别。
// 推荐的格式 class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } }
// 连在一块儿(不推荐的格式) class Program {static void Main(string[] args){Console.WriteLine("Hello World!");}}
为了加强可读性,用空白对代码进行缩进颇有必要。写代码时要遵循制订好的编码标准和约定,以加强代码的可读性。
注释,是代码中的一些“说明性文字”。注释自己不会参与程序的编译和运行,仅仅供程序员阅读。
注释分为:单行注释、多行注释、文档注释。
单行注释的符号是 2 条斜线(请注意斜线的方向),2 条斜线右侧的内容就是注释,左侧的代码不会受影响。
多行注释以“/*”开始,以“*/”结束,之间的内容就是注释,能够包含多行。
文档注释写在类、方法或属性,它的符号是 3 条斜线“///”。
/// <summary> /// XML(文档)注释 /// </summary> /// <param name="args"></param> static void Main(string[] args) { // 单行注释 var item = (Name: "eggplant", Price: 1.99m, perPackage: 3); /* 多行注释(能够写一行,也能够写多行) */ var date = DateTime.Now; /* 多行注释 注释注释 注释 */ Console.WriteLine($"On {date}, the price of {item.Name} was {item.Price:C2} per {item.perPackage} items."); /* * 这样比较好看 * 嗯呢,好看 * 漂亮 */ Console.WriteLine(); Console./*这是有多闲才这么写啊*/WriteLine(); }
编译器会忽略全部的注释,因此生成的程序集中看不到源代码中的任何注释。
一门语言的语法是一套规则,用于管理语言中各有效语句组合在一块儿的方式。
原文连接:https://www.vinanysoft.com/c-sharp-basics/introducing/c-sharp-syntax-fundamentals/