Csharp入门详解学习笔记
用C#编写的各类应用程序,用Visual Studio写出Hello word!!!.
第一个:Console
打开Visual Studio新建项目选择控制台应用
会自动帮我们生成最基本的C#的Main方法,在Main中输入Console.WrinteLine(“Hello World!”);按ctrl+F5进行调式。
1 | namespace Console_Hello_world |
第二个:Windows Forms(Old)
打开Visual Studio新建项目选择Windows窗体应用(.NET Framework)
会自动生成一个Form1的窗口
如下:
在工具箱中搜索button和Textbox,将其拖到窗体上。

左边没有工具箱,在菜单栏中选择视图选选卡,在下拉列表中选着工具箱。
属性面板中可以看到按钮的各种属性,选择button,在属性面板中将Text改为“Click Me!”

在属性面板中选择事件按钮

双击按钮的“Click”事件
VS会自动生成一个方法,我们只需要在方法中输入Console.WriteLine(“Hello World!”);即可。

运行程序,点击按钮,Form1会显示“Hello World!”

第三个:WPF(Windows Presentation Foundation)
WPF是微软推出的基于.NET Framework的可视化开发框架,可以用来开发桌面应用程序、移动应用程序、Web应用程序、游戏等。
打开Visual Studio新建项目选择WPF应用程序(.NET Framework)
会自动生成一个MainWindow的窗口
在工具箱中搜索button和Textbox,将其拖到窗体上。
步骤和FrameWork Forms类似





第四个:ASP.NET Web FormS(Old)
打开Visual Studio新建项目选择ASP.NET Web Forms 应用程序
选择空模板,勾选web窗体,点击确定。
右击项目,选择添加新项,选择Web窗体,命名为“Default.aspx”,点击添加。
就可以使用HTML、CSS、JavaScript来编写网页了。
第五个:ASP.NET MVC(Model-View-Controller)
打开Visual Studio新建项目选择ASP.NET MVC 应用(模型-视图-控制器)
选择自带的模板HomeController.cs,在index视图中输入“Hello World!”
也可以zip下载模板,解压后打开解决方案,找到HomeController.cs,在index视图中输入“Hello World!”



