用C#编写的各类应用程序,用Visual Studio写出Hello word!!!.

第一个:Console

打开Visual Studio新建项目选择控制台应用
会自动帮我们生成最基本的C#的Main方法,在Main中输入Console.WrinteLine(“Hello World!”);按ctrl+F5进行调式。

1
2
3
4
5
6
7
8
9
10
11
 namespace Console_Hello_world
{
internal class Program
{
static void Main(string[] args)
{
Console.WrinteLine("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!”

类库的引用

  • 类库引用是使用命名空间的物理基础。在C#中,我们可以将代码分成多个文件,每个文件都有自己的命名空间。当我们需要使用某个类库时,我们需要引用它的命名空间。例如,我们需要使用System.IO命名空间,我们可以这样写:using System.IO;。这样,我们就可以在程序中使用System.IO命名空间中的类和方法了。
  • 不同技术类型的项目会默认引用不同的类库,如Windows Forms项目默认引用System.Windows.Forms命名空间,WPF项目默认引用System.Windows命名空间,ASP.NET Web Forms项目默认引用System.Web命名空间,ASP.NET MVC项目默认引用System.Web.Mvc命名空间。
  • DLL引用(黑河引用,无源代码)
    1. 定义与作用
      DLL 是一个用于存储代码和数据资源的文件,能够在不同应用程序之间动态地共享代码。
      它类似于 C# 类库(如 System.Collections.Generic),但通常用于外部调用或框架。
    2. 功能特点
      二进制文件:DLL 是二进制文件,包含类型、静态成员和方法的二进制表示。
      动态链接:DLL 允许应用程序在运行时动态加载其代码,而不必将其作为可执行文件直接编译。
    3. 类型与结构
      DLL 文件通常以 .dll 扩展名标识,并由一个或多个 assembly 组成。
      类型和方法是通过 DLL 中的类型表实现的,允许在 C# 程序中引用外部库。
    4. 常见用途
      调用外部库:DLL 是大多数 .NET 框架(如 mscorlib、System.Web)的默认形式。例如,mscorlib.dll 包含基础数据类型和方法。
      框架与组件:许多框架提供 DLL 文件,允许 C# 程序调用其功能。
    5. 管理与使用
      编译与加载:DLL 是通过编译器在运行时动态加载的。C# 编译器会将类库编译为 DLL。
      引用方式:在 C# 代码中,可以使用 using 语句或名称空间来引用 DLL 提供的功能。
    6. 常见问题
      如果项目无法找到 DLL 文件,通常表示路径错误或依赖的 DLL 缺少。检查路径和更新依赖是常见的解决方案。
      DLL 文件的安全性通常较低,因为它们可以在系统中加载任何代码。因此,在生产环境中应谨慎处理。
      总结
      DLL 是 C# 程序中调用外部库或框架的核心工具,通过二进制文件存储代码和数据资源,并在运行时动态加载。理解 DLL 的作用对于编写高效的 .NET 应用程序至关重要。
  • NuGet 包管理器
  • NuGet 是 Microsoft 提供的 .NET 包管理器,它可以帮助我们轻松地安装、更新和引用第三方类库。

    1. 定义与作用
      NuGet 是 Microsoft 提供的 .NET 包管理器,它可以帮助我们轻松地安装、更新和引用第三方类库。NuGet 包管理器可以帮助我们管理 .NET 项目的依赖项,包括 NuGet 包。
    2. 功能特点
      NuGet 包管理器可以帮助我们管理 .NET 项目的依赖项,包括 NuGet 包。
      NuGet 包可以帮助我们快速、轻松地安装、更新和引用第三方类库。
      NuGet 包可以帮助我们管理 NuGet 包的版本,包括 NuGet 包依赖项。
    3. 常见用途
      NuGet 包管理器可以帮助我们管理 .NET 项目的依赖项,包括 NuGet 包。
      NuGet 包可以帮助我们快速、轻松地安装、更新和引用第三方类库。
      NuGet 包可以帮助我们管理 NuGet 包的版本,包括 NuGet 包依赖项。
    4. 管理与使用
      NuGet 包管理器可以帮助我们管理 .NET 项目的依赖项,包括 NuGet 包。
      NuGet 包可以帮助我们快速、轻松地安装、更新和引用第三方类库。
      NuGet 包可以帮助我们管理 NuGet 包的版本,包括 NuGet 包依赖项。
    5. 常见问题
      NuGet 包管理器的安装与使用需要一定的时间,但随着 NuGet 包的增多,它的使用效率会越来越高。
      NuGet 包管理器的依赖项管理功能可以帮助我们管理 NuGet 包的版本,包括 NuGet 包依赖项。
    6. 总结
      NuGet 包管理器是 Microsoft 提供的 .NET 包管理器,它可以帮助我们轻松地安装、更新和引用第三方类库。NuGet 包管理器的安装与使用需要一定的时间,但随着 NuGet 包的增多,它的使用效率会越来越高。NuGet 包管理器的依赖项管理功能可以帮助我们管理 NuGet 包的版本,包括 NuGet 包依赖项。
  • 项目引用(百盒引用,有源代码)
    1. 定义与作用
      项目引用是指在一个项目中引用另一个项目的输出文件。
    2. 功能特点
      项目引用可以帮助我们在一个项目中调用另一个项目的功能。
    3. 常见用途
      项目引用可以帮助我们在一个项目中调用另一个项目的功能。
    4. 管理与使用
      项目引用可以帮助我们在一个项目中调用另一个项目的功能。
    5. 常见问题
      项目引用的管理与使用需要一定的时间,但随着项目的增多,它的使用效率会越来越高。
    6. 总结
      项目引用是指在一个项目中引用另一个项目的输出文件。项目引用可以帮助我们在一个项目中调用另一个项目的功能。项目引用的管理与使用需要一定的时间,但随着项目的增多,它的使用效率会越来越高。
  • 依赖关系管理(高内聚低耦合)
  • 依赖关系管理是指管理项目之间的依赖关系,包括 NuGet 包依赖项、项目依赖项和外部 DLL 依赖项。

    1. 定义与作用
      依赖关系管理是指管理项目之间的依赖关系,包括 NuGet 包依赖项、项目依赖项和外部 DLL 依赖项。
    2. 功能特点
      依赖关系管理可以帮助我们管理项目之间的依赖关系。
    3. 常见用途
      依赖关系管理可以帮助我们管理项目之间的依赖关系。
    4. 管理与使用
      依赖关系管理可以帮助我们管理项目之间的依赖关系。
    5. 常见问题
      依赖关系管理的管理与使用需要一定的时间,但随着项目的增多,它的使用效率会越来越高。
    6. 总结

    类的三大成员

  • 属性(Properties)
  • 属性是类的成员,它可以获取或设置类的状态。

    1. 定义与作用
      属性是类的成员,它可以获取或设置类的状态。
    2. 功能特点
      属性可以帮助我们在类的外部访问类的状态。
    3. 常见用途
      属性可以帮助我们在类的外部访问类的状态。
    4. 管理与使用
      属性的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。
    5. 常见问题
      属性的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。
    6. 总结
      属性是类的成员,它可以获取或设置类的状态。属性可以帮助我们在类的外部访问类的状态。属性的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。
  • 方法(Methods)
  • 方法是类的成员,它可以执行一些操作。
    1. 定义与作用
      方法是类的成员,它可以执行一些操作。
    2. 功能特点
      方法可以帮助我们在类的外部执行一些操作。
    3. 常见用途
      方法可以帮助我们在类的外部执行一些操作。
    4. 管理与使用
      方法的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。
    5. 常见问题
      方法的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。
    6. 总结
      方法是类的成员,它可以执行一些操作。方法可以帮助我们在类的外部执行一些操作。方法的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。
  • 事件(Events)
  • 事件是类的成员,它可以通知其他对象发生了某些事件。
    1. 定义与作用
      事件是类的成员,它可以通知其他对象发生了某些事件。
    2. 功能特点
      事件可以帮助我们在类的外部通知其他对象发生了某些事件。
    3. 常见用途
      事件可以帮助我们在类的外部通知其他对象发生了某些事件。
    4. 管理与使用
      事件的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。
    5. 常见问题
      事件的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。
    6. 总结
      事件是类的成员,它可以通知其他对象发生了某些事件。事件可以帮助我们在类的外部通知其他对象发生了某些事件。事件的管理与使用需要一定的时间,但随着类的增多,它的使用效率会越来越高。

    构成C#语言的基本元素

  • 关键字(Keywords)
  • 关键字是C#语言的基本元素,它是C#语言的核心。关键字是C#语言的基本语法单位,它是C#语言的构建块。关键字的作用是用来定义程序的结构、控制流、数据类型、方法、变量、常量、运算符、命名空间、类、接口、结构、枚举、委托等。 在MSDN文档有对关键字的详细介绍。
  • 运算符(Operators)
  • 运算符是C#语言的基本元素,它是C#语言的核心。运算符是C#语言的基本语法单位,它是C#语言的构建块。运算符的作用是用来执行各种操作,如算术运算、赋值运算、逻辑运算、比较运算、位运算、条件运算等。 在MSDN文档有对运算符的详细介绍。
  • 标识符(Identifiers)
    1. 什么是合法标识符?
      标识符是不能和关键字重组(关键字已经被赋予了特殊的含义)、不能以数字开头、不能包含特殊字符。
      标识符可以由字母、下划线或者汉字(但不建议使用汉字)开头。
      标识符的命名规范:
    • 标识符的命名必须遵循驼峰命名法。
    • 标识符的命名必须见名知意。
    • 标识符的命名必须简短、易于理解。
  • 标点符号(Punctuation)
  • 标点符号是C#语言的基本元素,它是C#语言的核心。标点符号是C#语言的基本语法单位,它是C#语言的构建块。标点符号的作用是用来定义程序的语法结构。 在MSDN文档有对标点符号的详细介绍。
  • 文本(Text)
  • 注释与空白(Comments and Whitespace)
  • ![](img\Hello\tokne.png)

    初始类型、变量和方法

  • 初始类型(Primitive Types)
  • 变量(Variables)
  • 变量的声明
    变量的使用

    1
    2
    int x;
    x = 10;
  • 方法(Methods)
  • 方法的声明
    方法的调用

  • 程序=数据+算法
  • 有了变量和方法,我们就可以编写有意义的程序了。

    C#语言的类型系统

    C#的五大数据类型

  • 类(Class):如Windows、Form、Console、String等
  • 结构体(Structures):如Int32、Int64、Single、Double等
  • 枚举(Enumerations):如HorizontalAlignment、Visibility等
  • 接口(Interfaces):如IEnumerable、IDisposable等
  • 委托(Delegates):如EventHandler、Func等
  • C#类型的派生谱系

    变量、对象与内存

    什么是变量

    变量=以变量名所对应的内存地址为起点、以其他数据类型所要求的存储空间为长度的一块内存区域

  • 表面上来看,变量的用途是存储数据
  • 实际上,变量表示了存储位置,并且每个变量都有一个类型,与决定什么样的值能供存入变量
  • 变量一共有7种
  • 静态变量、实例变量(成员变量、字段)、数组元素、值参数、(ref)引用参数、(out)输出参数、局部参数
  • 狭义的变量指局部变量、因为其它种类的变量都有自己的约定名称(局部变量就是方法体里的声明的变量)
  • 变量的声明
  • 有效的修饰符组合opt类型变量名初始化器opt

    值类型的变量

  • 以byte/sbtye/short/ushort/为例
  • 值类型没有实例、所谓的“实例”与变量合而为一
  • 引用类型的变量

  • 引用类型变量与实例的关系:引用类型变量里存储的数据是对象的内存地址

    装箱与拆箱(Boxing&Unboxing)

  • 装箱:将值类型转换为引用类型
  • 拆箱:将引用类型转换为值类型
  • 操作符

    操作符预览:

    操作符优先级从上往下依次降低,同一行的操作符优先级相同。
    相同操作符在表达式中运算顺序是从左往右决定。

    但赋值和lanbda表达式的优先级不同。
    他是从右往左运算的。

    Typeof操作符:

    var和new的组合

    将 var 和 new 结合使用在 C# 中是一种常见的语法糖,提供了更加简洁和清晰的代码写法。具体来说:

    语义上的优化:

    使用 var new Type obj = new Type(); 可以让编译器更清楚地理解变量是在初始化哪个对象或数组中。
    保持一致性:

    这种组合使得在定义和初始化对象时的代码风格一致,有助于提高可读性和维护性。
    多态性的支持:

    当目标类型是多态类型时,结合 var 和 new 可以更自然地处理继承或接口实现的情况。
    扩展性和灵活性:

    这种语法糖允许在初始化复杂的对象、数组或其他结构时保持代码的简洁和可读性。

    checked操作符

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

    null合并运算符

    条件操作符

    操作符的本质

  • 操作符不能脱离与它关联的数据类型
  • 可以说操作符就是与固定数据类型相关联的一套基本算法的简记法 为自定义数据类型创造操作符

    类型转换

  • 隐式类型转换
  • 不丢失精度的转换

    子类向父类的转换

    装箱

  • 显式类型转换
  • 有可能丢失精度(甚至发生错误) 拆箱 使用Convert类 ToString()方法与各数据类型的Parse/TryParse方法

    表达式的定义

  • 算法逻辑的最基本(最小)单元,表达一定的算法意图
  • 因为操作符有优先级,所以表达式也有优先级
  • C#语言中表达式的分类

  • A value.Every value has an associated type.任何能得到值的运算(回顾操作符和结果类型)
  • A variable.Every variable has an associated type.
  • A namespace
  • A type.
  • A method group. 例如:Console.WriteLine,这是一组方法,重载决策决定具体调用哪个方法
  • A null literal.
  • An anonymous function.
  • A property access.
  • An event access.
  • An indexer access.
  • Nothing.对返回值为void的方法的调用
  • 符合表达式的求值

    操作符的优先级和同优先级操作符的运算方向

    C#语言对语句的定义

  • C#语言的语句除了能够让程序员“顺序地(sequentially)”表达算法思想,还能通过条件判断、跳转和循环等方法控制程序逻辑的走向
  • 简言之就是:陈述算法思想,控制逻辑走向,完成有意义的动作(action)
  • 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
    4
    class Player
    {
    public evnet EventHandler OnAttack = unll;
    }

    总结:类内定义、类内触发、只能加减、不可赋值

    事件是在程序运行过程中触发的特定动作。它可以是用户操作(如点击按钮)引起的,也可以是数据处理、集合遍历等引起的。
    每个事件包含一个事件触发器和相应的响应代码。

    事件的运用

    事件对应的委托,不应该被类外界直接赋值,只能够通过+、-增减委托方法

    ![] (img\Hello\Snipaste_20 25-02-17_11-56-33.png)

    第一种:✨
    事件响应者和事件拥有者是完全分开的
    由事件处理器订阅事件

    第二种:✨✨

    事件的拥有者同时也是事件的响应者

    第三种:✨✨✨