引言 yield关键字是C中的一种语言特性,用于在枚举器中简化迭代器的实现。它使得开发人员可以通过定义自己的迭代器来简化代码,而不必手动实现IEnumerable和IEnumerator接口。 使用yield关键字,可以将迭代器中的值一次一个地返回,而不必使用一个集合对象存储所有的值。当执行到yieldreturn语句时,代码将会暂停执行,将返回值传递给迭代器的调用者,并将迭代器的状态保存下来。当下一次调用MoveNext方法时,代码将从之前的暂停点继续执行,直到遇到下一个yieldreturn语句或者迭代器结束。 接下来探索一下yield的三种玩法: 初级 例如通过yield创建出一个IEn...

  uUAzFRvZtFYa   2023年11月02日   85   0   0 .NET

引言 上文编码技巧--同步锁对象的选定中,提到了在C中,让线程同步有两种方式: 锁(lock、Monitor等) 信号量(EventWaitHandle、Semaphore、Mutex) 加锁是最常用的线程同步的方法,就不再讨论,本篇主要讨论使用信号量同步线程。 WaitHandle介绍 实际上,再C中EventWaitHandle、Semaphore、Mutex都是抽象类WaitHandle的派生类,它提供了一组等待信号的方法和属性。如下图: 主要包含静态方法SignalAndWait(),WaitAll(),WaitAny()及一个虚方法WaitOne()。下面介绍一个这几个方法。 ...

  uUAzFRvZtFYa   2023年11月02日   115   0   0 .NET

引言 众所周知,使用线程可以极大的提高应用程序的效率和响应性,提高用户体验,但是不可以无节制的使用线程,为什么呢? 线程的开销 线程的开销实际上是非常大的,我们从空间开销和时间开销上分别讨论。 线程的空间开销 线程的空间开销来自这四个部分: 线程内核对象(ThreadKernelObject)。每个线程都会创建一个这样的对象,它主要包含线程上下文信息,在32位系统中,它所占用的内存在700字节左右。 线程环境块(ThreadEnvironmentBlock)。TEB包括线程的异常处理链,32位系统中占用4KB内存。 用户模式栈(UserModeStack),即线程栈。线程栈用于保存方法的参数...

  uUAzFRvZtFYa   2023年11月02日   66   0   0 .NET

引言 汇总一下所有的.NETIL指令,以及它们的名称、操作码值、堆栈转换行为和描述。 作为反编译IL代码时的查询字典。 IL指令集列表 以下内容来自微软官方文档,通过百度翻译API翻译为中文。 指令 英文描述 中文描述 Add Addstwovaluesandpushestheresultontotheevaluationstack. 将两个值相加,并将结果推送到计算堆栈中。 Add_Ovf Addstwointegers,performsanoverflowcheck,andpushestheresultontotheevaluationstack. 将两个整数相加,执行溢...

  uUAzFRvZtFYa   2023年11月02日   104   0   0 .NET