类库的引用
- 定义与作用
DLL 是一个用于存储代码和数据资源的文件,能够在不同应用程序之间动态地共享代码。
它类似于 C# 类库(如 System.Collections.Generic),但通常用于外部调用或框架。 - 功能特点
二进制文件:DLL 是二进制文件,包含类型、静态成员和方法的二进制表示。
动态链接:DLL 允许应用程序在运行时动态加载其代码,而不必将其作为可执行文件直接编译。 - 类型与结构
DLL 文件通常以 .dll 扩展名标识,并由一个或多个 assembly 组成。
类型和方法是通过 DLL 中的类型表实现的,允许在 C# 程序中引用外部库。 - 常见用途
调用外部库:DLL 是大多数 .NET 框架(如 mscorlib、System.Web)的默认形式。例如,mscorlib.dll 包含基础数据类型和方法。
框架与组件:许多框架提供 DLL 文件,允许 C# 程序调用其功能。 - 管理与使用
编译与加载:DLL 是通过编译器在运行时动态加载的。C# 编译器会将类库编译为 DLL。
引用方式:在 C# 代码中,可以使用 using 语句或名称空间来引用 DLL 提供的功能。 - 常见问题
如果项目无法找到 DLL 文件,通常表示路径错误或依赖的 DLL 缺少。检查路径和更新依赖是常见的解决方案。
DLL 文件的安全性通常较低,因为它们可以在系统中加载任何代码。因此,在生产环境中应谨慎处理。
总结
DLL 是 C# 程序中调用外部库或框架的核心工具,通过二进制文件存储代码和数据资源,并在运行时动态加载。理解 DLL 的作用对于编写高效的 .NET 应用程序至关重要。
NuGet 是 Microsoft 提供的 .NET 包管理器,它可以帮助我们轻松地安装、更新和引用第三方类库。
- 定义与作用
NuGet 是 Microsoft 提供的 .NET 包管理器,它可以帮助我们轻松地安装、更新和引用第三方类库。NuGet 包管理器可以帮助我们管理 .NET 项目的依赖项,包括 NuGet 包。 - 功能特点
NuGet 包管理器可以帮助我们管理 .NET 项目的依赖项,包括 NuGet 包。
NuGet 包可以帮助我们快速、轻松地安装、更新和引用第三方类库。
NuGet 包可以帮助我们管理 NuGet 包的版本,包括 NuGet 包依赖项。 - 常见用途
NuGet 包管理器可以帮助我们管理 .NET 项目的依赖项,包括 NuGet 包。
NuGet 包可以帮助我们快速、轻松地安装、更新和引用第三方类库。
NuGet 包可以帮助我们管理 NuGet 包的版本,包括 NuGet 包依赖项。 - 管理与使用
NuGet 包管理器可以帮助我们管理 .NET 项目的依赖项,包括 NuGet 包。
NuGet 包可以帮助我们快速、轻松地安装、更新和引用第三方类库。
NuGet 包可以帮助我们管理 NuGet 包的版本,包括 NuGet 包依赖项。 - 常见问题
NuGet 包管理器的安装与使用需要一定的时间,但随着 NuGet 包的增多,它的使用效率会越来越高。
NuGet 包管理器的依赖项管理功能可以帮助我们管理 NuGet 包的版本,包括 NuGet 包依赖项。 - 总结
NuGet 包管理器是 Microsoft 提供的 .NET 包管理器,它可以帮助我们轻松地安装、更新和引用第三方类库。NuGet 包管理器的安装与使用需要一定的时间,但随着 NuGet 包的增多,它的使用效率会越来越高。NuGet 包管理器的依赖项管理功能可以帮助我们管理 NuGet 包的版本,包括 NuGet 包依赖项。
- 定义与作用
项目引用是指在一个项目中引用另一个项目的输出文件。 - 功能特点
项目引用可以帮助我们在一个项目中调用另一个项目的功能。 - 常见用途
项目引用可以帮助我们在一个项目中调用另一个项目的功能。 - 管理与使用
项目引用可以帮助我们在一个项目中调用另一个项目的功能。 - 常见问题
项目引用的管理与使用需要一定的时间,但随着项目的增多,它的使用效率会越来越高。 - 总结
项目引用是指在一个项目中引用另一个项目的输出文件。项目引用可以帮助我们在一个项目中调用另一个项目的功能。项目引用的管理与使用需要一定的时间,但随着项目的增多,它的使用效率会越来越高。
依赖关系管理是指管理项目之间的依赖关系,包括 NuGet 包依赖项、项目依赖项和外部 DLL 依赖项。
- 定义与作用
依赖关系管理是指管理项目之间的依赖关系,包括 NuGet 包依赖项、项目依赖项和外部 DLL 依赖项。 - 功能特点
依赖关系管理可以帮助我们管理项目之间的依赖关系。 - 常见用途
依赖关系管理可以帮助我们管理项目之间的依赖关系。 - 管理与使用
依赖关系管理可以帮助我们管理项目之间的依赖关系。 - 常见问题
依赖关系管理的管理与使用需要一定的时间,但随着项目的增多,它的使用效率会越来越高。 - 总结
类的三大成员
属性是类的成员,它可以获取或设置类的状态。
- 定义与作用
属性是类的成员,它可以获取或设置类的状态。 - 功能特点
属性可以帮助我们在类的外部访问类的状态。 - 常见用途
属性可以帮助我们在类的外部访问类的状态。 - 管理与使用
属性的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。 - 常见问题
属性的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。 - 总结
属性是类的成员,它可以获取或设置类的状态。属性可以帮助我们在类的外部访问类的状态。属性的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。
- 定义与作用
方法是类的成员,它可以执行一些操作。 - 功能特点
方法可以帮助我们在类的外部执行一些操作。 - 常见用途
方法可以帮助我们在类的外部执行一些操作。 - 管理与使用
方法的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。 - 常见问题
方法的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。 - 总结
方法是类的成员,它可以执行一些操作。方法可以帮助我们在类的外部执行一些操作。方法的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。
- 定义与作用
事件是类的成员,它可以通知其他对象发生了某些事件。 - 功能特点
事件可以帮助我们在类的外部通知其他对象发生了某些事件。 - 常见用途
事件可以帮助我们在类的外部通知其他对象发生了某些事件。 - 管理与使用
事件的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。 - 常见问题
事件的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。 - 总结
事件是类的成员,它可以通知其他对象发生了某些事件。事件可以帮助我们在类的外部通知其他对象发生了某些事件。事件的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。
构成C#语言的基本元素
- 什么是合法标识符?
标识符是不能和关键字重组(关键字已经被赋予了特殊的含义)、不能以数字开头、不能包含特殊字符。
标识符可以由字母、下划线或者汉字(但不建议使用汉字)开头。
标识符的命名规范:
- 标识符的命名必须遵循驼峰命名法。
- 标识符的命名必须见名知意。
- 标识符的命名必须简短、易于理解。
初始类型、变量和方法

