主题
C#基础
平台简介
- C# 是一门编程语言,其运行环境是 .NET 平台。
.NET Framework是最早的.NET实现,只支持 Windows 系统。.NET Core是跨平台的开发框架,支持 Linux、macOS 和 Windows 系统,但不包含 Windows 特有技术(如 WPF、WinForms) 。.NET 5+是最新的平台,整合了.NET Framework和.NET Core的功能。
UI框架
| UI | WinForms | WinUI3 | WPF | UWP | .NET MAUI |
|---|---|---|---|---|---|
| 跨平台 | × | × | × | × | √ |
| 开发语言 | C#、VB | C#、C++ | C#、VB | C#、C++、VB | C# |
| UI语言 | 代码 | XAML | XAML | XAML | XAML/代码 |
| UI设计器 | √ | × | √ | √ | × |
| 适用场景 | 传统桌面 | 现代化桌面 | 复杂企业级应用 | 跨设备 | 跨平台移动和桌面 |
- WinForms:最早的桌面应用开发框架,易于学习和使用,设计风格较为传统,缺乏现代化 UI 元素和动画效果。
- WinUI3:微软最新推出的 UI 框架,基于 UWP 和 Win32,使用 Fluent Design System ,致力于为 Win10 和 Win11 应用程序提供现代化的用户界面。
- WPF:支持数据绑定、MVVM模式,提供强大的图形处理能力,包括2D和3D图形、动画、模板等,适用于复杂桌面应用。
- UPW:微软的通用 Windows 平台,适用于 Windows 10/11、Xbox、HoloLens 等设备。
- .NET MAUI:现代化跨平台的 UI 框架。
数据类型
简单值类型就是我们常见的基础数据类型,如int、bool、float等。
Collection类似python的容器,如数组、字典、队列等。
值类型类似python的不可变对象,引用类型类似python的可变对象。函数传参类型为值类型时,函数内部修改不会影响外部的值;函数传参类型为引用类型时,函数内部修改会改变外部的值。
参考文档:
结构体
- 结构体不支持继承(不同于C++),但可以实现接口。
ref struct只能在栈上分配,不能在堆上分配;而struct可以分配在堆或栈上。前者主要用于高性能场景,较少使用,一般开发使用struct即可。
接口
- 接口无法直接实例化,其成员由实现接口的任何类或结构来实现。
面向对象
封装
| 访问修饰符 | 描述 | 备注 |
|---|---|---|
| public | 都可访问 | |
| protected | 类本身及其派生类可见 | |
| internal | 当前程序集可见 | |
| protected internal | 当前程序集或派生类可见 | |
| private | 类本身可见 | |
| private protected | 类本身及其当前程序集中的派生类可见 | C#7.2新增 |
| file | 已声明的类型仅在当前源文件中可见 | C#11新增 |
程序集
简单理解就是共同生成一个可执行文件或动态链接库的所有源文件集合。
- 顶层的类和结构体(没有嵌套在其他类或结构体中)可以声明
public、internal(默认)或file。顶层的接口可以声明public和internal。(感觉顶层类和结构体声明为public就行了额) - 结构体的成员(包括嵌套的类和结构体)可以声明为
public、internal或private(默认)。 - 类成员(包括嵌套的类和结构体)和接口成员可以声明为除了
file之外的其它访问修饰符,类成员默认访问级别是private,而接口成员的默认访问级别是public。 - 仅允许在顶级类型声明中使用
file访问修饰符。
继承
- C#类继承不能像C++那样指定访问修饰符来声明何种继承方式。
- C#不支持多重继承,但可实现多个接口。
- 派生类不能具有高于其基类型的可访问性。比如基类为
internal,则派生类不能为public。
多态
实现方式:
- 重新定义:在派生类中使用关键字
new来重新定义基类方法,通过不同的派生类调用同名方法。 - 虚函数:基类使用
virtual声明虚函数,派生类使用关键字override来重写该方法。通过基类对象来调用虚函数,但实际传参是派生类对象。 - 抽象方法:抽象基类声明抽象方法,派生类使用关键字
override来实现该抽象方法。调用方式同虚函数一样。
抽象类
C#有专门的关键字abstract来声明抽象类。
- 抽象类中用
abstract声明的方法为抽象方法,抽象类的派生类必须实现所有抽象方法。 - 抽象类中可定义非抽象方法和非抽象属性。