![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c#基础
彭小彭~
这个作者很懒,什么都没留下…
展开
-
c# foreach 的实现原理,自定义一个实现foreach的类
foreach语句是被设计用来和可枚举类型一起使用,只要它的遍历对象是可枚举类型(实现了IEnumerable),比如数组。如果MoveNext()方法返回true,就使用IEnumerator接口的Current属性获取对象的一个引用,用于foreach循环。调用GetEnumerator()方法,返回一个IEnumerator引用。重复前面两步,直到MoveNext()方法返回false为止,此时循环停止。调用返回的IEnumerator接口的MoveNext()方法。原创 2024-04-26 06:23:49 · 335 阅读 · 0 评论 -
聊聊C#委托,匿名方法,Lambda,泛型委托,表达式树
原本很简单的程序,加上几个delegate关键字,这代码一下就变得深奥了,深奥的东西懂的人就变少了,所以这个还可以作为加薪的筹码。委托是通过delegate关键字来定义,简单来说,委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。不管是匿名方法还是Lambda表达式,完成一个委托的应用,都逃不过两个步骤,一步是定义一个委托,另一步是用一个方法来实例化一个委托。有些教材,博客说到委托都会提到事件,虽然事件是委托的一个实例,但是为了理解起来更简单,今天只谈委托不谈事件。原创 2024-04-24 06:41:01 · 789 阅读 · 0 评论 -
c# ?? 、?.、??=、?[]运算符的使用
在 C# 中存在一些特殊的运算符,它们简化了代码的编写,主要用于处理空值(null)或简化成员访问。原创 2024-04-24 04:07:49 · 767 阅读 · 0 评论 -
c# 构造函数 静态构造函数 内联字段(即静态字段和实例字段) 父类构造函数 父类静态构造函数 父类内联字段 执行顺序
2.子类的静态构造函数。4.父类的静态构造函数。原创 2024-04-23 07:45:18 · 539 阅读 · 1 评论 -
c# Enumerable<T>的GroupJoin方法和Join的用法和区别
方法,用于对两个集合进行连接操作。相当于 sql中的inner join。相当于 sql的 left join。方法用于生成一个扁平结果集,方法用于生成一个嵌套结果集。原创 2024-04-23 04:04:49 · 324 阅读 · 0 评论 -
C#中的delegate和event,及他们的区别
1、 在CLR运行时,委托FunSth实际上就一个类,该类有一个参数类型为方法的构造函数,并且提供了一个Invoke实例方法,用来触发委托的执行。2.事件只能通过“+=”,“-=”方式注册和取消订户处理函数,而委托除此之外还可以使用“=”直接赋值处理函数。1.委托允许直接通过委托去访问相应的处理函数,而事件只能通过公布的回调函数去调用。3 、通过委托FunSth的构造函数,可以把符合定义的方法赋值给委托。3 通过FunSth委托的构造函数为事件注册委托实例。4 、调用委托的实例方法Invoke执行了方法。原创 2024-04-23 03:16:05 · 401 阅读 · 0 评论 -
c#访问修饰符
以上是C#中常用的访问修饰符,可以根据需要选择合适的修饰符来控制成员的访问权限。C#中有多种访问修饰符,用于控制类、结构、方法、属性等成员的访问权限。原创 2023-09-20 13:18:40 · 618 阅读 · 0 评论 -
c# 反射的应用
需要注意的是,前面我们讲到了命名空间和装配件的关系,要查找一个类,必须指定它所在的装配件,或者在已经获得的Assembly实例上面调用GetType。程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。委托是C#中实现事件的基础,有时候不可避免的要动态的创建委托,实际上委托也是一种类型:System.Delegate,所有的委托都是从这个类派生的。然后,可以调用类型的方法或访问其字段和属性。程序集包含模块,而模块包含类型,类型又包含成员。原创 2024-04-21 02:05:13 · 593 阅读 · 0 评论 -
c#多线程 使用lock锁
关键字可以确保在同一时刻只有一个线程可以访问被锁定的代码块,从而避免线程资源竞争。,从而避免了线程资源竞争,确保了正确的递增操作。这样,只有一个线程可以同时访问。在这个示例中,我们使用。原创 2024-04-20 22:27:59 · 430 阅读 · 0 评论 -
c#继承 base的使用
C#中的继承是面向对象编程的重要概念之一,它允许一个类(称为子类或派生类)从另一个类(称为父类或基类)继承属性和行为。继承的主要目的是实现代码重用和层次化的组织。子类可以继承父类的字段、属性、方法和事件,而无需重新实现这些成员。通过继承,我们可以在子类中添加额外的功能或修改父类的行为,实现代码的扩展和定制。在C#中,使用冒号(:)符号来表示一个类继承自另一个类基类Console.WriteLine("说话");子类。原创 2023-08-30 22:03:19 · 1164 阅读 · 0 评论 -
C#中的HashTable和Dictionary之间的区别
提供了更好的类型安全性和性能。因此,当你使用.NET Framework 2.0及更高版本时,建议使用。,除非有特定的理由需要使用后者。都可以用于存储键值对,但。原创 2024-04-18 02:58:47 · 464 阅读 · 0 评论 -
c#抽象类和接口的区别
在C#中,抽象类(Abstract Class)和接口(Interface)都是用来定义抽象层和实现多态性的重要工具。原创 2024-04-18 01:10:02 · 630 阅读 · 0 评论 -
c# 值类型和引用类型的区别
在C#中,值类型(Value Types)和引用类型(Reference Types)是两种基本的数据类型分类,它们在内存管理、赋值方式、参数传递以及默认值等方面有着本质的区别。原创 2024-04-17 04:42:07 · 948 阅读 · 0 评论 -
c#数据储存栈(stack)和堆(heap)的方式
C#中,类的数据存储是通过堆(Heap)和栈(Stack)这两种内存结构来实现的。理解这两种数据结构的工作方式有助于更好地理解C#中的数据存储机制。原创 2024-04-17 04:29:00 · 818 阅读 · 0 评论 -
c#字段和属性的区别
在C#中,字段(fields)和属性(properties)都是类的成员,它们提供了类存储数据的方式,但它们在用途和功能上有着明显的区别。原创 2024-04-17 04:11:28 · 1097 阅读 · 0 评论 -
c# 浅拷贝(Shallow Copy)和深拷贝(Deep Copy)
在C#中,拷贝对象有两种方式:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。理解这两种拷贝的区别对于管理对象和避免在程序中意外地共享或复制数据至关重要。原创 2024-04-17 03:43:07 · 607 阅读 · 0 评论 -
c#IQueryable和IEnumberable的区别
选择还是取决于具体场景。如果你需要在数据库层面优化和执行查询,是更好的选择。如果你的数据已置于内存中或数据集不大,使用可能更为适宜。正确选择可以显著影响应用程序的性能和效率。原创 2024-03-25 14:31:42 · 471 阅读 · 0 评论 -
c#事件和委托代码demo
【代码】c#事件和委托代码demo。原创 2024-03-24 11:44:13 · 242 阅读 · 0 评论 -
c#异步编程
异步编程的目的是允许程序在进行耗时操作(如文件读写、网络请求、数据库查询等)时不被阻塞,而可以继续执行其他任务,从而提高程序的响应速度和吞吐量。而在方法内部,可以使用await关键字来等待异步操作的完成,然后继续执行后续的代码。需要注意的是,在使用这些方法时,开发者需要关注线程安全性和异常处理,以确保异步操作的可靠性和稳定性。在C#中,Task类是用于表示异步操作的重要类,它提供了许多用于管理和处理异步操作的方法。:获取任务的执行结果,如果任务尚未完成,则会阻塞当前线程直到任务完成。原创 2024-02-11 22:04:51 · 2058 阅读 · 0 评论 -
c#多线程
多线程并发可以提高程序的性能和响应能力,因为多个线程可以同时进行计算、I/O 操作和其他任务,从而提高系统的利用率和吞吐量。为了确保多线程并发的正确性和稳定性,需要使用同步机制(如锁、信号量、互斥体)、并发集合等技术来避免多个线程之间的冲突和竞争条件。在 C# 中,实现线程并发通常涉及多种概念和技术,包括线程同步、锁、信号量、并发集合等。总之,在 C# 中,多线程并发是指多个线程同时执行,可以通过合适的技术和方法来管理并发访问共享资源,提高程序的性能和效率。在 C# 中,可以使用多种方式来实现多线程。原创 2024-02-10 20:12:29 · 611 阅读 · 0 评论 -
c#进程(Process)常用方法
这些方法可以让你在C#中对进程进行启动、终止、查询等操作。当然,还有其他一些方法和属性可以用于进程的操作,具体使用取决于你的需求和场景。原创 2024-02-09 23:05:19 · 1542 阅读 · 0 评论 -
c#通过ExpressionTree 表达式树实现对象关系映射
/反射+expression实现对象自动映射。原创 2024-02-08 23:00:38 · 725 阅读 · 0 评论 -
c#通过反射完成对象自动映射
在 C# 中,可以使用 AutoMapper 库来完成对象之间的映射,而不必手动编写显式的映射代码。但是,如果你希望通过反射来动态完成对象的映射,你可以编写自己的映射逻辑并使用反射来完成这个过程。原创 2024-02-08 22:03:31 · 1227 阅读 · 0 评论 -
c#表达式树(MemberInitExpression)成员初始化表达式
它们提供了一种将表达式表示为数据结构的方式,可以用来表示像 lambda 表达式、委托、方法调用等等的各种表达式。C# 表达式树(Expression Tree)是一种将表达式表示为树状结构的数据结构,它在运行时可以被解析、分析和执行。表达式树通常用于动态创建和表示表达式,以便在运行时对其进行操作或者将其转换为其他形式。在这个示例中,我们使用 Expression 类创建了一个加法表达式树,并将其编译为委托,最后执行得到了结果。表达式树提供了一种灵活的方式来表示和操作表达式,可以在很多场景下发挥作用。原创 2024-02-08 20:00:12 · 619 阅读 · 0 评论 -
c#表达式树(CallMethodExpression)调用有参有返回值方法
的泛型类型,以匹配带有两个参数和返回值的 lambda 表达式。最后,我们修改了编译表达式树的过程,以匹配带有两个参数的委托。通过这种方式,我们可以根据方法的参数类型和数量来创建适配的表达式树,从而实现带有参数和返回值的方法调用。C# 中的 MethodCallExpression 用于表示方法调用的表达式树。的参数表达式,并在创建方法调用表达式时传入了这个参数。在这个示例中,我们修改了创建表达式树的过程,以适配具有。原创 2024-02-08 21:10:04 · 642 阅读 · 0 评论 -
c#观察者设计模式
C#创建观察者设计模式,使用了事件。这展示了在C#中使用事件实现的观察者设计模式。主题在事件发生时通知所有订阅的观察者。方法被调用时,它触发了事件并通知观察者。类实现了这个接口,用于处理事件通知。的实例,并订阅了主题的事件。原创 2024-02-08 18:44:48 · 1278 阅读 · 0 评论 -
c#内置委托
这些内置的委托提供了一种方便的方式来定义和传递方法,尤其在使用Lambda表达式时非常有用。通过使用这些内置委托,我们可以编写更简洁、易读的代码。原创 2024-02-08 17:52:17 · 540 阅读 · 0 评论 -
c#内置委托
这些内置的委托提供了一种方便的方式来定义和传递方法,尤其在使用Lambda表达式时非常有用。通过使用这些内置委托,我们可以编写更简洁、易读的代码。原创 2024-02-06 19:04:33 · 958 阅读 · 0 评论 -
c#委托 匿名方法和lamada表达式演变过程代码演示
在上面的示例中,我们展示了C#中委托、匿名方法和Lambda表达式的演变过程。这些示例演示了如何使用不同版本中的语法来实现相同的功能,以展示这些概念的演变过程。原创 2024-02-06 18:45:00 · 581 阅读 · 0 评论 -
c# 委托
在 C# 中,委托(delegate)是一个类型,它可以用来引用方法,并且可以像其他对象一样进行操作。回调函数是一种通过委托将方法传递给其他方法的技术,使得调用方法能够在适当的时候调用传递的方法。此外,委托还可以用于事件处理、回调函数、多播委托等方面,它为 C# 中的事件驱动和回调提供了很大的灵活性和可扩展性。通过这种方式,我们可以使用委托作为回调函数,实现了在适当的时候调用指定的方法,从而提供了更大的灵活性和可扩展性。然后,可以使用委托实例来调用绑定的方法,这样可以动态地确定要调用的方法。原创 2024-02-05 23:29:55 · 601 阅读 · 0 评论 -
c#stream
是一个抽象基类,用于处理输入和输出的字节序列。它是所有输入/输出 (I/O) 操作的基础,包括文件操作、网络操作、内存操作等。类提供了一组方法和属性,使得可以对数据进行读取、写入和定位。等,可根据不同的需求选择合适的流类型来进行I/O操作。进行基本的读取和写入操作。类还有许多其他派生类,如。上述示例演示了如何使用。原创 2024-02-05 22:44:52 · 573 阅读 · 0 评论 -
c#directory 和directoryinfo的使用
类的操作也类似,不同之处在于它提供了更多的目录属性信息。类的一些基本操作,你可以根据自己的需求进行更多的操作。类来执行各种目录操作。当使用C#处理目录时,可以使用。原创 2024-02-05 22:32:26 · 628 阅读 · 0 评论 -
c# File文件操作
类的操作也类似,不同之处在于它提供了更多的文件属性信息。类的一些基本操作,你可以根据自己的需求进行更多的操作。类来执行各种文件操作。当使用C#处理文件时,可以使用。原创 2024-02-05 21:44:16 · 515 阅读 · 0 评论 -
c#队列和栈
在C#中,队列和栈是两种常用的数据结构,它们分别用于不同的场景和需求。下面分别介绍队列和栈的详细用法。原创 2024-02-04 18:01:27 · 484 阅读 · 0 评论 -
c# datatable 通过反射转成泛型list
这个方法接收一个DataTable作为参数,并使用反射技术将其转换为指定类型的泛型列表。在方法中,我们使用foreach循环遍历DataTable的行和列,然后使用反射来动态设置对象的属性值。在C#中,可以使用反射来将DataTable转换为泛型列表。这种方法能够以通用的方式来转换任何实体类对应的DataTable为泛型列表,使代码更加灵活和可复用。类,可以很容易地将DataTable转换为任何指定类型的泛型列表。类的属性结构,将DataTable中的数据转换为。在这个示例中,我们创建了一个名为。原创 2024-01-31 01:36:13 · 635 阅读 · 0 评论 -
c#泛型(Generic)
在C#中,泛型是一种强大的特性,它允许你编写可以适用于多种类型的类、方法和数据结构。通过泛型,你可以编写更加灵活和可重用的代码,而不需要对每种数据类型都编写不同的实现。原创 2024-01-28 19:38:12 · 508 阅读 · 0 评论 -
c# Newtonsoft.Json 序列化和反序列化
这个示例演示了如何使用Newtonsoft.Json库在C#中进行简单的对象序列化和反序列化。希望这个示例对你有所帮助。如果你有任何问题,请随时问我。对象,将其序列化为JSON字符串,并将其打印出来。接着,我们将JSON字符串反序列化为一个新的。1.安装 Newtonsoft.Json Nuget包。在上面的示例中,我们首先创建了一个名为。对象,并将其属性打印出来。方法中,我们创建了一个。原创 2024-01-28 00:30:13 · 1090 阅读 · 0 评论 -
c#定义特性,通过反射获取特性
当你定义了一个特性,并将其应用到类或方法上后,你可以使用反射来获取这些特性的信息。通过这样的方式,我们可以在运行时访问并读取类和方法上的特性信息,以获取它们的元数据信息。希望这个示例对你有所帮助。如果你有任何问题,请随时问我。在上面的示例中,我们使用了反射来获取。方法来获取类和方法上的特性信息。原创 2024-01-27 23:21:01 · 880 阅读 · 0 评论 -
c#扩展方法
在 C# 中,扩展方法是一种特殊的静态方法,它可以为现有的类添加新的方法,而无需修改原始类的代码。这使得你可以在不继承该类或使用装饰器模式的情况下,为现有的类添加新的功能。希望这可以帮助你了解 C# 中的扩展方法。如果你有任何问题,请随时问我。的扩展方法,该方法用于计算字符串中的单词数。方法中,我们直接调用了这个扩展方法,而不是调用。原创 2024-01-26 18:06:44 · 544 阅读 · 0 评论 -
c#反射用法
反射是一个强大的工具,可以用于许多高级用途,例如插件系统、序列化和反序列化对象、自定义注解和解析器等。但是需要注意,由于反射操作是在运行时进行的,所以会带来性能开销和安全性方面的考量。因此,在使用反射时需要谨慎考虑其影响。在 C# 中,反射是一种能够在运行时检查类型信息、访问属性和调用方法的机制。通过反射,你可以动态地操作类型、对象和程序集,而无需在编译时知道这些类型的具体信息。反射提供了一组 API,可以让你在运行时获取和操作类型的信息。原创 2024-01-26 15:47:26 · 660 阅读 · 0 评论