Skip to content

Commit c23dab7

Browse files
author
HongLI3
committed
OnAction
1 parent b6967c8 commit c23dab7

File tree

5 files changed

+152
-22
lines changed

5 files changed

+152
-22
lines changed

docs/C#常见编程概念.md

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
# C# 语言特点
2+
3+
C# 是一门运行在.NET Core(CLR)上,既可 JIT,也可 AOT,拥有 GC,静态类型、对空格和缩进不敏感,纯粹面向对象的语言
4+
5+
## 关键字
6+
保留关键字(Reserved Word):在高级语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用
7+
8+
上下文关键字(KWIC):在特定位置才是关键字。 在其他上下文中,都会将其解释为标识符。
9+
10+
## 基本数据类型
11+
12+
13+
C# 中,变量分为以下几种类型
14+
15+
- 值类型:值类型的变量存储数据。值类型隐式继承 ValueType 类型,但不能创建直接从 ValueType 继承的类。
16+
- 简单类型
17+
- 有符号整型:`int``long``short``sbyte`
18+
- 无符号整型:`uint``ulong``ushort``byte`
19+
- 浮点型:`float``double``decimal`
20+
- 字符类型:`char`
21+
- 布尔类型:`bool`
22+
- 枚举类型:`enum`
23+
- 结构体类型:`struct`
24+
- 引用类型:引用类型的变量存储对实际数据的引用。 引用类型也称为对象。
25+
- 类类型(内置引用类型)
26+
- `object`类:在 C# 的 CTS 中,所有类型(预定义类型、用户定义类型、引用类型和值类型)都是直接或间接从 Object 继承的。Object是System.Object类的别名。
27+
所以对象(Object)类型可以被分配任何其它类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。
28+
当一个值类型转换为对象类型时,则被称为装箱(Boxing);另一方面,当一个对象类型转换为值类型时,则被称为拆箱(Unboxing)。除了装箱值类型外,无法将引用类型转换为值类型。
29+
- string类。用于表示文本字符的**顺序**集合,是一个字符序列(零个或更多 Unicode 字符)。是 System.String 类型的别名。
30+
它是从对象(Object)类型派生的。字符串(String)类型的值可以通过两种形式进行分配:引号和@引号。@(称作“逐字字符串”)将转义字符串(\)当作普通字符对待。
31+
@字符串中可以任意换行,换行符及缩进空格计算在字符串长度之内。
32+
- 数组类型:array
33+
- 接口类型:`interface`
34+
- 委托类型:`delegate`
35+
- 动态类型:`dynamic`。可以存储任何类型的值在动态数据类型变量中。 该类型的作用是绕过编译时类型检查, 改为在运行时解析这些操作,因此这些变量的类型检查是在运行时发生的。
36+
dynamic 类型简化了对 COM API、动态 API(如:IronPython 库)和 HTML DOM 的访问。类型 dynamic 的变量会编译为 object 类型变量中。因此,dynamic 只在编译时存在,在运行时则不存在。
37+
38+
!!! tip "dynamic 类型与 object 类型有区别"
39+
虽然 dynamic 类型会编译为 object 类型,但单纯的 object 类型会执行编译时类型检查。在运行时,dynamic 可以隐式的转换成任何类型,并且也可以从其他类型中转换回来。
40+
这导致 dynamic 类型会比 object 类型多一些用法。例如:`dyn = dyn + 3; obj = obj + 3; `前者可以编译,后者会报错。typeof 运算符无法用在动态类型上.
41+
42+
!!! danger "使用 dynamic 类型将增加不安全风险"
43+
dynamic类型允许在运行时更改其类型,因此编译器不能保证这种转换的安全性。而且在运行时需要进行类型检查和转换,相对静态类型性能开销会比较大。
44+
由于dynamic可以访问任何类型的属性、方法、字段,如果使用不当,容易导致安全问题。
45+
46+
- 指针类型:指针类型仅可用于 unsafe 模式。*
47+
48+
void:空类型。对应部分语言中的单元类型(unit)即()。但在C#中该类型被阉割,功能受限。void 不能被用来声明变量。
49+
50+
51+
## C# 程序的通用结构
52+
53+
C# 程序可由一个或多个文件组成。 每个文件都可以包含零个或零个以上的命名空间。 一个命名空间除了可包含其他命名空间外,还可包含类、结构、接口、枚举、委托等类型。 以下是 C# 程序的主干,它包含所有这些元素。
54+
55+
```C#
56+
// A skeleton of a C# program C# 程序的骨架
57+
using System;
58+
namespace YourNamespace
59+
{
60+
class YourClass //
61+
{
62+
}
63+
64+
struct YourStruct // 结构
65+
{
66+
}
67+
68+
interface IYourInterface // 接口
69+
{
70+
}
71+
72+
delegate int YourDelegate(); // 委托
73+
74+
enum YourEnum
75+
{
76+
}
77+
78+
namespace YourNestedNamespace
79+
{
80+
struct YourStruct
81+
{
82+
}
83+
}
84+
85+
class YourMainClass
86+
{
87+
static void Main(string[] args)
88+
{
89+
//Your program starts here...
90+
}
91+
}
92+
}
93+
```

