一、C#概述

本文是网页版《C# 12.0 本质论》第一章解读。欲完整跟踪本系列文章,请关注并订阅我的Essential C# 12.0解读专栏。

前言

第一章的内容非常简单,毕竟仅仅是Introducing C#。不过正如《0.前言》所述,《C# 12.0本质论》本身就不是一本零基础的书,也不像教材,材料的组织并非循序渐进。如果阅读这一章时感觉困难,就需要考虑换一本更浅显易懂的教材(比如本章最后推荐的《Pro C# 10 with .NET 6》)。

我一直秉承授人以鱼不如授人以渔的理念,重点不在于具体知识陈述,而在于学习资源的分享。所以,本文不对原书第一章内容做任何复述,而是重点介绍一组权威资料,让大家遇到问题时知道到哪里去找权威答案。

.NET架构

先借用一张图说明一下C#运行环境及.NET架构。这张图主要说了几个概念:

  1. C#源代码经过托管编译器(csc.exe)编译后,生成Managed Module;
  2. Managed Module包含了IL代码和元数据Metadata
  3. Managed Module执行的时候首先被加载器loader加载到内存,然后运行时编译器JIT再将IL代码编译成本机代码Native Code
  4. 最后,Execute Engine执行本机代码。

在这里插入图片描述

C#语法

国际规范

毫无疑问,微软是C#编程语言的开创者和领跑者,不过在微软推动下,C#早已被ECMA(欧洲计算机制造商协会:European Computer Manufacturers Association)、ISO(国际标准化组织:International Organization for Standardization)及IEC(国际电工委员会:International Electrotechnical Commission)纳入其规范。ECMA负责推动该规范的组织是ECMA C# standard committee (TC49-TG2),第一版规范是《ECMA-334:2003》,与之对应,ISO/IEC规范是《ISO/IEC 23270:2003》,该规范对应于微软的C#语言第一版(C#1.0)。

最新版的正式规范是《ECMA-334:2023》和《ECMA-334:2023》,对应于微软的C#7.0。

如今,ECMA正在起草C# 8规范,可以通过这里查看最新标准草案的更新情况。

标准有什么用?很多时候,我们学习一门语言并不需要通读C#标准,因为标准就如同一本康熙字典,谁都不愿意通过查字典方式来学习汉字。不过,身边有一本字典备用还是非常有用的,比如教科书中经常有如下所示的C#语法描述:

C#被编译时,编译器会将连续的空白字符合并成一个空白,然后以空白作为分隔符,提取出源文件中的标记(Token)进行词法分析。

这种描述其实还不是很清晰,比如:除了空格以外,水平制表符或垂直制表符算不算空白?Unicode或ASCII码中还有许多其他无显示符号,比如ASCII编码00h~1Fh基本都不会有任何屏幕显示,他们算不算空白?

在这种情况下,如果真想较真,将空白彻底搞清楚,查标准就是最权威最有效的手段了。在《C# 8 draft specification - Grammar》中,我们可以查到如下ANTLR描述:

// Source: §6.3.4 White space
Whitespace: [\p{Zs}]  // any character with Unicode class Zs| '\u0009'  // horizontal tab| '\u000B'  // vertical tab| '\u000C'  // form feed;

于是我们就知道了,空白符其实包括四种:首先是Unicode中分类为Sz的字符,另外还包括水平制表符’\u0009’ ,垂直制表符 ‘\u000B’ 和换页符 ‘\u000C’ ,其他符号都不算空白符。

所以,如果我们的C#程序编译时发生错误,提示出现非法字符,我们就需要用十六进制编辑器看看源文件中是否包含了非法字符。至于第一条列示的Unicode的Sz类字符到底有哪些?有兴趣就继续查,否则起码要记住Sz字符包含空格符 ‘\u0020’ 和不间断空格 ‘\u00A0’ 。

题外话:C#语言是建立在.NET框架基础上的编程语言,.NET框架也有对应的ECMA标准(《ECMA-335》),只不过ECMA-335将.NET框架称为CLI。如果您阅读教科书时遇到看不懂术语如CTS(Common Type System) / CLS(Common Language Specification) / 执行引擎 (Excution Engine EE),或者您想想学习.NET中间语言 CIL(微软称为MSIL),或想了解 .NET平台至少需包含哪些库,或想了解程序集文件格式,那么就有必要下载一份ECMA-335备用。

小节

规范是参考手册,其完整性、权威性超过任何教科书,只不过其可阅读性比较差。

微软的C#

国际标准永远滞后于实际实现。目前最好用的C#当然是由微软SDK提供。如今,微软C#版本已经更新到了13.0,其.NET平台也正式发布了.NET8,而ECMA和ISO标准还是C#7.0的。

