07 2023 档案

摘要:## 引言 现在模拟一个异步方法抛出了异常: ```csharp public static async Task ThrowAfter(int ms, string message) { await Task.Delay(ms); throw new Exception(message); } ` 阅读全文
posted @ 2023-07-31 08:13 NiueryDiary 阅读(1510) 评论(0) 推荐(4)
摘要:## 引言 **dynamic** 是 `Framework 4.0` 就出现特性,它的出现让 C# 具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,默认 **dynamic** 对象支持开发者想要的任何特性。 ## dynamic 介绍 在C#中,dynamic是一种类型,它允许你在 阅读全文
posted @ 2023-07-24 12:06 NiueryDiary 阅读(1096) 评论(4) 推荐(2)
摘要:介绍 今天介绍一个非常强大的基于.Net 的基准测试工具BenchmarkDotNet。 BenchmarkDotNet 已经被14300多个项目采用,包括非常多的知名开源项目,例如 dotnet/performance(.Net所有运行时的基准测试项目) dotnet/runtime(.Net 运 阅读全文
posted @ 2023-07-21 13:42 NiueryDiary 阅读(1286) 评论(0) 推荐(0)
摘要:## 引言 汇总一下所有的 .NET IL 指令,以及它们的名称、操作码值、堆栈转换行为和描述。 作为反编译IL代码时的查询字典。 ## IL 指令集列表 以下内容来自[微软官方文档](https://learn.microsoft.com/en-us/dotnet/api/system.refle 阅读全文
posted @ 2023-07-21 08:51 NiueryDiary 阅读(845) 评论(0) 推荐(0)
摘要:## 引言 先不论什么是闭包,什么是闭包陷阱,我们开篇先看一段代码: ```csharp static void Main(string[] args) { List lists = new List(); for (int i = 0; i { Console.WriteLine(i); }; l 阅读全文
posted @ 2023-07-19 16:31 NiueryDiary 阅读(844) 评论(0) 推荐(6)
摘要:## 引言 众所周知,使用线程可以极大的提高应用程序的效率和响应性,提高用户体验,但是不可以无节制的使用线程,为什么呢? ## 线程的开销 线程的开销实际上是非常大的,我们从空间开销和时间开销上分别讨论。 ### 线程的空间开销 线程的空间开销来自这四个部分: 1. 线程内核对象(Thread Ke 阅读全文
posted @ 2023-07-18 19:08 NiueryDiary 阅读(1163) 评论(0) 推荐(7)
摘要:## 引言 上文[编码技巧 同步锁对象的选定](url)中,提到了在C#中,让线程同步有两种方式: - 锁(lock、Monitor等) - 信号量(EventWaitHandle、Semaphore、Mutex) 加锁是最常用的线程同步的方法,就不再讨论,本篇主要讨论使用信号量同步线程。 ## W 阅读全文
posted @ 2023-07-18 08:10 NiueryDiary 阅读(1072) 评论(2) 推荐(0)
摘要:## 引言 **yield**关键字是 C# 中的一种语言特性,用于在枚举器中简化迭代器的实现。它使得开发人员可以通过定义自己的迭代器来简化代码,而不必手动实现 IEnumerable 和 IEnumerator 接口。 使用 `yield` 关键字,可以将迭代器中的值一次一个地返回,而不必使用一个 阅读全文
posted @ 2023-07-17 22:42 NiueryDiary 阅读(778) 评论(0) 推荐(1)
摘要:## 引言 在C#中,让线程同步有两种方式: - 锁(lock、Monitor) - 信号量(EventWaitHandle、Semaphore、Mutex) 线程锁的原理,就是锁住一个资源,使得应用程序在此刻只有一个线程访问该资源。通俗地讲,就是让多线程变成单线程。在C#中,可以将被锁定的资源理解 阅读全文
posted @ 2023-07-13 08:02 NiueryDiary 阅读(780) 评论(0) 推荐(1)
摘要:引言 软件开发过程中,我们经常会遇到各种设计问题,例如如何管理对象之间的关系、如何优化代码的可复用性和可维护性等等。为了解决这些问题,我们可以使用设计模式。 设计模式是一种被广泛接受的软件设计思想,它提供了一套通用的解决方案,可以帮助我们更好地解决常见的软件设计问题。设计模式是从实践中总结出来的,它 阅读全文
posted @ 2023-07-12 14:36 NiueryDiary 阅读(338) 评论(0) 推荐(0)
摘要:## 引言 SOLID是五个常见的面向对象设计原则的缩写,其目的是帮助开发者设计易于维护和扩展的软件系统 其中包含**单一职责原则(SRP)**,**开闭原则(OCP)**,**里氏替换原则(LSP)**,**接口隔离原则(ISP)**,**依赖反转原则(DIP)**。 除SOLID之外,后续又增加 阅读全文
posted @ 2023-07-12 08:22 NiueryDiary 阅读(314) 评论(0) 推荐(0)
摘要:## 引言 **备忘录模式**是一种行为型设计模式,它允许你捕获对象的内部状态,并在不暴露其实现细节的情况下将其保存在外部对象中,从而可以在以后的某个时间点将该对象恢复到先前的状态。 备忘录模式有以下几个主要角色: - **Originator(原发器)**:是需要被保存状态的对象。它可以创建一个M 阅读全文
posted @ 2023-07-12 08:22 NiueryDiary 阅读(49) 评论(0) 推荐(0)
摘要:## 引言 **访问者模式**是一种行为型设计模式,它允许你在不修改对象结构的前提下定义作用于这些对象元素的新操作。它主要解决了在不修改已有类的前提下,对已有类中的对象进行新操作的问题。 访问者模式有以下几个主要角色: - 访问者(Visitor):访问者角色是一个抽象类或接口,其中定义了访问每个被 阅读全文
posted @ 2023-07-12 08:22 NiueryDiary 阅读(54) 评论(0) 推荐(0)
摘要:## 引言 **解释器模式**是一种行为型设计模式,它允许你定义一个语言的文法,并且定义一个解释器来解释该语言中的句子。该模式可以用于编写编译器、计算器、查询语言等应用程序。 解释器模式中有以下三个主要角色: - **抽象表达式(Abstract Expression)**:它是所有表达式的抽象基类 阅读全文
posted @ 2023-07-12 08:21 NiueryDiary 阅读(50) 评论(0) 推荐(0)
摘要:## 引言 **中介者模式**是一种行为型设计模式,它用于减少对象之间的直接耦合,从而更好地维护代码的可扩展性和可维护性。 在中介者模式中,一个中介者对象封装了一组对象之间的交互逻辑,这些对象通常都有相互关联,但是彼此之间并不直接交互。中介者对象负责协调对象之间的通信,将对象之间的通信逻辑封装在中介 阅读全文
posted @ 2023-07-12 08:20 NiueryDiary 阅读(47) 评论(0) 推荐(0)
摘要:## 引言 **状态模式**是一种行为型设计模式,它允许对象在其内部状态改变时改变其行为。该模式将对象的行为与其状态分离,并将每种状态封装在不同的类中。这样,对象可以在运行时根据其状态选择不同的行为,而不必在代码中使用大量的条件语句来处理这些状态。 状态模式的优点是它将与特定状态相关的行为局部化并且 阅读全文
posted @ 2023-07-12 08:20 NiueryDiary 阅读(57) 评论(0) 推荐(0)
摘要:## 引言 **模板方法模式**是一种行为设计模式,它定义了一个算法的骨架,将一些步骤延迟到子类中实现,以达到代码复用和减少重复代码的目的。 当我们使用模板方法模式时,我们可以将一些公共的算法步骤放在抽象基类中,这些步骤可以在多个子类中重复使用,从而减少了代码的重复性。同时,我们可以通过子类实现抽象 阅读全文
posted @ 2023-07-12 08:20 NiueryDiary 阅读(69) 评论(0) 推荐(0)
摘要:## 引言 **命令模式**是一种行为型设计模式,它将请求封装成一个对象,从而允许你将不同的请求对客户端参数化,将请求排队或记录请求日志,以及支持可撤销的操作。 在命令模式中,有四个主要角色: - **接收者(Receiver)**:接收者是实际执行操作的对象。它定义了如何执行与请求相关的操作。 - 阅读全文
posted @ 2023-07-12 08:19 NiueryDiary 阅读(33) 评论(0) 推荐(0)
摘要:## 引言 **责任链模式**是一种行为型设计模式,它通过一条由多个处理器组成的链来处理请求,每个处理器都有机会处理请求,如果一个处理器不能处理该请求,它会将请求传递给下一个处理器,直到请求被处理为止。 在实际应用中,责任链模式常用于处理请求的分发、事件处理等场景,它的优点在于可以动态地添加、删除处 阅读全文
posted @ 2023-07-12 08:19 NiueryDiary 阅读(112) 评论(0) 推荐(0)
摘要:## 引言 **策略模式**是一种行为设计模式,它允许在运行时选择算法的行为。该模式定义了一系列算法,将它们封装成独立的类,并使它们可以互相替换。这使得算法可以独立于使用它们的客户端而变化。 在策略模式中,有三个主要的角色: - **环境(Context)**:它是使用策略的对象,它维护一个对策略对 阅读全文
posted @ 2023-07-12 08:18 NiueryDiary 阅读(47) 评论(0) 推荐(0)
摘要:## 引言 **迭代器模式**是一种行为型设计模式,它允许按照特定顺序遍历集合对象的元素,同时不暴露集合的内部结构。这样做可以让客户端代码不依赖于集合对象的具体实现,从而提高代码的灵活性和可重用性。 在迭代器模式中,聚合对象将其遍历的职责委托给迭代器对象,而不是在聚合对象中实现遍历。 迭代器模式的优 阅读全文
posted @ 2023-07-12 08:18 NiueryDiary 阅读(39) 评论(0) 推荐(0)
摘要:## 引言 **享元模式**是一种结构型设计模式,它允许你在消耗少量内存的情况下支持大量对象。如果你需要生成大量细粒度的类实例来表示数据,而这些实例除了几个参数外基本上都是相同的,那么你可以使用享元模式来 避免大量相似类的开销。 在享元模式中,有两种状态:**内部状态**和**外部状态**。内部状态 阅读全文
posted @ 2023-07-12 08:17 NiueryDiary 阅读(39) 评论(0) 推荐(0)
摘要:## 引言 最近做一个配置的功能,需求是该配置项跟另一个整形配置项关联,具有一定的函数关系,例如有一个配置项是值为 `N` ,则另一配置 `F` 项满足函数关系$F=2/(N+1)$。这个函数关系是客户手动输入,只需要简单的四则运算,所以我们要做的就是判断四则运算表达式是否有效,且给定 `N` 的值 阅读全文
posted @ 2023-07-12 08:00 NiueryDiary 阅读(1324) 评论(2) 推荐(7)
摘要:## 引言 **组合模式**是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性,因为它们都具有相同的接口。 组合模式由三个要素组成: 1. **抽象组件(Component)**:它定义了叶子节点和组合节点的公共接口 阅读全文
posted @ 2023-07-11 14:04 NiueryDiary 阅读(247) 评论(0) 推荐(0)
摘要:## 引言 **桥接模式**是一种结构型设计模式,它可以将一个大类或一组相关的类拆分成抽象和实现两个独立的层次结构,从而可以在两个层次结构中分别变化。桥接模式的核心思想是“尽可能将抽象部分和实现部分分离,使它们可以独立地变化”。这样可以使得系统更加灵活,易于扩展和维护。 在桥接模式中,有两个重要的角 阅读全文
posted @ 2023-07-11 13:07 NiueryDiary 阅读(37) 评论(0) 推荐(0)
摘要:## 引言 **外观模式**是一种结构型设计模式,它为客户端提供了一个简单的接口,使得客户端能够更容易地使用复杂的子系统。外观模式通过隐藏子系统的复杂性,简化了客户端的调用过程,同时也降低了客户端与子系统的耦合度。 外观模式的核心思想是将系统的各个组件和子系统封装在一个单独的类中,称为外观类。外观类 阅读全文
posted @ 2023-07-11 12:10 NiueryDiary 阅读(36) 评论(0) 推荐(0)
摘要:## 引言 **代理模式**是一种结构型设计模式,它允许您提供一个代理来控制对某个对象的访问。在某些情况下,直接访问对象可能会带来一些问题,比如安全问题、性能问题等。代理模式就是为了解决这些问题而设计的。 在代理模式中,有三个核心角色:**抽象主题(Subject)**、 **真实主题(Real S 阅读全文
posted @ 2023-07-11 11:31 NiueryDiary 阅读(45) 评论(0) 推荐(0)
摘要:## 引言 **装饰器模式**是一种结构型设计模式,它允许在不改变原始对象的情况下,通过将其包装在一个装饰器对象中,来动态地添加额外的功能。 装饰器模式的核心思想是,将一个对象放在另一个对象的外面,以给原始对象添加新的行为。这个“另一个对象”就是装饰器(Decorator),它持有一个原始对象(Co 阅读全文
posted @ 2023-07-10 22:22 NiueryDiary 阅读(278) 评论(0) 推荐(0)
摘要:## 引言 **适配器模式**是一种结构型设计模式,用于将一个类的接口转换成另一个接口,以便于两个不兼容的类之间能够协同工作。适配器模式可以被认为是一个桥梁,它可以连接两个不同的接口,从而使得它们可以进行协同工作。 适配器模式通常在两个不兼容的类之间进行转换,这些类可能具有不同的接口,不同的数据类型 阅读全文
posted @ 2023-07-10 20:13 NiueryDiary 阅读(70) 评论(0) 推荐(0)
摘要:## 引言 **原型模式**是一种创建型设计模式,它允许我们创建一个对象的副本,而不需要显式地使用构造函数来创建一个新的对象。这种模式通常用于创建那些具有复杂创建过程或需要大量资源的对象。 在原型模式中,我们首先定义一个原型接口,该接口包含一个克隆方法。然后我们创建一个原型对象,该对象实现了原型接口 阅读全文
posted @ 2023-07-10 19:03 NiueryDiary 阅读(93) 评论(0) 推荐(0)
摘要:引言 上一篇文章UI自动化 微软UI Automation中,介绍了UI Automation能够做什么,且借助 Inspect.exe 工具完成了一个模拟点击操作的Demo,文章结尾也提出了自己的一些想法,想要借助UI Automation做一个UI自动化测试平台。想法毕竟是想法,还是得落地实践, 阅读全文
posted @ 2023-07-10 08:03 NiueryDiary 阅读(7317) 评论(0) 推荐(3)
摘要:## 引言 **单例模式**是一种创建型设计模式,它的主要目的是确保某个类在应用程序中只有一个实例,并且这个实例能够被全局访问。在许多情况下,单例模式是非常有用的,比如说当你需要创建一个全局的配置类或者日志类时,单例模式可以让你轻松地实现这些功能。 在实现单例模式时,有两种常见的方法,“懒汉式”和“ 阅读全文
posted @ 2023-07-09 21:07 NiueryDiary 阅读(293) 评论(0) 推荐(0)
摘要:引言 自动化测试平台的意义就三个字 稳定性。 无论是接口自动化测试,还是UI自动化测试,目的就是为了提高产品的稳定性,保证用户体验。 那常见的接口自动化测试比如有 Postman ,SoapUI,JMeter 等等。这一类网上的资料就太多太多了。本篇内容主要想讨论的是UI自动化测试,我搜集了一下常见 阅读全文
posted @ 2023-07-09 19:58 NiueryDiary 阅读(3913) 评论(3) 推荐(6)
摘要:## 引言 **建造者模式**是一种创建型设计模式,它可以将一个复杂对象的构建过程和表示分离,使得相同的构建过程可以创建不同的表示,以及不同的构建过程可以创建相同的表示 在实际的开发中,我们有时需要创建一些复杂的对象,例如包含多个组件和属性的对象,这时候如果直接在代码中创建对象,代码的可读性和可维护 阅读全文
posted @ 2023-07-09 15:22 NiueryDiary 阅读(62) 评论(0) 推荐(0)
摘要:## 引言 **观察者模式**是一种行为型设计模式,它允许对象之间建立一种一对多的关系,使得当一个对象状态改变时,所有依赖它的对象都能够自动得到通知并更新自己的状态。该模式可以帮助我们实现松耦合的系统,以便更好地应对变化和扩展。 在观察者模式中,有两个角色:**观察者**和**被观察者**。被观察者 阅读全文
posted @ 2023-07-09 14:02 NiueryDiary 阅读(132) 评论(0) 推荐(0)
摘要:## 引言 **工厂方法模式**是一种创建型设计模式,它定义了一个用于创建对象的接口,但是让子类决定将哪一个类实例化。换句话说,工厂方法模式让一个类的实例化延迟到其子类。 工厂方法模式有以下几个主要角色: - 抽象工厂(AbstractFactory):声明用于创建抽象产品的操作的接口。 - 工厂实 阅读全文
posted @ 2023-07-09 12:53 NiueryDiary 阅读(342) 评论(0) 推荐(0)
摘要:## 引言 **抽象工厂模式**一种创建型设计模式,它提供了一种方式来封装一组具有相同主题的工厂,而不必指定它们具体的类。这样,客户端代码就可以使用抽象工厂来创建一组相关的对象,而不必关心实际创建的具体类。 抽象工厂模式有以下几个主要角色: - 抽象工厂(AbstractFactory):声明用于创 阅读全文
posted @ 2023-07-09 11:52 NiueryDiary 阅读(157) 评论(0) 推荐(0)
摘要:引言 上一篇中.Net 编译器平台 Roslyn,介绍了Roslyn的各项功能,包括公开API,使用语法,使用语义,使用工作区等功能。 那么回到上一篇中提到的问题,实现类似这样的功能(以下代码为伪代码): string scriptText = "int a = 1;int b = 2; retur 阅读全文
posted @ 2023-07-08 18:50 NiueryDiary 阅读(1378) 评论(2) 推荐(7)
摘要:引言 最近做一个功能想要动态执行C#脚本,就是预先写好代码片段,在程序运行时去执行代码段,比如像这样(以下代码为伪代码): string scriptText = "int a = 1;int b = 2; return a+b ;"; var result = Script.Run(scriptT 阅读全文
posted @ 2023-07-07 22:43 NiueryDiary 阅读(1846) 评论(3) 推荐(7)