docs/Rust安装与配置.md

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Rust 安装
1+
# Rust 安装与配置
22

33
## 安装 Rust
44
rustup 既是一个 Rust 安装器又是一个 Rust 版本管理工具。
@@ -20,7 +20,7 @@ Rust还需要一个链接器(linker),将生成的所有机器代码以及
2020
- Windows 10(或 11)SDK
2121
- 英语语言包,以及其他你所需要的语言包
2222

23-
## 故障排除(Troubleshooting)
23+
### 故障排除(Troubleshooting)
2424

2525
要检查是否正确安装了 Rust,打开命令行并输入:`$ rustc --version`
2626

@@ -37,46 +37,53 @@ Rust还需要一个链接器(linker),将生成的所有机器代码以及
3737

3838
在 Linux 和 macOS 中,请使用命令:`$ echo $PATH`
3939

40-
## Rustup常见命令
40+
## Rust 工具链(Toolchain)
41+
42+
Toolchain 指一组Rust工具,包括编译器(rustc)、构建工具(cargo)、文档生成工具(rustdoc)、工具链管理器(rustup)、代码格式化工具(rustfmt) 等等。
43+
Toolchain 用于管理和构建 Rust 代码,并且可以包括一个特定版本的 Rust 编译器和标准库,还包含一个默认是编译到本机平台的target。 工具链的版本可以是 "stable"(稳定版)、"beta"(测试版)或 "nightly"(每日构建版),每个版本都对应着不同的 Rust 编译器和特性。
44+
Toolchain 默认存储在`~/.cargo/bin`这个目录下。
45+
46+
### Rustup常见命令
4147

4248
```shell
4349
rustup install stable # 安装最新版本的 Rust,包括stable、 beta 和 nightly
4450
rustup update # 更新脚本
4551
rustup self uninstall # 卸载 Rust 和 rustup
52+
rustup doc # 在浏览器中查看自带本地文档
53+
rustup target list # 列出可用的 target
54+
rustup target add x86_64-unknown-linux-gnu # # 安装一个新的 rustup target add <target>
4655
```
47-
更新与卸载
48-
49-
命令行中运行如下更新脚本:`$ rustup update`
50-
51-
若要卸载 Rust 和 rustup,请在命令行中运行如下卸载脚本:
52-
`$ rustup self uninstall`
5356

54-
## Rust 自带本地文档
57+
任何时候,如果你拿不准标准库中的类型或函数的用途和用法,请查阅 API 文档!
5558

56-
安装程序也自带一份文档的本地拷贝,可以离线阅读。运行` rustup doc `在浏览器中查看本地文档。
59+
### Cargo 常见命令
5760

58-
任何时候,如果你拿不准标准库中的类型或函数的用途和用法,请查阅应用程序接口(application programming interface,API)文档!
59-
60-
## Rust 工具链(Toolchain)
61-
62-
Toolchain 指一组Rust工具,包括编译器(rustc)、构建工具(cargo)、文档生成工具(rustdoc)以及其他与 Rust 相关的实用程序。Toolchain用于管理和构建 Rust 代码,并且可以包括一个特定版本的 Rust 编译器和标准库,还包含一个默认是编译到本机平台的target。 工具链的版本可以是 "stable"(稳定版)、"beta"(测试版)或 "nightly"(每日构建版),每个版本都对应着不同的 Rust 编译器和特性。
61+
```shell
62+
cargo new 项目名 # 支持中文项目名
63+
cargo run 项目名 #
64+
cargo build
65+
cargo test
66+
cargo --list # 查看 cargo 提供的所有命令
67+
```
6368

6469
## Rust 源代码编译过程
65-
Rust 是一种 AOT 静态类型语言。
70+
Rust 是一门 AOT 静态类型语言。
6671
也是跨平台语言,支持跨平台编译,Rust的标准库提供的对多种系统调用的统一抽象。
67-
Rust 的编译过程是相当复杂的,涉及多个阶段和子系统。以下是一个简化的概述:
72+
Rust 的编译过程是相当复杂的,涉及多个阶段与子系统。以下是一个简化的概述:
6873