所以,学习C#,最常使用的还是微软官方文档,比如C# Documentation网页。微软版本是ECMA标准的超集,但其首先实现了ECMA标准的所有规定。

IDE是否必须?

在本系列文章中,将使用传统.NET Framework框架开发的程序称为旧框架程序,而将使用.NET5.0 ~.NET8.0框架开发的程序称为现代.NET程序。两者最大的差异在于,.NET Framework程序只能运行于Windows环境下,不能跨平台,其可执行文件扩展名是 .exe;现代 .NET应用程序是跨平台的,其生成的可执行文件扩展名是 .dll文件,需要在dotnet CLI命令行下执行。

当前,Windows环境下,最常用的开发环境是Visual Studio 2022,简称VS。VS作为IDE,包含了.NET SDK和图形化编辑器、调试器。如果不安装VS,仅仅安装SDK,也完全可以开发C#应用程序的,只不过需要使用 dotnet CLI命令,需要自己选择编辑器,也没有了调试支持。

所以,安装VS并非必须,但安装SDK则是必须。

.NET SDK

.NET SDK是微软.NET软件开发包,该包里主要包括如下四个部分:

  1. .NET基础库
  2. .NET基础框架
  3. .NET 运行时(CLR)
  4. .NET相关工具

.NET基础库(BCL)如同C++开发库一样,提供了.NET编程可以直接调用的很多函数库,比如我们写Console.WriteLine(),这个Console类及其WriteLine方法就来自于.NET基础库。
.NET基础框架提供了不同应用程序的不同模版,比如我们可以使用C#开发控制台应用程序,也可以开发类库(DLL),或WinForm或WPF或ASP.NET应用等等,这些不同类型的应用,就对应了不同的基础框架。
.NET运行时,一般我们会看将运行时称为CLR,这是微软的叫法,在ECMA标准中被称为执行引擎EE,可以简单将CLR想象成一个虚拟机,.NET程序执行时,会先启动一个虚拟机,然后通过虚拟机执行只有虚拟机可以读懂的以MSIL语言表示的程序,虚拟机负责最终将MSIL编译成实际计算机可以识别的真正CPU指令。
.NET相关工具,最主要的是dotnet CLI命令,另外还包括了很多其他工具,比如C#编译器csc,Ms Build工具,MSIL开发语言编译器ILasm,IL反汇编器DASM等。

以上四个部分中,只有第三项是和开发无关,但和运行相关。也就是说,如果我们开发了一个.NET应用,拷贝给朋友时,如果它的电脑中未安装SDK,也未安装.NET运行时,那么程序会提示当前电脑没有安装.NET运行时,并提示下载安装。其余的1、2、4项都只和开发应用程序有关。

C# 语法补充

上面通过介绍ECMA标准,列出了完整C#语法。下面对C#语法中部分重要概念进行一下补充说明。

标记(Token)

C#编译时,首先查找C#标记,然后再对标记进行组合与分析。所以,标记是编译器的概念。C#标记包括标识符、关键字、字面值、操作符和标点符号五种,前面说过的空白不属于标记,但空白可以用来作为标记的分隔符。

token: identifier| keyword| Integer_Literal| Real_Literal| Character_Literal| String_Literal| operator_or_punctuator;

其中标识符就是我们自己定义的变量名、类型名等符号,比如int myInt = 3中的myInt就是标识符。有关标识符的使用规则其实挺复杂的,不过大家基本都掌握了。如果想看详细要求,可以查这里。

关键字是C#语法中有特殊含义的标记,比如 int, string, private等。字面量就是数据,比如:3, ‘a’, “Hello, world!”, 3.14等。

表达式(Expression)

表达式是C#语法的概念。一个表达式由一系列操作符和操作数构成。表达式必须有返回结果,表达式的返回结果包括如下几种:

  • 一个数值:比如:int x = 3 的结果是数值3
  • 一个变量:比如:int x;表达式返回一个变量x
  • null
  • 一个匿名方法
  • 一个元祖
  • 一个属性类型
  • 一个索引器值
  • 空:当一个表达式是一个对void返回类型的调用时,其返回值是空

表达式常常是构成语句的组件,但并非所有表达式都可以构成语句!

语句(Statement)

语句是构成C#程序的常用组件。表达式语法如下:

statement: labeled_statement| declaration_statement| embedded_statement;embedded_statement: block| empty_statement| expression_statement| selection_statement| iteration_statement| jump_statement| try_statement| checked_statement| unchecked_statement| lock_statement| using_statement| yield_statement| unsafe_statement   // unsafe code support| fixed_statement    // unsafe code support;

表达式可以嵌套,所以存在embedded_statement。

