![](https://img-blog.csdnimg.cn/20200502002640290.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C#学习笔记
文章平均质量分 61
记录C#学习笔记
令狐掌门
C++程序员,出版过《C++零基础入门视频教程》、《Qt高级进阶视频教程》、《OBS源码分析与桌面录制视频教程》、《PyQt PySide6零基础入门与项目实战》。
展开
-
C# ICloneable的特点及其用法
在C#中,ICloneable是一个接口,用于定义允许一个对象创建自身的精确副本,即“克隆”的能力。ICloneableClone,该方法在实现时应该返回当前对象的一个副本。这里是ICloneable。原创 2024-02-12 11:53:42 · 575 阅读 · 0 评论 -
C#入门(1):程序结构、数据类型
在C#中,数据类型被分为两种主要类型:值类型(Value types)和引用类型(Reference types)。这两种类型的主要区别在于它们存储和访问数据的方式。原创 2023-11-19 17:53:20 · 272 阅读 · 0 评论 -
C#入门(2): namespace、类
在C#中,类(Class)是用来定义对象的蓝图或模板。它是面向对象编程(OOP)中的一个基本构造,C#类关键字class。一个类可以包含字段(数据成员)和方法(成员函数)。原创 2023-11-19 18:22:27 · 473 阅读 · 0 评论 -
C#入门(3):类方法的定义、out、ref、params
C#是纯面向对象的,和C++有点不同,比如C#的方法声明格式如下:[public] static 返回值类型 方法名字(参数列表){ 方法体}public 访问修饰符,可以省略比C++多了个修饰符,而且都得用static修饰, 其它的和C++基本一致。C#有类似于C++的引用传值,用out和ref可以实现(1)out修饰形参的用法using System;...原创 2020-05-01 16:16:42 · 640 阅读 · 1 评论 -
C#入门(4):for、foreach、var
C#有增强for循环“foreach”, 要配合var关键字,var作用是推断类型,声明的时候必须赋值,类似于C++的auto关键字。示例代码如下: int[] array = { 12, 23, 34, 45 }; //普通for for(int i = 0; i < array.Length; i++) { ...原创 2020-05-01 16:17:15 · 2212 阅读 · 1 评论 -
C#入门(5):数组、一维数组,二维数组、交错数组、数组复制
交错数组的声明类似于一维数组,但它使用额外的一组方括号[]来指示它是一个数组的数组。// 声明一个交错数组// 初始化交错数组的每个元素(即每行)// 第一行有4个元素// 第二行有3个元素// 第三行有2个元素// 遍历交错数组并打印元素i++)j++)原创 2023-11-18 22:14:46 · 501 阅读 · 0 评论 -
C#入门(6): 结构体、ref struct
结构体通过 struct 关键字来定义。一个结构体可以包含字段、方法、属性、索引器、运算符、事件和构造函数。X = x;Y = y;Y = y;Y = y;} } }原创 2023-11-17 21:14:32 · 757 阅读 · 0 评论 -
C#入门(7):接口详细介绍与代码演示
在C#中,接口是一种定义行为的契约。接口可以定义方法、属性、索引器和事件的签名,但它们都没有实现(即,接口包含的都是抽象成员)。任何实现了特定接口的类都需要提供接口定义的所有成员的具体实现。原创 2023-11-18 21:31:59 · 595 阅读 · 0 评论 -
C#入门(8):抽象类介绍
抽象类可以包含抽象成员(抽象方法、抽象属性、抽象事件或抽象索引器),这些成员在抽象类中不需要具有实现,在派生类中必须被重写。通过定义抽象类和抽象成员,我们可以定义一个基本框架,并让子类填充具体的实现,这是一种非常强大的方法来实现代码的重用和扩展。在这种模式中,抽象类定义一个方法的基本步骤,每个步骤可以是一个抽象方法或具体方法。在这个例子中,“Eat”方法在“Animal”类中有一个默认的实现,所有继承自“Animal”的类都可以使用这个实现,或者选择覆盖它。是抽象的,我们不能创建它的实例,但我们可以创建。原创 2023-11-18 21:34:51 · 762 阅读 · 0 评论 -
C#入门(9):多态介绍与代码演示
一个抽象方法是一个没有实现的方法,它在抽象类中声明,并且必须在任何非抽象的派生类中实现。当通过基类引用调用一个抽象方法时,会根据引用的实际类型来调用正确的方法实现。原创 2023-11-18 21:26:46 · 194 阅读 · 0 评论 -
C#入门(10):集合用法介绍
在C#中,集合是一种特殊的数据类型,允许我们将多个元素组织在一起。这些元素可以是相同的类型或者可以是不同的类型。以上示例应给出一个关于如何使用C#集合的基本概念。以上每个示例都将遍历集合中的每个元素,并使用。C#中所有的集合类都可以使用。原创 2023-11-16 23:09:05 · 1057 阅读 · 0 评论 -
C#入门(11):泛型介绍
在C#中,泛型方法是一种允许你在方法中使用一个或多个类型参数的方法。泛型方法可以在类、结构体、接口和委托中定义,并且能够提供更灵活、通用的代码,同时保持类型安全。// 泛型方法示例// 泛型方法示例 public T GenericMethod < T >(T value) {value } ");// 调用泛型方法时可以显式指定类型参数 int intValue = example . GenericMethod < int >(42);原创 2023-11-16 23:08:03 · 926 阅读 · 0 评论 -
C#入门(12):反射介绍
C# 反射(Reflection)是一个强大的机制,允许在运行时检查程序集、模块和类型的元数据,以及动态创建和操作类型的实例。通过反射,你可以在运行时获取和设置对象的属性、调用方法、创建新对象,甚至可以加载新的程序集。原创 2023-11-16 22:37:45 · 343 阅读 · 0 评论 -
C#入门(13):特性Attribute
C# 特性(Attributes)是用于在运行时为程序元素(如类、方法、属性等)添加声明性信息的一种方式。这些信息可以在程序运行时通过反射(Reflection)访问。特性可以用来控制程序行为、添加元数据或者影响程序的运行时行为。原创 2023-11-16 22:33:30 · 318 阅读 · 1 评论 -
C#入门(14):委托与事件
在C#中,委托(Delegates)和事件(Events)是用于实现事件驱动编程的关键组件。原创 2023-11-16 22:24:26 · 203 阅读 · 0 评论 -
C# GC机制
在C#中,垃圾回收(Garbage Collection,简称GC)是CLR(公共语言运行时)的一个重要部分,用于自动管理内存。它会自动释放不再使用的对象所占用的内存,避免内存泄漏,减少程序员关注内存管理的负担。原创 2023-11-19 17:31:40 · 1266 阅读 · 0 评论 -
C# yield 关键字
的主要优点是它可以延迟生成值,直到实际需要这些值。这在处理大型集合或无限序列时非常有用,因为你不需要一次性生成和存储所有的值,从而可以节省内存和计算资源。访问器中使用的特殊语法,主要用于实现迭代器。迭代器是一种可以逐个返回集合元素的方法。可以在每次调用迭代器时生成并返回一个值,而不是一次性生成和返回所有值。当所有的数字都返回后,循环将结束。一起使用,以提前结束迭代。在每次调用时返回一个数字。会被执行,这将立即结束迭代。方法将只返回 0 到 5 的数字。方法是一个迭代器,它使用。在每次循环中,都会调用。原创 2023-11-19 17:23:58 · 117 阅读 · 0 评论 -
C# IEnumerable<T>介绍
IEnumerable 只有一个方法,即 GetEnumerator,该方法返回一个 IEnumerator 对象。IEnumerator 对象用于迭代集合,它提供了 MoveNext 方法(用于移动到集合的下一个元素),Current 属性(获取当前元素)和 Reset 方法(将枚举器设置回其初始位置,但这个方法通常不会被实现或使用)。IEnumerable 是 C# 中的一个接口,它是 .NET Framework 中的集合类型的基础。接口的一部分,它返回一个。方法会被调用,然后返回的。原创 2023-11-18 23:09:04 · 1674 阅读 · 1 评论 -
C# params关键字
在C#中,params关键字用于指定一个方法参数,它可以接受任意数量的参数,或者说是一个参数数组。当使用params关键字时,你可以向方法传递逗号分隔的参数列表,或者是一个数组。在方法内部,这些参数被处理为一个数组。原创 2023-11-18 22:38:42 · 258 阅读 · 0 评论 -
C#可空类型
可空类型在C#中非常有用,尤其是在处理数据库和其他可能返回不确定值的外部数据源时。通过使用可空类型及其相关的运算符和方法,你可以编写更健壮和错误处理更加优雅的代码。在C#中,将可空类型作为函数参数意味着你可以传递一个具有特定值的参数,或者如果合适的话,可以传递一个null值。这在你不确定是否总是有一个合法值传递给函数或者当你想要表示一个可选的或不存在的值时特别有用。原创 2023-11-18 22:36:29 · 334 阅读 · 0 评论 -
C# LINQ使用介绍
LINQ(Language-Integrated Query)是C#语言的一个强大特性,它允许开发者用声明性的方式查询和操作数据。LINQ提供了一致的查询体验,无论是操作内存中的对象(如数组或集合),还是操作外部数据源(如数据库、XML文档或远程服务)。它内置于.NET Framework中,并且可以与任何实现了IEnumerable接口的数据集合一起使用。原创 2023-11-18 22:33:19 · 301 阅读 · 0 评论 -
C#异常捕获try catch详细介绍
你还可以定义自己的异常类,通过继承类来实现。然后,你可以像使用内置异常类型一样使用你的自定义异常类型。在C#中,你可以创建自定义异常以表示应用程序特定的错误情况。自定义异常通常用于提供比标准异常更详细的错误信息或者处理特定于应用程序的错误情况。要创建自定义异常,你需要从命名自定义异常:异常名称通常以“Exception”结尾。构造函数:提供几个构造函数,至少要提供与基类Exception相同的四个基本构造函数。序列化支持。原创 2023-11-18 22:29:08 · 4867 阅读 · 0 评论 -
C# Array和ArrayList有什么区别
示例中,我们添加了不同类型的元素,演示了它的非类型安全性,并且展示了如何添加、移除和修改元素。示例中我们创建了一个整型数组,并初始化和修改了它的元素。时,我们在修改或读取元素之前,可能需要进行显式的类型转换。主要是为了向后兼容保留的,新的代码中应避免使用它。在实际编程中,推荐尽可能使用泛型集合,例如。,因为它们提供了类型安全和其他性能优势。在这两个示例中,我们看到了。原创 2023-11-18 22:22:28 · 338 阅读 · 0 评论 -
C# System.Array.CopyTo() 和 System.Array.Clone() 有什么区别
和是用于数组复制的两种不同方法,它们在实现和用途上有一些区别。原创 2023-11-18 22:17:10 · 628 阅读 · 0 评论 -
C#访问修饰符
私有访问级别,只能在定义它们的类内部访问。这是默认访问级别,如果没有指定访问修饰符,则成员被认为是私有的。C#中的访问修饰符用于控制类型成员(如字段、属性、方法等)的访问级别。:内部访问级别,只能在相同程序集内部访问。:受保护的内部访问级别,允许在同一程序集中的任何类或派生自该类的子类中访问。:公共访问级别,没有任何访问限制。:私有受保护访问级别,只允许在定义成员的类的同一程序集内的派生类中访问。:受保护访问级别,允许在定义成员的类内部以及派生自该类的子类中访问。,它可以访问部分但不是全部的字段。原创 2023-11-18 22:04:46 · 195 阅读 · 0 评论 -
C# using语句使用介绍
在C#中,using语句有两种主要用途:一是引入命名空间,二是提供一种简便的方式来处理资源的清理(主要用于实现了接口的对象)。using语句用于引入命名空间,从而可以在代码中使用该命名空间下的类型(类、接口、委托等),而无需每次都写出完整的命名空间路径。例如,允许直接使用System命名空间下的所有类型,如而不必写成。using语句也用于自动处理资源的释放。当代码块执行完毕时,using语句确保调用接口的Dispose方法,从而释放资源。这在处理文件、数据库连接等资源时非常有用。原创 2023-11-18 22:01:32 · 453 阅读 · 0 评论 -
C# 依赖注入如何实现
在 C# 中,依赖注入(Dependency Injection,简称 DI)是一种编程技术,用于减少代码之间的耦合。但在某些情况下,例如在处理与框架集成的情况下,属性注入可能是必要的。总的来说,依赖注入是一种强大的技术,可以帮助你创建更灵活、更易于测试和维护的代码。虽然实现依赖注入需要一些额外的工作,但在大多数情况下,这都是值得的。在.NET Core中,有一个内置的依赖注入服务容器,用于注册和解析依赖关系。依赖注入是一种强大的设计模式,它能够帮助你管理和解耦你的代码,使代码更易于测试和维护。原创 2023-11-18 21:54:17 · 656 阅读 · 0 评论 -
C#密封类、偏类
在C#中,密封类(Sealed Class)是一种特殊的类,它阻止其他类继承它。你可以通过在类定义前面加上sealed关键字来创建一个密封类。在这个例子中,MyClass是一个密封类,你不能创建一个继承自MyClass上面的代码会导致编译错误,因为MyClass是密封的。密封类在以下情况下可能会很有用:当你有一个类,并且你不希望其他人扩展它时。这可能是因为设计上的原因(例如,你希望保证类的行为不被改变),或者是因为安全和版本控制的原因。当你希望优化你的代码时。原创 2023-11-18 21:51:45 · 298 阅读 · 0 评论 -
C#中的string和string builder有什么区别
在 C# 中,string和都是常用的字符串处理工具,但它们在使用场景和性能上有所不同。stringstring在 C# 中是一个引用类型,但行为类似于值类型。例如,它的不可变性使得你可以像处理原始数据类型(如 int、double 等)那样处理 string。由于string是不可变的,因此它是线程安全的。你可以在多个线程中安全地读取同一个string实例。在进行简单的字符串连接或比较等操作时,string是非常方便和高效的。例如,你可以使用运算符来连接字符串,或者使用==原创 2023-11-18 21:46:55 · 203 阅读 · 0 评论 -
C#类有析构函数吗
在C#中,类不具有析构函数(destructor)的概念,而是有一种叫做终结器(finalizer)的东西,这在某种程度上和C++的析构函数相似。在C#中,你不能直接调用终结器,也不能控制它的执行时间。它区分了托管资源和非托管资源的清理,因为在终结器中,你不能安全地访问托管资源,因为它们可能已经被垃圾收集器回收。一个类的终结器不能被继承或重载,每个类只能有一个终结器。接口通常是一种更好的选择,因为它提供了对清理过程的更好控制,并且可以在确定不再需要对象时立即释放资源。方法是一个受保护的虚方法,由。原创 2023-11-18 21:43:21 · 178 阅读 · 0 评论 -
C# static关键字详解
静态字段是属于类本身,而不是类的实例的字段。所有的类实例共享同一个静态字段的值。如果一个静态字段是公有的,那么可以直接通过类名访问它,而无需创建类的实例。:静态构造函数是一个特殊的构造函数,用于初始化类本身,而不是类的实例。:静态类是不能实例化的类,它的所有成员都是静态的。静态类常常用作工具类或帮助类,提供一些无需特定对象实例就可以执行的方法。:静态方法是属于类本身,而不是类的实例的方法。:静态属性是属于类本身,而不是类的实例的属性。静态属性常常与静态字段一起使用,以实现对静态字段的封装。原创 2023-11-18 21:40:36 · 219 阅读 · 0 评论 -
C#装箱与拆箱详解
装箱和拆箱是C#语言中非常重要的两个概念。在C#中,值类型(如int,double,struct等)和引用类型(如class,interface等)是两种完全不同的数据类型。而装箱和拆箱就是这两种类型之间转换的过程。在C#中,所有的值类型都直接派生自System.ValueType,而System.ValueType又派生自System.Object。这意味着值类型在某种程度上也是对象类型,因此可以访问一些普通对象的方法,如ToStringEquals等。原创 2023-11-18 21:19:17 · 640 阅读 · 0 评论 -
C#调用C++ dll教程
在使用C#开发客户端时,有时需要调用C++ dll,本篇博客来介绍C#程序如何调用C++ dll。原创 2023-11-17 22:16:48 · 3944 阅读 · 0 评论 -
C# public和internal的区别
public和internal的主要区别在于他们的访问范围,public可以在任何地方访问,而internal则只能在同一程序集中访问。选择哪种访问修饰符取决于你的需求,如果你需要对访问范围进行严格控制,那么internal可能是一个好选择,否则,你可能会使用public。原创 2023-11-17 21:27:27 · 826 阅读 · 0 评论 -
C#不安全代码
在C#中,“不安全代码”(unsafe code)通常指的是那些直接操作内存地址的代码。它允许开发者使用指针等低级别的数据结构,这些在通常的安全代码(safe code)中是不允许的。C# 的不安全代码提供了一种方式,可以直接与内存进行交互,这在某些特定的应用场景下(如性能敏感的任务或者与操作系统的底层交互)是非常有用的。原创 2023-11-16 23:10:54 · 1121 阅读 · 0 评论 -
C#匿名方法介绍Action、Func、柯里化Currying
在这个示例中,我们使用Lambda表达式创建了两个匿名方法,它们都接受一个整数,计算它的平方,并将结果打印到控制台。在C#中,匿名方法是一种没有名称的方法,可以被用作委托的参数或者赋值给委托类型的变量。匿名方法主要有两种形式:匿名方法和lambda表达式。在这个示例中,我们创建了一个匿名方法,该方法接受一个整数,计算它的平方,并将结果打印到控制台。然后我们将这个匿名方法赋值给。总的来说,匿名方法提供了一种方便的方式来创建和使用小的、简单的方法,而不需要定义一个完整的方法。类型的变量,并调用这些方法。原创 2023-11-16 23:10:06 · 1227 阅读 · 1 评论 -
C#多线程Thread、Task
在C#中,线程可以用于完成需要耗费较长时间的操作,而不会阻塞用户界面。一个程序可以有多个线程,每个线程可以并行执行代码。在C#中,可以使用System.Threading.Thread类来创建和控制线程,使用System.Threading.Mutex类来同步线程。原创 2023-11-16 22:20:15 · 504 阅读 · 0 评论 -
.NET CLR介绍
NET CLR(公共语言运行时)是.NET框架的重要组成部分,它提供了一种环境,使 .NET 程序能够在其中执行。CLR 负责管理 .NET 应用程序的执行,包括内存管理、线程管理、异常处理、垃圾回收等。总的来说,CLR 提供了一个层,它抽象了操作系统,使 .NET 开发者能够专注于编写代码,而不需要关心底层的细节,如内存管理和线程调度等。对象时,CLR 负责在内存中为这个对象分配空间。)时,CLR 的垃圾回收器会自动清理其占用的内存。在这个示例中,当我们创建一个新的。对象不再被使用(即设置为。原创 2023-11-16 21:56:56 · 698 阅读 · 0 评论 -
C# json解析与生成json字符串
在C#中使用Newtonsoft.Json解析JSON,首先需要安装Newtonsoft.Json NuGet包。可以通过以下步骤进行安装:(1) 打开Visual Studio项目。(2) 在“解决方案资源管理器”中,右键单击项目,然后选择“管理NuGet程序包”。在NuGet包管理器中,搜索“Newtonsoft.Json”。找到Newtonsoft.Json包,点击安装按钮。如下图安装完成后,就可以在C#代码中使用Newtonsoft.Json来解析JSON了。原创 2023-06-12 23:55:48 · 5103 阅读 · 0 评论 -
C# 读写Ini文件,全代码示例解析
ini文件在Win95以前比较盛行,之后由于出册表等技术的出现,ini技术主键退居二线,不过对于一些小项目,读写ini文件还是很适用的。 Windows API提供了读写配置文件的操作,在C#程序中只要导入相应的API即可。例如GetPrivateProfileString()方法,在MSDN查得原型如下:DWORD GetPrivateProfileStrin...原创 2018-04-02 10:04:40 · 3661 阅读 · 3 评论