变量的声明
变量的使用
1 | int x; |
方法的声明
方法的调用

有了变量和方法,我们就可以编写有意义的程序了。
C#语言的类型系统
C#的五大数据类型
C#类型的派生谱系

变量、对象与内存
什么是变量
变量=以变量名所对应的内存地址为起点、以其他数据类型所要求的存储空间为长度的一块内存区域
值类型的变量
引用类型的变量
装箱与拆箱(Boxing&Unboxing)
操作符
操作符预览:
操作符优先级从上往下依次降低,同一行的操作符优先级相同。
相同操作符在表达式中运算顺序是从左往右决定。
但赋值和lanbda表达式的优先级不同。
他是从右往左运算的。
Typeof操作符:

var和new的组合
将 var 和 new 结合使用在 C# 中是一种常见的语法糖,提供了更加简洁和清晰的代码写法。具体来说:
语义上的优化:
使用 var new Type obj = new Type(); 可以让编译器更清楚地理解变量是在初始化哪个对象或数组中。
保持一致性:
这种组合使得在定义和初始化对象时的代码风格一致,有助于提高可读性和维护性。
多态性的支持:
当目标类型是多态类型时,结合 var 和 new 可以更自然地处理继承或接口实现的情况。
扩展性和灵活性:
这种语法糖允许在初始化复杂的对象、数组或其他结构时保持代码的简洁和可读性。
checked操作符

逻辑“与”、“XOR”、“OR”运算符



null合并运算符

条件操作符

操作符的本质


类型转换

子类向父类的转换
装箱
表达式的定义
C#语言中表达式的分类
符合表达式的求值
操作符的优先级和同优先级操作符的运算方向
C#语言对语句的定义
什么是字段
字段是类型的成员,写在类里面的才是字段,写在函数里面叫局部变量
字段(field)是一种表示与对象或类型(类与结构体)关联的变量
字段是类型的成员,也叫“成员变量”
与对象关联的字段亦称“实例字段”
与类相关联的字段称为“静态字段”,由static修饰
字段的初始化
无显示初始化时,字段获得其类型的默认值,所以字段“永远都不会被初始化”
实例字段初始化的时机————对象创建时
静态字段初始化的时机————类型被加载(load)时
readonly(只读字段)
“readonly”字段在C#编程中有着广泛的应用价值。它不仅有助于提高代码的质量和可维护性,还能有效保障数据的一致性和安全性,适用于多个领域和技术栈中的开发实践。
声明上下文
只能在模块级别使用 ReadOnly。 这意味着 ReadOnly 元素的声明上下文必须是类、结构或模块,不能是源文件、命名空间或过程。
组合修饰符
不能在同一过程声明中同时指定 ReadOnly 和 Static。
赋值
使用 ReadOnly 属性的代码无法设置其值。 但能够访问基础存储的代码可随时赋值或更改值。
只能在 ReadOnly 变量的声明中或在定义它的类或结构的构造函数中为其赋值