根据以上语法,我们就可以明白,C#语句在语法上和C/C++是不同的,C/C++中,印象是允许所有表达式加上分号都可以构成合法语句,比如x+y; 但C#不行,比如:

//C#程序int x = 1;int y = 2;x + y;  //非法表达式
Error	CS0201	Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement

但以下C或C++程序就合法,最终执行结果是x为7,y为6。

//C/C++程序
int main()
{int x = 1, y = 5;x + y;x = (x = x + 1, 55, ++y+1);
}

以上示例,再次证明:遇到问题时查标准是解决问题的最佳路径。

进阶学习资料

  1. Essential C# 12.0网页版;
  2. 适用于初学者的C#视频教程;
  3. 微软C#门户
  4. C#语言参考;
  5. .NET API门户;
  6. Framework design guidelines;
  7. Visual Studio 2022门户;
  8. .NET / Runtime源码;
  9. .NET Source Browser
  10. MSIL入门 by Vijaymukhi;
  11. PE文件格式与Metadata by Vijaymukhi;
  12. ECMA-334 C# Language Specification
  13. ECMA-335 Common Language Infrustructure;

本章点评

通过第一章的阅读,我日益感觉到《Essential C# 12.0》确实不适合做入门教材,它更像是一本复习提纲。
作者对C#的理解深度与广度毋庸置疑,但为了照顾篇幅,很多概念都是在毫无铺垫情况下直接引入,而且缺乏举例,读起来十分晦涩。

所以,我为大家推荐另外一本更适合作为C#入门书籍,它就是Andrew Troelsen的畅销书《Pro C# 10 with .NET 6》,我个人也是通过这本书了解的C#,网上可以找到电子版。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rv1126利用rkmedia、opencv、rockx……完成人脸识别

