![](https://img-blog.csdnimg.cn/0b9c71b3b44c409dbf6daff30b36fc1a.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C#
文章平均质量分 91
C#
正在奋斗的程序猿
少年,就要止步于此了吗?
展开
-
C# 闭包详解
闭包是指在程序运行时能够记住并访问定义时的外部作用域中变量的函数。它具备两个核心特征:能作为第一类对象传递(头等函数)和能捕获自由变量。头等函数意味着函数可以作为参数传递给其他函数,也可以作为返回值。自由变量是指在闭包函数内部引用但是不在函数内定义的变量。闭包和委托机制不仅存在于 C# 中,许多现代编程语言都采用类似的设计来实现闭包功能。这种设计不仅仅帮助解决编程语言之间的语法差异,更重要的是提供了一种灵活和强大的编程工具,用于处理复杂的数据和控制流需求。原创 2024-08-05 22:19:29 · 1214 阅读 · 0 评论 -
学习c#的第二十四天
当基类事件被触发时,我们定义的事件处理程序 BaseEvent_Handler 将被调用,并输出 "在派生类中处理的基事件。在取消订阅事件之前,在发布对象中作为该事件的基础的多播委托会引用封装了订户的事件处理程序的委托。通过事件,事件发布者可以通知事件订阅者事件的发生,并且订阅者可以对事件作出响应。在add访问器中,我们输出添加事件处理程序的消息,并将事件处理程序添加到myEvent事件中。在这个方法中,通过调用事件类型的 Invoke 方法来触发事件,并将自定义事件参数对象传递给事件处理程序。原创 2023-11-27 19:47:08 · 4582 阅读 · 2 评论 -
学习c#的第二十三天
如果委托使用引用参数,引用将按相反的顺序传递到所有这三个方法,并且一种方法进行的任何更改都将在另一种方法上见到。当方法引发未在方法内捕获到的异常时,该异常将传递到委托的调用方,并且不会调用调用列表中的后续方法。事件发生时,源调用委托。委托不知道除其所封装方法以外的实例类型,因此委托可以引用任何类型的对象,只要该对象上有与委托签名匹配的方法。调用方传递到委托的参数将传递到该方法,并且委托会将方法的返回值(如果有)返回到调用方。这个多播委托包含了一个已经分配好的委托列表,调用多播委托时会依次调用列表中的委托。原创 2023-11-21 12:36:46 · 230 阅读 · 0 评论 -
学习c#的第二十二天
索引器必须与具体的实现相关联,而接口只能定义方法、属性、事件和索引器的成员契约,而不包含实际的实现。通过这种方式,我们可以在接口中定义索引器的契约,然后在实现接口的类中完成对索引器的具体实现。这样做的好处是,当多个类需要实现相同的索引器行为时,可以通过接口来统一规范,从而提高代码的可维护性和扩展性。在上面的示例中,定义了一个名为SampleCollection的泛型类,该类包含一个私有的T类型数组arr,并且定义了一个索引器this,用于对arr数组进行索引操作。索引器的签名由其形参的数目和类型所组成。原创 2023-11-20 12:21:11 · 1169 阅读 · 0 评论 -
学习c#的第二十一天
在这种情况下,对于值类型和引用类型,T?在上面的示例中,我们首先定义了一个泛型委托类型 Calculator<T>,它接受两个类型为 T 的参数,并返回类型为 T 的结果。通过在方法名称后面加上尖括号和类型参数,我们可以告诉编译器这是一个泛型方法,并且在调用该方法时需要指定具体的类型。通过使用泛型委托,我们可以定义一个委托类型,该委托可以接受不同类型的参数,并返回不同类型的结果。在调用泛型方法时,我们需要在方法名后面的尖括号中指定具体的类型,以告诉编译器我们要使用该方法处理哪种类型的数据。原创 2023-11-19 10:38:55 · 312 阅读 · 2 评论 -
学习c#的第二十天
在 Main 方法中,我们演示了如何通过公共的 get 访问器在外部访问属性的值,以及尝试使用私有的 set 访问器设置属性的值,由于私有的 set 访问器只能在类内部访问,所以最后一行代码会导致编译错误。需要注意的是,如果属性只包含 get 访问器而没有 set 访问器,那么这个属性就是一个只读属性,只能在类的内部进行赋值。:属性可以是读写属性(既有 get 访问器又有 set 访问器)、只读属性(只有 get 访问器,没有 set 访问器)或者只写属性(只有 set 访问器,没有 get 访问器)。原创 2023-11-18 16:25:21 · 306 阅读 · 0 评论 -
学习c#的第十九天
特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。通过在自定义特性类上应用 AttributeUsage 特性,可以定义该特性可以应用到哪些程序元素上,以及是否允许多次应用同一个特性。在这个类中,你可以添加自定义的属性和方法,以便存储和处理声明性的信息。在这个示例中,Serializable 是一个特性,它被应用到 MyClass 类上,为这个类添加了序列化的能力。原创 2023-11-18 10:54:45 · 215 阅读 · 0 评论 -
学习c#的第十八天
然后使用相同的文件路径和 FileMode.Open、FileAccess.Read 参数创建了另一个 FileStream 对象,以只读方式访问文件,并从中读取数据。然后使用 GetFiles 方法获取目录中的所有文件信息,并遍历输出每个文件的名称、大小和最后访问时间等信息。通过使用 DirectoryInfo 类和 FileInfo 类,可以方便地获取目录和文件的各种信息,并对其进行操作。System.IO 命名空间有各种不同的类,用于执行各种文件操作,如创建和删除文件、读取或写入文件,关闭文件等。原创 2023-11-18 09:58:03 · 202 阅读 · 0 评论 -
学习c#的第十七天
C# 异常处理C # 中的异常提供了结构化、统一和类型安全的方式来处理系统级别和应用程序级别的错误条件。异常的原因可以通过两种不同的方法引发异常。System.Exception 类System.Exception类是所有异常的基类型。可以在对的实例构造函数的调用中指定这些属性的值 System.Exception。原创 2023-11-17 11:16:20 · 267 阅读 · 0 评论 -
学习c#的第十六天
C# 正则表达式是一种匹配输入文本的模式。.Net 框架提供了允许这种匹配的正则表达式引擎。模式由一个或多个字符、运算符和结构组成。如果你还不理解正则表达式可以阅读或者看完这篇文章。定义正则表达式字符转义正则表达式中的反斜杠字符 (\) 指示其后跟的字符是特殊字符(如下表所示),或应按原义解释该字符。有关详细信息,请参阅。字符类字符类与一组字符中的任何一个字符匹配。字符类包括下表中列出的语言元素。有关更多信息,请参见。namename定位点。原创 2023-11-17 09:19:27 · 617 阅读 · 1 评论 -
学习c#的第十五天
3、#pragma preprocessor:用于控制预处理器行为的指令,例如 #pragma preprocessor region 和 #pragma preprocessor endregion 用于定义和结束一个预处理器区域。一个预处理器指令必须是该行上的唯一指令。在这个示例中,我们定义了一个名为DEBUG_MODE的符号,并使用条件编译指令#if来根据不同的条件执行相应的操作。在C#中,#line指令是用于改变源代码中的行号和文件名信息,而不是编译器生成的错误或警告消息中的行号和文件名信息。原创 2023-11-16 22:06:46 · 599 阅读 · 0 评论 -
学习c#的第十四天
而"显示实现接口"是一种特殊的实现方式,实现的方法不会作为实现类的公共方法,而是只能通过接口引用来调用。在上述示例中,我们在 Program 类中通过 using 关键字引入了 OuterNamespace 和 OuterNamespace.InnerNamespace,然后可以直接使用这两个命名空间下的类和方法。在 Main 方法中,创建了 Circle 的实例,并将其赋值给 IResizableShape 类型的变量,然后调用了其继承自基础接口和新增方法,可以看到接口继承可以让代码更加灵活和可扩展。原创 2023-11-16 14:01:49 · 315 阅读 · 0 评论 -
学习c#的第十三天
抽象类提供了一种统一的接口,定义了需要实现的方法,而具体的实现则由派生类来完成。:子类中为满足自己的需要来重复定义某个方法的不同实现,需要用 override 关键字,被重写的方法必须是虚方法,用的是 virtual 关键字。在上述代码中,Shape 类定义了一个 Draw() 方法,Circle 类继承自 Shape 并定义了一个同名的 Draw() 方法并使用 new 关键字进行方法隐藏。另外,虚方法是在基类中,可以使用关键字virtual来声明一个方法为虚方法,表示它可以被派生类重写。原创 2023-11-15 18:21:01 · 247 阅读 · 0 评论 -
学习c#的第十二天
然后,在Program类中的Main方法中,我们创建了一个Person对象person1,并通过调用公共的成员函数来设置其姓名和年龄,并最终调用Introduce方法来展示这个人的信息。封装的目的是隐藏类的内部实现细节,使得类的使用者只需要关注如何使用类的公共接口,而不需要了解其内部的具体实现。在C#中,析构函数是类的一个特殊成员函数,它在对象的生命周期结束时被调用,用于执行一些清理操作,比如释放资源、关闭文件等。在C#中,构造函数是一种特殊的方法,用于在创建类的新实例时初始化对象。原创 2023-11-14 13:29:35 · 255 阅读 · 0 评论 -
学习c#的第十一天
C# 结构体(Struct)定义结构体在 C# 中,定义结构体使用关键字 struct。在这个例子中,我们定义了一个名为 Point 的结构体,它有两个公共的整型成员变量 X 和 Y。此外,我们还定义了一个带有两个参数的构造函数来初始化 X 和 Y 的值。在 C# 中,结构体是一种值类型,与类不同,它们是按值进行分配和传递的,而不是按引用。结构体通常用于表示轻量级的数据结构,比如坐标、颜色、矩形等简单的数据类型。使用结构体可以避免创建对象实例时引发的开销,并且在某些情况下有助于提高性能。原创 2023-11-14 11:53:13 · 226 阅读 · 0 评论 -
学习c#的第十天
C# 字符串(String)创建 String 对象可以使用以下方法之一来创建 string 对象:1、通过给 String 变量指定一个字符串2、通过使用 String 类构造函数3、通过使用字符串串联运算符( + )4、通过检索属性或调用一个返回字符串的方法5、通过格式化方法来转换一个值或对象为它的字符串表示形式String 类的属性StringCharStringString 类的方法String 类有许多方法用于 string 对象的操作。上面的方法列表并不详尽,请访问。原创 2023-11-13 19:54:50 · 754 阅读 · 1 评论 -
学习c#的第九天
C# 可空类型(Nullable)C# 可空类型(Nullable)C# 可空类型(Nullable)可空类型允许我们在值类型中包含 null 值,这在处理数据库查询结果或需要表示缺失值的情况时非常有用。其中 是基础的值类型,例如 int、bool 等,?符号表示这是一个可空类型, 是变量名,= 后面的 null 表示初始时该可空类型变量的值为 null。原创 2023-11-13 12:28:29 · 280 阅读 · 0 评论 -
学习c#的第八天
在这个示例中,我们定义了一个 RecursionExample 类,并在其中定义了一个名为 Factorial 的递归方法,用于计算给定整数的阶乘。所谓复杂,是参数是数组或集合类型,或者参数包含这些类型数据,这种情况下上面的方法不能保证参数数据不被修改,因为即使对象为只读的,但是对象中的数组或集合字段(属性)还是可以修改的。当你向方法传递值参数时,会创建一个新的变量,该变量存储了原始值的副本,而不会影响原始值。在 C# 中,扩展方法允许你向现有的类添加新的方法,而无需修改原始类的定义,也不需要继承该类。原创 2023-11-12 20:43:19 · 377 阅读 · 0 评论 -
学习c#的第七天
举个例子,一个人A为父类,他的儿子B,妻子C,私生子D(注:D不在他家里)public 事件:所有人都知道,就像公开的信息一样,任何人都可以访问。protected 事件:A,B和D知道,但妻子C不知道。这里假设B是A的儿子,D是A的私生子,因此他们可以知道这些信息。而妻子C不知道,因为她并不是A的子类。private 事件:只有A知道,这意味着这些事件只能被A访问,对于其他家庭成员来说是私密的。原创 2023-11-12 20:11:07 · 336 阅读 · 0 评论 -
学习c#的第六天
因此,如果要使用无限循环,务必要有明确的终止循环的条件,并且确保在适当的时候跳出循环,以免造成程序异常或系统负担过重。在上面的示例中,外层循环控制乘法表的行数,内层循环控制每一行的输出内容。在这个示例中,当 count 小于 5 时,循环体内的代码会被执行,并且在每次循环迭代之后 count 的值会递增,直到 count 不再小于 5 时循环终止。在这个示例中,for 循环会从 i=0 开始,当 i<5 时,执行循环体内的代码,并且在每次循环迭代之后 i 的值会递增,直到 i 不再小于 5 时循环终止。原创 2023-11-11 23:59:57 · 440 阅读 · 0 评论 -
学习c#的第五天
下表将按运算符优先级从高到低列出各个运算符,具有较高优先级的运算符出现在表格的上面,具有较低优先级的运算符出现在表格的下面。例如 x = 7 + 3 * 2,在这里,x 被赋值为 13,而不是 20,因为运算符 * 具有比 + 更高的优先级,所以首先计算乘法 3*2,然后再加上 7。某些运算符比其他运算符有更高的优先级,例如,乘除运算符具有比加减运算符更高的优先级。:有括号先括号,后乘除在加减,然后位移再关系,逻辑完后条件,最后一个逗号 ,。下表列出了 C# 支持的其他一些重要的运算符,包括。原创 2023-11-11 20:56:23 · 319 阅读 · 0 评论 -
学习c#的第四天
在后续的代码中,无法修改这些常量的值。在上面的示例中,第一个字符串常量跨越多行,但通过在每行的末尾添加空格,编译器将其连接成一个完整的字符串。通过静态变量,可以在类的所有实例之间共享相同的数据,这在某些情况下非常有用,比如跟踪全局状态、存储常量值或者单例模式的实现等。在C#中,每个变量都有特定的类型,类型决定了变量的内存大小和布局,以及可以对变量进行的操作。所以,在 C# 中,变量是 lvalue,因此可以出现在赋值语句的左边,而数值、常量、表达式等都是 rvalue,只能出现在赋值语句的右边。原创 2023-11-11 18:42:53 · 334 阅读 · 0 评论 -
学习c#的第三天
将一个较大的整数类型转换为较小的整数类型时,可能会发生数据溢出。隐式转换只能将较小范围的数据类型转换为较大范围的数据类型,不能将较大范围的数据类型转换为较小范围的数据类型:这是因为较小范围的数据类型所能表示的值范围比较大范围的数据类型要小,因此从较小范围的类型转换到较大范围的类型时不会发生数据丢失。在C#中,显式类型转换是通过强制类型转换符号来实现的,它用于将一个数据类型转换为另一个数据类型,特别是当需要将一个较大范围的数据类型转换为一个较小范围的数据类型时,或者需要将一个对象类型转换为另一个对象类型时。原创 2023-11-10 19:26:19 · 399 阅读 · 0 评论 -
学习c#的第二天
C# 基本语法C# 是一种面向对象的编程语言。在面向对象的程序设计方法中,程序由各种相互交互的对象组成。相同种类的对象通常具有相同的类型,或者说,是在相同的 class 中。例如,以 Rectangle(矩形)对象为例。它具有 length 和 width 属性。根据设计,它可能需要接受这些属性值、计算面积和显示细节。在上面的示例中,我们首先定义了一个Rectangle类,并声明了该类的成员变量、构造函数和方法。原创 2023-11-10 18:54:02 · 1233 阅读 · 0 评论 -
学习c#的第一天
同时,基本的文本编辑器和命令行编译器也是可以用来进行 C# 编程的,但相比集成开发环境来说,它们可能缺乏一些便利的功能和工具。虽然 C# 的构想十分接近于传统高级语言 C 和 C++,是一门面向对象的编程语言,但是它与 Java 非常相似,有许多强大的编程功能,因此得到广大程序员的青睐。这些组件构成了.NET Framework的核心部分,使得开发人员能够以更高效、更灵活的方式开发各种类型的应用程序,并实现不同语言之间的互操作。:Main方法是程序的入口点,它是程序开始执行的地方。原创 2023-11-09 14:53:02 · 423 阅读 · 0 评论