引言 dynamic是Framework4.0就出现特性,它的出现让C具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,默认dynamic对象支持开发者想要的任何特性。 dynamic介绍 在C中,dynamic是一种类型,它允许你在运行时动态地确定对象的类型。 使用dynamic类型可以使代码更加灵活,因为不需要在编译时知道对象的确切类型,而可以在运行时根据需要确定类型。 确保dynamic对象调用有效 但是正因为你不知道对象的确切类型,所以在编码时一定要注意,确保对象的类型和属性和方法的存在,否则代码可能会引发运行时异常。 比如以下代码: staticvoidMain(stri...

  uUAzFRvZtFYa   2023年11月02日   59   0   0 .NET

引言 现在模拟一个异步方法抛出了异常: publicstaticasyncTaskThrowAfter(intms,stringmessage) { awaitTask.Delay(ms); thrownewException(message); } 思考一下,DontHandle()方法是否能够捕获到异常? publicstaticvoidDontHandle() { try { ThrowAfter(1000,"first"); } catch(Exceptionex) { Console.WriteLine(ex.Message); } } 答案是:不会捕获到异常! 因为Dont...

  uUAzFRvZtFYa   2023年11月02日   41   0   0 .NET

引言 今天同事问了我一个问题,System.Windows.Forms.Timer是前台线程还是后台线程,我当时想的是它是跟着UI线程一起结束的,应该是前台线程吧? 我确实没有仔细研究过他们的异同,所以带着这个疑问探究一下System.Windows.Forms.Timer。 System.Windows.Forms.Timer 机制 System.Windows.Forms.Timer是WindowsForms中的一个定时器控件,它的工作原理基于Windows消息循环机制。 这个Windows消息循环机制说简单一点就是它有一个消息队列,一个while(true)循环结构,一个窗口消息处理函数...

  uUAzFRvZtFYa   2023年11月02日   41   0   0 .NET

引言 深拷贝是指创建一个新对象,该对象的值与原始对象完全相同,但在内存中具有不同的地址。这意味着如果您对原始对象进行更改,则不会影响到复制的对象 常见的C常见的深拷贝方式有以下4类: 各种形式的序列化及反序列化。 通过反射机制获取该对象的所有字段和属性信息。遍历所有字段和属性,递归将源对象中的值复制到目标对象中。 新建对象,手动复制所有成员变量。 实现ICloneable接口,重写Colne方法。方法内部可以调用上面任意实现方法。 序列化、反序列化 使用二进制序列化和反序列化 可以使用BinaryFormatter类将对象序列化成二进制形式并保存到文件或内存流中,然后再使用BinaryFo...

  uUAzFRvZtFYa   2023年11月02日   61   0   0 .NET

引言 今天在做一个设置文件夹路径的功能,就是一个文本框,加个按钮,点击按钮,弹出FolderBrowserDialog再选择文件夹路径,简单做法,可以直接StackPanel横向放置一个TextBox和一个ImageButton,然后点击按钮在后台代码中给ViewModel的FilePath赋值。但是这样属实不够优雅,UI不够优雅,代码实现也可谓是强耦合,那接下来我分享一下我的实现方案。 目标 做这个设置文件夹路径的功能,我的目标是点击任何地方都可以打开FolderBrowserDialog,那就需要把文本框,按钮作为一个整体控件,且选择完文件夹路径后就给绑定的ViewModel的FilePa...

  uUAzFRvZtFYa   2023年11月02日   62   0   0 .NET

引言 抽象工厂模式一种创建型设计模式,它提供了一种方式来封装一组具有相同主题的工厂,而不必指定它们具体的类。这样,客户端代码就可以使用抽象工厂来创建一组相关的对象,而不必关心实际创建的具体类。 抽象工厂模式有以下几个主要角色: 抽象工厂(AbstractFactory):声明用于创建抽象产品的操作的接口。 工厂实现(ConcreteFactory):实现创建具体产品对象的操作。 抽象产品(AbstractProduct):声明产品对象类型的接口。 产品实现(Product):定义由相应的具体工厂创建的产品对象,实现AbstractProduct接口。 下面使用C实现抽象工厂模式: 抽象工厂...

  uUAzFRvZtFYa   2023年11月01日   38   0   0 设计模式

引言 工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但是让子类决定将哪一个类实例化。换句话说,工厂方法模式让一个类的实例化延迟到其子类。 工厂方法模式有以下几个主要角色: 抽象工厂(AbstractFactory):声明用于创建抽象产品的操作的接口。 工厂实现(ConcreteFactory):实现创建具体产品对象的操作。 抽象产品(AbstractProduct):声明产品对象类型的接口。 产品实现(Product):定义由相应的具体工厂创建的产品对象,实现AbstractProduct接口。 下面使用c实现一个工厂方法模式: 抽象工厂 publicabstractc...

  uUAzFRvZtFYa   2023年11月01日   57   0   0 设计模式

引言 观察者模式是一种行为型设计模式,它允许对象之间建立一种一对多的关系,使得当一个对象状态改变时,所有依赖它的对象都能够自动得到通知并更新自己的状态。该模式可以帮助我们实现松耦合的系统,以便更好地应对变化和扩展。 在观察者模式中,有两个角色:观察者和被观察者。被观察者负责维护观察者列表,并在状态发生改变时通知观察者;观察者则负责接收被观察者的通知并进行相应的处理。 下面我们通过一个简单的例子来说明观察者模式的用法。假设我们要实现一个计数器,每次计数器增加时需要通知所有的观察者。 观察者 先定义一个接口IObserver,用于定义观察者的行为,该接口只有一个方法Update,用于接收被观察者的...

  uUAzFRvZtFYa   2023年11月01日   48   0   0 设计模式

引言 原型模式是一种创建型设计模式,它允许我们创建一个对象的副本,而不需要显式地使用构造函数来创建一个新的对象。这种模式通常用于创建那些具有复杂创建过程或需要大量资源的对象。 在原型模式中,我们首先定义一个原型接口,该接口包含一个克隆方法。然后我们创建一个原型对象,该对象实现了原型接口并提供了自己的克隆方法。最后,我们可以使用原型对象的克隆方法来创建新的对象,而无需重新实例化原型对象。 IClone接口 需要定义一个IClone接口。这个类中应该包含一个Clone方法,用于克隆自身。 publicinterfaceIClone<T>whereT:class { publicTClo...

  uUAzFRvZtFYa   2023年11月01日   63   0   0 设计模式

引言 责任链模式是一种行为型设计模式,它通过一条由多个处理器组成的链来处理请求,每个处理器都有机会处理请求,如果一个处理器不能处理该请求,它会将请求传递给下一个处理器,直到请求被处理为止。 在实际应用中,责任链模式常用于处理请求的分发、事件处理等场景,它的优点在于可以动态地添加、删除处理器,从而灵活地处理请求。 下面使用C实现的简单责任链模式的示例: 抽象处理器类 publicabstractclassHandler { protectedHandlersuccessor;//下一个处理器 publicvoidSetSuccessor(Handlersuccessor) { this.suc...

  uUAzFRvZtFYa   2023年11月01日   81   0   0 设计模式

引言 软件开发过程中,我们经常会遇到各种设计问题,例如如何管理对象之间的关系、如何优化代码的可复用性和可维护性等等。为了解决这些问题,我们可以使用设计模式。 设计模式是一种被广泛接受的软件设计思想,它提供了一套通用的解决方案,可以帮助我们更好地解决常见的软件设计问题。设计模式是从实践中总结出来的,它不仅可以提高代码的可读性和可维护性,还可以提高开发效率和代码的可复用性。 常见设计模式原则 设计模式有常见的五大原则SOLID 单一职责原则(SRP) 开放封闭原则(OCP) 里氏替换原则(LSP) 接口隔离原则(DIP) 依赖倒置原则(ISP) 补充第六原则,迪米特法则(LawofDemete...

  uUAzFRvZtFYa   2023年11月01日   109   0   0 设计模式

数据结构起源 早期人们都把计算机理解为数值计算工具,就是感觉计算机当然是用来计算的,所以计算机解决问题,应该是先从具体问题中抽象出一个适当的数据模型,设计出一个解此数据模型的算法,然后再编写程序,得到一个实际的软件。 可现实中,我们更多的不是解决数值计算的问题,而是需要一些更科学有效的手段(比如表、树和图等数据结构)的帮助,才能更好地处理问题。所以数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。 基本概念和术语 数据数据是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据不仅仅包括整型、实型等数...

  uUAzFRvZtFYa   2023年11月01日   100   0   0 算法与数据结构
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~