一、总体框架 视频采集、处理使用rkmedia:vi模块进行视频输入、rga模块进行视频处理 人脸识别:先获取rga输出码流,再调用rkmedia的模型对人脸进行推理(线程1) 打框框:opencv(线程2&#xff0…

Golang | Leetcode Golang题解之第264题丑数II

题目&#xff1a; 题解&#xff1a; func nthUglyNumber(n int) int {dp : make([]int, n1)dp[1] 1p2, p3, p5 : 1, 1, 1for i : 2; i < n; i {x2, x3, x5 : dp[p2]*2, dp[p3]*3, dp[p5]*5dp[i] min(min(x2, x3), x5)if dp[i] x2 {p2}if dp[i] x3 {p3}if dp[i] x5 {p5…

艾迈斯欧司朗与greenteg推出的突破性体温监测技术已成为全球铁人三项的关键技术支持

中国 上海&#xff0c;2024年7月22日——全球领先的光学解决方案供应商艾迈斯欧司朗&#xff08;瑞士证券交易所股票代码&#xff1a;AMS&#xff09;今日宣布&#xff0c;与知名合作伙伴greenteg携手推出的CORE传感器为耐力运动领域带来新变革——其体温监测技术已成为全球铁人…

分类预测 | Matlab实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多特征分类预测/故障诊断

分类预测 | Matlab实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多特征分类预测/故障诊断 目录 分类预测 | Matlab实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多特征分类预测/故障诊断分类效果基本介绍程序设计参考资料 分类效果 基本介绍 Matlab实现BES-LSSVM秃鹰算法优化最…

使用wireshark第一次捕获数据包

打开wireshark&#xff1a; 点击捕获&#xff0c;选项。 这里我选择以太网&#xff0c;然后点开始&#xff1a; 然后就成这样了&#xff1a; 点击左上角那个红色的按钮&#xff0c;可以暂停捕获&#xff0c;就变成了下面的样子&#xff1a; 这三个框有自己的名字&…

721.力扣每日一题7/15 Java(并查集)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 解题思路 解题过程 时间复杂度 空间复杂度 Code 解题思路 本题的…

有什么图片转word 免费软件?6个软件帮助你快速转换文件

有什么图片转word 免费软件&#xff1f;6个软件帮助你快速转换文件 转换图片到Word文档的免费软件通常包括一些在线工具和桌面应用程序&#xff0c;它们可以帮助用户将图片中的文本提取并转换为可编辑的Word格式。以下是六个推荐的免费软件&#xff1a; 迅捷文字识别&#xff…

【深度学习教程】

文章目录 pytorch官方教程知识蒸馏&#xff1a;https://pytorch.org/tutorials/beginner/knowledge_distillation_tutorial.html 李宏毅-机器学习/深度学习https://speech.ee.ntu.edu.tw/~hylee/ml/2021-spring.phphttps://speech.ee.ntu.edu.tw/~hylee/ml/2022-spring.phphttp…

【LeetCode】day18:530 - 二叉搜索树的最小绝对差, 501 - 二叉搜索树中的众数, 236 - 二叉树的最近公共祖先

LeetCode 代码随想录跟练 Day18 530.二叉搜索树的最小绝对差501.二叉搜索树中的众数236.二叉树的最近公共祖先 530.二叉搜索树的最小绝对差 题目描述&#xff1a; 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&am…

基于组态王和S7-200实现传感器连接的简单人机界面

在当今社会&#xff0c;工业自动化正以前所未有的速度发展&#xff0c;成为推动经济增长和提升生产效率的关键因素之一。随着科技的不断进步&#xff0c;自动化不仅仅是制造业的专利&#xff0c;也逐渐渗透到农业、交通、建筑等各个领域&#xff0c;为人们的生活带来了诸多变革…

星际漫游闪耀LEC授权展,COSMOSPANDA星际熊猫与BUNBUNX包小冥共绘国潮新篇章

上海&#xff0c;2024年7月17日 —— 在全球瞩目的2024年LEC全球授权展上海站盛大开幕之际&#xff0c;星际漫游携其两大国潮明星IP——COSMOSPANDA星际熊猫与bunbunx包小冥精彩亮相&#xff0c;为现场观众带来了一场融合视觉与文化的国潮盛宴。 展位盛况空前&#xff0c;国潮…

uniapp封装请求拦截器,封装请求拦截和响应拦截的方法

首先我们先看一下uni官方给开发者提供的uni.request用来网络请求的api 1 2 3 4 5 6 7 8 9 uni.request({ url: , method: GET, data: {}, header: {}, success: res > {}, fail: () > {}, complete: () > {} }); 可以看到我们每次请求数据的时候都需…

pytest-fixture

资料来源&#xff1a;虫师2020的个人空间-虫师2020个人主页-哔哩哔哩视频 支持类似unittest风格的fixture&#xff0c;即setup和teardown class类中的方法分类 类方法可以直接调用&#xff0c;需要添加装饰器&#xff0c;修改类中的变量 实例方法&#xff0c;需要先实例化&…

【移动应用开发】创建Hello World应用

目录 一、安装Android Studio &#xff08;2023.1.28&#xff09; 二、创建HelloWorld的项目 1. 新建一个项目&#xff0c;选择Empty Views Activity 2. 点击next之后&#xff0c;为项目命名为HelloWorld 3. 点击Finish之后等待项目创建 三、观察项目结构 1. 选择以Proj…

预测性营销与开源AI智能名片商城系统的融合创新:探索数据驱动的营销新纪元

摘要&#xff1a;在当今这个数据驱动的时代&#xff0c;企业面临着前所未有的市场复杂性和消费者行为的快速变化。为了在这样的环境中保持竞争力并实现持续增长&#xff0c;预测性营销已成为企业不可或缺的战略工具。本文深入探讨了预测性营销的基本原理、技术架构及其在市场营…

常用注意力机制 SENet CBAM ECA

在处理脑电信号时通常会用到一些注意力机制,来给不同的脑电通道不同的权重,进而体现出不同脑电通道在分类中的重要性。下面整理几种常见的通道注意力机制,方便以后查阅。 常用注意力机制 SENet CBAM ECA 注意力机制SENet(Squeeze-and-Excitation Network)SENet原理SENet P…

MySQL相关知识

一、什么是数据库&#xff1f; 数据库&#xff08;Database&#xff0c;简称DB&#xff09;概念&#xff1a; 长期存放在计算机内&#xff0c;有组织、可共享的大量数据的集合&#xff0c;是一个 数据“仓库”。 二、数据库的特点&#xff1a; 1.结构化&#xff1a;数据在数…

【leetcode】二分查找本质

标题&#xff1a;【leetcode】二分查找本质 水墨不写bug 正文开始&#xff1a;&#xff08;点击题目标题转跳到OJ&#xff09; 目录 &#xff08;O&#xff09;前言* &#xff08;一&#xff09; 在排序数组中查找元素的第一个和最后一个位置 思路详解&#xff1a; 参考代…

Python 爬虫 获取Instagram用户数据信息 Instagram API接口

爬取instagram用户主页数据信息 详细采集页面如下 https://www.instagram.com/abdallhdev/?hlen 请求API http://api.xxxx.com/ins/profile/username?usernameabdallhdev&tokentest 请求参数 返回示例 联系我们&#xff08;更多接口详见主页专栏&#xff09; 更多精彩…

Redis--12--1--分布式锁---java

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Redis与分布式锁Jedis实现1.RedisConfig2.RedisDistLock3.应用4.加上看门狗逻辑 RedisDistLockWithDog redisson实现1.依赖2.代码 Redis与分布式锁 Jedis实现 1.Re…