属性

什么是属性

属性的声明

动态属性

常量(const)

引用参数
引用参数是用ref修饰符声明的形参。与值形参不同,引用形参并不创建新的存储位置。相反,引用形参表示的存储位置恰是方法调用中作为实参给出的那个变量所表示的存储位置。
当形参为引用形参时,方法调用中的对应实参必须由关键字ref并后接一个与形参类型相同的variable-reference(变量引用)组成。变量在可以作为引用形参传递之前,必须先明确赋值。
在方法内部,引用形参始终被认为是明确赋值的。
声明为迭代器的方法不能有引用形参。


不创建新对象只改变对象值
输出参数
用out修饰符声明的形参是输出形参。类似于引用形参,输出形参不创建新的内存位置。相反,输出形参表的存储位置恰是在该方法调用中作为实参给出的那个变量所表示的存储位置。
当形参为输出形参时,方法调用中的相应实参必须由关键字out并后接一个与形参类型相同的varable-reference组成。变量在可以作为输出形参传递之前不一定需要明确赋值,但是在将变量作为输出形参传递的调用之后,该变量被认为是明确赋值的。
在方法内部,与局部变量相同,输出形参最初被认为是未赋值的,因而必须在使用它的值之前明确赋值。
在方法返回之前,该方法的每个输出形参都必须明确赋值。
声明为部分方法或迭代器的方法不能有输出形参。

如何使用引用类型参数

数组参数

具名参数

扩展方法(this参数)
方法必须是公有、静态的、即被public static所修饰
必需是形参列表中的第一个,由this修饰
必需由一个静态类(一般类名为SomeTypeExtension)来统一收纳对SomeType类型的扩展方法

什么是委托
委托(delegate)是函数指针的“升级版”
一切皆地址
变量(数据)是以某个地址为起点的一段内存中所存储的值
函数(算法)是以某个地址为起点的一段内存中所存储的一组机器语言指令
直接调用与间接调用
直接调用:通过函数名来调用函数,CPU通过函数名直接获得函数所在地址并开始执行,返回
间接调用:通过函数指针来调用函数,CPU通过读取函数指针存储的值获得函数所在地址并开始执行,返回
Action委托

Func委托

委托的声明(自定义委托)
委托是一种类(class),类是数据类型所以委托也是一种数据类型
它的声明方式与一般的类不同,主要是为了照顾可读性和C/C++传统
注意声明委托的位置
委托与所封装的方法必需“类型兼容”

委托的一般使用
实例:把方法当作参数传给另一个方法
正确使用1:模板方法,“借用”指定的外部方法来产生结果
相当于“填空题”
常位于代码中部
委托有返回值
正确使用2:回调(callback)方法,调用指定的外部方法
相当于“流水线”
常位于代码末尾
委托无返回值



委托的高级使用


同步

间接同步

多播的多播
一个主委托对象可以容纳多个其他的子委托对象,当调用主委托对象,会将所有子委托全部按序运行
异步
隐式异步

事件
事件专用委托定义
1 | public delegate void EventHandler(Object? sender,EventArgs e); |
为了能够满足两个条件:
事件对应的委托,不应该被类外界调用,只能由某个操作触发
事件对应的委托,不应该被类外界直接赋值,只能够通过+、-增减委托方法
1
2
3
4class Player
{
public evnet EventHandler OnAttack = unll;
}
总结:类内定义、类内触发、只能加减、不可赋值
事件是在程序运行过程中触发的特定动作。它可以是用户操作(如点击按钮)引起的,也可以是数据处理、集合遍历等引起的。
每个事件包含一个事件触发器和相应的响应代码。

事件的运用
事件对应的委托,不应该被类外界直接赋值,只能够通过+、-增减委托方法
![] (img\Hello\Snipaste_20 25-02-17_11-56-33.png)
第一种:✨
事件响应者和事件拥有者是完全分开的
由事件处理器订阅事件


第二种:✨✨
事件的拥有者同时也是事件的响应者


第三种:✨✨✨