6974
1. 编译器前端
7075
1. 词法分析:首先,Rust 源代码会被分解成一系列的标记,或称为 “tokens”(例如关键字、标识符、字面量、符号等)。这个阶段也被称为 “词法分析” 或 “tokenizing”。
7176
2. 语法分析:接着,这些标记会被解析成一棵 AST 。在这个阶段,编译器会检查代码的语法,并确定如何将代码组织为表达式和语句。
7277
3. 语义分析:然后,编译器会进行语义分析,包括类型检查、借用检查等,确保代码满足 Rust 的语言规则。
7378
2. 编译器后端(以LLVM+某一链接器为例)
74-
+ MIR:接下来,编译器将 AST 转换为 MIR 。这是一个更简简洁、更低级的表示,它使得后续的优化和分析步骤更容易进行。
79+
+ MIR:接下来,编译器将 AST 转换为 MIR 。这是一个更简洁、更低级地表示,它使得后续的优化和分析步骤更容易进行。
7580
+ 优化:在 MIR 阶段,编译器会执行一系列的优化,如移除死代码、简化表达式等。
7681
+ 代码生成:然后,编译器将 MIR 转换为 LLVM IR 。这是一个一种介于C语言和汇编语言的表示,可以被 LLVM 的后端用来生成各种平台的机器代码。
7782
+ 链接:最后,编译器使用链接器将生成的所有机器代码以及相关的库链接成一个可执行文件。
7883

79-
Rustc编译器中,1-3阶段编译过程都是Rust实现,后端可选用LLVM、GCC、CUDA、cranelift(Rust实现)等。建议运用LLVM是于生产阶段,cranelift编译速度快,可用于测试阶段。Rustc 将Rust 源代码编译成机器代码,但是生成的这些机器代码通常是分散在多个对象文件中的。为了将这些对象文件以及所依赖的库文件合并成一个单一的可执行文件,我们需要一个链接器,也就是7阶段。 7阶段Rust选择调用外部的链接工具,可能是 GNU 或 MSVC ,具体取决于目标平台和环境。
84+
Rustc编译器中,1-3阶段编译过程都是Rust实现,后端可选用LLVM、GCC、CUDA、cranelift(Rust实现)等。建议运用LLVM是于生产阶段,cranelift编译速度快,可用于测试阶段。
85+
Rustc 将Rust 源代码编译成机器代码,但是生成的这些机器代码通常是分散在多个对象文件中的。为了将这些对象文件以及所依赖的库文件合并成一个单一的可执行文件,
86+
我们需要一个链接器,也就是7阶段。 7阶段Rust选择调用外部的链接工具,可能是 GNU 或 MSVC ,具体取决于目标平台和环境。
8087
rustc为什么不自己实现第 7 阶段链接过程呢? 因为Rust编译器团队贯彻了"不重复造轮子"(Don’t reinvent the wheel)这一编程理念。
8188

8289
# Rust 配置

docs/常见编程概念.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 代码规范
22

3-
### 常见命名法
3+
### 标识符常见命名法
44

55
` 驼峰命名法(CamelCase)`
66
: 不同单词之间没有分隔符,大小写混合区分不同单词。
@@ -136,3 +136,23 @@ image("字符串指针.png")
136136
指针:即存放内存地址的变量,16位机器的代码时,指针占2个字节。32位机器的代码时,指针占4个字节。64位机器的代码时,指针占8个字节。即便指针变量是指向地址用的,但是编译器也会分配一块内存地址来存储指针变量。即&p拥有一个自己的内存地址,还有一个变量p的地址值。
137137

138138
never类型
139+
140+
Box 智能指针
141+
142+
将原本默认都在栈上分配内存,改成堆上分配。
143+
144+
```rust
145+
fn main() {
146+
let v1 = [1, 2, 3, 4];
147+
// 将 v1 拷贝到堆上,原本的 v1 不受影响
148+
let v2 = Box::new(v1);
149+
println!("{:?}", v1);
150+
println!("{:?}", v2);
151+
println!("{:?}", *v2); // 需要解引用 Box 类型
152+
/*
153+
[1, 2, 3, 4]
154+
[1, 2, 3, 4]
155+
[1, 2, 3, 4]
156+
*/
157+
}
158+
```

includes/abbreviations.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,12 @@
88
*[LIR]: Low IR 底层中间表示
99
*[AOT]: Ahead-Of-Time 预(编译)
1010
*[JIT]: Just-In-Time 即时(编译)
11+
*[API]: Application Programming Interface 应用程序接口
12+
*[ABI]: Application Binary Interface 应用程序二进制接口
13+
*[GC]: Garbage Collection 垃圾回收机制
14+
*[CLR]: Common Language Runtime 公共语言运行库
15+
*[CTS]: Common Type System 统一类型系统
16+
*[HTML]: Hyper Text Markup Language 超文本标记语言
17+
*[DOM]: Document Object Model 文档对象模型
18+
*[COM]: Component Object Model 组件对象模型
19+
*[KWIC]: Key Word in Context 上下文关键字

mkdocs.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,5 @@ nav: #Page Tree navigation 导航
6262
- Rust 简述: index.md
6363
- 第一章 Rust 安装与配置: Rust安装与配置.md
6464
- 第二章 常见编程概念: 常见编程概念.md
65-
- 第三章 独有编程概念: Rust独有概念.md
65+
- 第三章 独有编程概念: Rust独有概念.md
66+
- C#常见编程概念: C#常见编程概念.md

0 commit comments

Comments
 (0)