自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 聊聊C#中的composite模式

聊聊设计模式中的组合模式以及它在C#中的使用

2022-06-18 22:38:44 215 1

原创 聊聊C#中的Mixin

在C#中使用Mixin编程技法

2022-05-28 15:32:37 346

原创 C++中的Enum与Enum class

大家都知道在C++中有两种声明Enum的方式,分别是enum和enum class。enum在古老的C++98里面就存在,而enum class从C++11开始进入大家视野,那它们之间有什么不同的地方吗,为什么要新加一个enum class?一般来说它们在三个方面有区别,今天就让我们来看看吧。它们声明的枚举变量所影响的范围不同enmu class 又被叫做scoped enum。顾名思义,enum class中声明的枚举值不会造成变量污染,举个例子 enum enumFruit { APPL

2022-05-14 14:54:23 1984

原创 设置默认以管理员权限运行Visual Studio

大家都知道想要用 Visual Studio挂载某个进程进行调试的时候,系统会检查我们是否以管理员权限启动VS,如果不是,会要求我们关闭VS并且以管理员权限重新打开。更有甚者,当我们用VS启动某个进程并需要这个进程去做一些类似文件创建、注册表读写的时候,如果我们打开VS的时候不注意没有用管理员启动,那么进程有可能因为权限不足而失败,这样的后果是,很多程序员会以为是代码有问题,花了许多不必要的时间去调试。为了避免这种困境,最好我们设置默认VS就是用管理员权限运行。 以下是具体方法,亲测Win1

2021-10-20 08:48:00 3422

原创 定制基于不同类型的访问方法——C#中的Visitor模式

文章目录写在前面模式演进史一个简单的例子使用了基本抽象的版本写在前面Visitor模式在日常工作中出场比较少,如果统计大家不熟悉的模式,那么它榜上有名的可能性非常大。使用频率少,再加上很多文章提到Visitor模式都着重于它克服语言单分派的特点上面,而对何时应该使用这个模式,这个模式是怎么一点点演讲出来的提之甚少,造成很多人对这个模式有种雾里看花的感觉,今天跟着老胡,我们一起来一点点揭开它的面纱吧。 模式演进史一个简单的例子现在假设我们有一个简单的需求,需要统计出一篇文档中的字数、词数

2021-10-14 21:25:35 137

原创 C++中的间接宏函数

宏函数对于每个C++程序员都决不陌生,就算是初出茅庐的C++程序员也知道如何定义、使用宏函数。 但是当初学者看到类似于以下这种宏函数嵌套的时候,可能还是会比较嘀咕,#define CONVERTSTR(x) #x#define CONVERTSTR2(x) CONVERTSTR(x)第二个宏函数所做的事情不就是再一次调用上面的宏函数吗,这难道不属于画蛇添足吗?这样做有什么意义呢?别急,我们慢慢来捋一下。 了解#和##要想熟练的写出宏函数,了解其中的操作符必不可少,在预编

2021-04-01 22:57:47 149

原创 一个C++引用库的头文件预编译陷阱

写在前面老胡最近在工作中,有个场景需要使用一个第三方库,引用头文件,链接库,编译运行,一切都很正常,但是接下来就遇到了一个很诡异的问题,调用该库的中的一个对象方法为对象修改属性的时候,会影响到对象的另外一个属性,当时百思不得其解,直呼灵异事件。但后面静下心来细细看了一下代码和各种配置,发现了问题所在,现在把这个问题分享在这里,希望大家在以后的工作中如果遇到了类似的情况知道应该如何处理。 场景还原库当时引用的是一个第三方的静态链接库,场景非常简单,在项目中包含头文件,链接器指定路径和静态

2021-03-24 22:59:48 243

原创 谈谈C++中的数据对齐

struct A{ char c1;};struct B{ int i1;};struct C{ char c1; int i1;};已有struct大小猜测,引出疑问讲解为何会有这种情况,蒸屉一样,解释上面的大小问题为什么需要关注对齐,底层开发我们才会关注对齐,为什么呢,因为对齐可以节约空间演示如何节约空间...

2021-03-14 15:54:19 1618

原创 在C++中实现aligned_malloc

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2021-03-08 20:35:11 2418

原创 C++中的extern

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2021-02-09 16:49:23 38704 2

原创 C#中子类对基类方法的继承、重写和隐藏

提起new,大家都不陌生。最常见的用法就是创建类(class)或者结构(struct)的实例时使用,

2020-07-24 23:28:07 640 1

原创 权力越大职责越大——C#中的职责链模式

大家好,欢迎来到老胡的博客,今天我们继续了解设计模式中的职责链模式。跟往常一样,我们还是从一个真实世界的例子入手,这样大家也对这个模式的应用场景有更深刻的理解。一个真实的栗子class Program{ static void Main(string[] args) { VacationApproveSystem system = new VacationApproveSystem(); system.HandleVacationRequest(new

2020-07-08 22:35:21 176 3

原创 让对象拥有状态——C#中的状态模式

大家好,老胡又在博客和大家见面了,在聊今天的主角之前,老胡先给大家讲一个以前发生的故事。真实的故事当老胡还是小胡的时候,跟随团队一起开发一款游戏。这款游戏是一款末日生存类游戏,玩家可以收集资源,两种,一种金子,一种铁。自身升级击杀敌人用资源合成装备项目开发的很顺利,我那时得到一个任务,是为游戏做一个新手教程,在这个教程里面,通过一系列步骤,引导玩家...

2020-07-01 20:40:16 992 2

原创 如果人生也能存档——C#中的备忘录模式

大家好,老胡又和大家见面了。首先承认今天的博客有点标题党了,人生是没有存档,也没有后悔药的。有存档和后悔药的,那是游戏,不知道这是不是游戏让人格外放松的原因之一。今天恰逢端午放假,就让我们来试着做一个小游戏吧,顺带看看备忘录模式是如何在这种情况下面工作的。游戏背景这是一个简单的打怪游戏,有玩家,有怪兽,玩家作为主角光环,有如下三个特殊能力攻击怪兽有暴击几率有几率回避怪兽攻击可以自己治疗一定生命值游戏实现角色类角色基类首先是角色类,角色类提供玩家和怪兽最基本的抽象,比如血量、攻击力、攻

2020-06-25 10:09:32 1662 4

原创 生活中的设计模式——Adapter

设计模式虽然是编程领域的术语,但是在生活中也不乏类似的例子,应该说,精巧的设计都是相似的吧,今天我们就来谈一个在生活中很常见,很容易被使用的设计模式。

2020-06-20 22:19:25 313

原创 从一个计算器开始说起——C#中的工厂方法模式

C#中的属性提供程序集反射的功能,反射功能完美实现了程序集、类、方法的自我描述,利用属性,我们可以搞出一些很实用的设计。话不多说,我们看一个例子。

2020-06-13 23:13:12 389

原创 C#中的闭包和意想不到的坑

虽然闭包主要是函数式编程的玩意儿,而C#的最主要特征是面向对象,但是利用委托或lambda表达式,C#也可以写出具有函数式编程风味的代码。同样的,使用委托或者lambda表达式,也可以在C#中使用闭包。根据WIKI的定义,闭包又称语法闭包或函数闭包,是在函数式编程语言中实现语法绑定的一种技术。闭包在实现上是一个结构体,它存储了一个函数(通常是其入口地址)和一个关联的环境(相当于一个符号查找表)。闭包也可以延迟变量的生存周期。嗯。。看定义好像有点迷糊,让我们看看下面的例子吧 class Pro

2020-06-07 21:55:16 832

原创 接口和抽象类的区别,你真的了解吗

老胡最近浏览博客,发现很多公司的面试题库上面,都有一道比较经典的题目,描述C#中接口和抽象类的区别。不由的想起,几年前我去面试的时候,也是被这么问过。似乎这是一道简单的不能再简单,寻常的不能再寻常的题目。可是,你真的了解这两者的区别吗?今天就让我们来聊聊这个话题吧。 首先提纲挈领地总述一下,要想回答好这个问题,能够在一个比较有水平的面试官手上拿到不错的分数,起码我们应该从语法,语意和用途这三个层次来思考它们。 语法层面抽象类是类,C#不允许多继承,所以一个类只能有至多一个

2020-06-05 23:04:11 258

原创 C#终结器妙用

熟悉C#的程序员都知道,在C#类中,有一种函数类似于C++类析构函数,它们的表达方式也一样,都是 ~。没错,它就是C#中的终结器。乍看之下,C#终结器和C++析构函数好像一样,相同的表达方式,同样一个类只能有一个,同样是在类对象被销毁的时候由系统调用。但是由于C#垃圾回收机制的存在,C#终结器并不能所分配的类对象超出其生命周期的时候及时被调用,它只会被垃圾回收器标记,并在垃圾回收器运行的时候调...

2020-04-04 15:05:24 1000

原创 使用Roslyn动态编译代码

什么是Roslyn从C# 6 开始,编译器被完全用C#重写并且模块化,这个模块化的编译器就是Roslyn。利用Roslyn,我们可以方便地在我们的程序中动态编译代码,即,把代码当做数据传递给Roslyn编译器,得到编译后的程序集。 安装并引用Roslyn在开始使用之前,先在使用Nuget安装Microsoft.CodeAnalysis.CSharp之后在命名空间声明中,添加u...

2019-11-30 14:25:40 3005

原创 通讯基本靠吼——EventAggregator

俗话里,笑话一个地方穷,就经常说“通讯基本靠吼,交通基本靠走”。无独有偶,今天我们也要介绍一个类似于通讯基本靠吼的事件处理方式——EventAggragator。 传统事件处理方式现在回想一下,我们之前怎么完成事件处理?简单的三步。定义主体(被收听者)的暴露的事件类型。在订阅者中定义事件处理程序并关联到主体。主体触发事件。非常简单的结构,如下所示。订阅者依赖于主体。...

2019-11-22 23:09:27 2346

原创 从汉堡加料说起——浅谈C#中的Decorator模式

相信大家都在都在汉堡店吃过汉堡,有些汉堡店很有特色,推出了汉堡订制服务,即,可以在汉堡中加料,加肉饼,加生菜之类(有点类似我们本地的肥肠粉里面加冒结子)。更是让不少吃货大快朵颐,大呼过瘾,加6,7层肉饼的感觉简直不要太好。 那么大饱口福之后,让我们来思考一个问题,汉堡是要钱的,加的料,比如肉饼,生菜,也都是收费的,如果让我们来设计出一套类,计算客户买汉堡的消费,我们应该怎么做比较合适...

2019-11-16 17:06:49 289

原创 C#中仅运行一个程序实例的方法

在日常工作中,大家经常会遇到想要让程序同时只能有一个实例在内存中运行的情况。比如某些比较耗费资源的工具,或者占用了某些特定端口的程序,启动多个实例没有意义。那么我们是怎么实现这种限制的呢?在C#中,一般我们有两种办法,都非常简单。使用Mutex在C#中有两种Mutex,一种是Local的,仅在创建的进程中可见,主要作用就是实现进程内线程之间的同步。还有一种是有名字的,也叫Global M...

2019-11-02 23:34:39 948

原创 在C#中使用硬链接

在日常工作中,我们经常会有拷贝文件的需求。相应的,我们也经常会有在编程语言里面调用拷贝文件的时候,比如C#中的System.IO.File.Copy。然而,拷贝一个大文件常常需要比较多时间和额外的硬盘空间,有时候,在某些情况下(哪些情况我们之后会谈到)我们可以考虑使用建立文件硬链接的方式。硬链接,英文名HardLink。区别于软链接SoftLink,硬链接的一些使用规则如下:硬链接只能对文件...

2019-10-13 21:31:39 810

原创 轻松实现记录与撤销——C#中的Command模式

Command模式属于行为模式,作为大名鼎鼎的23个设计模式之一,Command模式理解起来不如工厂模式,单例模式等那么简单直白。究其原因,行为模式着重于使用,如果没有编程实践,确实不如创造模式那么直白。我们先看看UML类图。估计很多同学看着图就晕了,那么多东西,Command和Concrete Command还好理解,那些Receiver和Invoker又是什么东西呢? 别着急...

2019-04-20 16:03:53 1763

原创 C++中指针与Const

众所周知,C++中指针是C++强大力量的来源之一,也是比较容易让初学者迷惑的地方,如果再加上const修饰符,可能大家就更感觉头晕了,const放在*的前面和放在后面的区别是什么,在函数参数传值的时候,哪种const需要我们注意?在函数重载的时候,哪种const又会被认为是不同的函数参数?让我们简单来看看吧。Const在指针的不同位置首先让我们来看看Const在不同的位置下面对指针的影响。i...

2019-04-14 13:34:52 333

原创 提供调试便利——C#中的Debugger类

Debugger类存在于命名空间System.Diagnostics中,它提供了一些静态方法以帮助用户调试代码。这是一个经常被忽视的类,但是在某些情况下,它会很有用。 Debugger.Break这个方法和在Visual Studio中加入红色的断点是一模一样的,但是好处在于,有些程序员不喜欢满屏幕的红色断点,这个时候用这个方法来替代吧。 Debugger.Log像...

2019-04-05 21:36:55 3400

原创 使用应用程序清单提升权限

众所周知,C#中最小的部署单元和可执行,可测试单元是程序集(Assembly),程序集一般分为类库(dll)和可执行文件(exe)。这些都是很浅显的,但是除此之外,我们经常会发现有一个后缀名为manifest的xml文件,这又是什么呢?它就是我们今天要提到的,应用程序清单文件。 程序集的组成程序集可以由四部分组成。程序集清单(Assembly Manifest):每个程序集必...

2019-03-23 23:12:47 341

原创 C#中的异常机制

C#中的异常机制主要依赖于几个关键字,try,catch,finally和throw。合理实现异常机制有利于程序健壮性,不至于在一个异常抛出就造成程序崩溃。 最简单的情况C#使用try来包括可能会抛出异常的代码块,之后可以接catch,可以接finally,也可以接catch和finally,但是不能一个都没有。catch代码块能够处理抛出来的异常,而finally主要是为了执行一...

2019-03-16 17:49:42 683

原创 C#中的协变和逆变

C#从2.0开始推出了泛型,极大的简化了相同算法对应不同数据类型的工作。在此基础上,C#4.0更进一步推出了泛型中的协变和逆变,有不少人对这个概念感觉比较模糊,今天就让我们来简单的捋一捋。最常见的情况考虑下面代码object[] objs = new string[]{};List<object> objList = new List<string>();这段代...

2019-03-10 16:28:49 2543

原创 C#中的is, as 和 cast

C#作为静态强类型语言,要想使用好它,掌握好几种类型判断的方法是很基础也很必要的。如我们所知,最常用的几种就是,is,as,铸型cast和自定义类型转换。但是这几种之间有什么区别是一个容易混淆的地方,现在让我们来看看。isis如下场合返回true:实例属于该类型 class Person { } Person p = new Person(); bool resu...

2019-03-02 11:06:59 4769

原创 C#中的Builder模式

C#中的Builder模式设计模式中的Builder模式,又叫建造者模式,是一种常用的模式,它主要的作用是分离一个复杂对象的构建过程和复杂对象的表现形式,抽象出构建过程,这样可以使用相同的构建过程,配合依赖注入构建出不用的产品。 UML其中有两点需要注意。Director和Builder之间是聚合关系而不是合成关系,暗示Director不需要对Builder的生命周期负责,...

2019-02-23 15:49:53 2627 1

原创 C#中的TemplateMethod模式

C#中的TemplateMethod模式一个真实的故事一个真实的故事大学的时候就开过一门课程,讲设计模式,可是大学生没什么编程实践经验,在大学里面听设计模式的感觉,就像听天书。听着都有道理,可是完全领会不到其中的奥妙,大抵原因就在于没有走过弯路,没有吃过设计不当的亏。古人云,“操千曲而后晓声,观千剑而后识器”,诚不欺我。 博主在之前的某个项目中,设计出了一些工具类,像属性窗口,错...

2019-02-16 13:42:46 681

原创 C#中的浅拷贝和深拷贝

C#中的浅拷贝和深拷贝前言啥叫拷贝?浅拷贝深拷贝通过序列化实现深拷贝使用Json实现的深拷贝总结前言在之前的文章中,我们提及了C#中的值类型和引用类型,同时也简单提到了C#中的拷贝,今天让我们来深入看看这个话题。 啥叫拷贝?拷贝又名复制,在计算机里面,拷贝的意思就是按照字节一一复制出一个全新的、和现有对象一模一样的对象,在C#中,拷贝又有浅拷贝和深拷贝的区别。 浅...

2019-02-12 08:20:05 1277 5

原创 c#中的值类型和引用类型

c#中的值类型和引用类型前言典型类型典型值类型典型引用类型基类值类型基类引用类型基类在内存中的表现值类型前言值类型和引用类型,是c#比较基础,但是也必须掌握的知识点,但是也不是那么轻易就能掌握,今天让我们一起来看看。 典型类型首先我们看看这两种不同的类型有哪些比较典型的代表。 典型值类型int, long, float, double等原始类型中表示数字的类型都...

2019-02-03 15:43:04 2364

原创 C#中的Singleton模式

c#中的Singleton模式写在前面实现思路实现方法最简单的实现方法如果多线程乱入?线程安全的单例模式第一次尝试功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表...

2019-02-01 09:09:45 1754

原创 正则表达式学习笔记(四)正则表达式引擎漫谈:NFA与DFA

截至上篇为止,我们学习了正则表达式的基本用法,包括捕获,引用,环视和量词匹配等。可以说,对于正则表达式的学习,我们已经到了一个不错的地步,但是就如博主博客上面所写的那样,“君子务本,本立而道生”,学习任何一个东西,都要想办法弄清楚最核心的部分,这样才能真正的学会,进而在使用中才能得心应手。那么对正则表达式来说,它最核心的东西是什么呢?答案是引擎。正则表达式因为其漫长的历史而衍生出了不同的流派,...

2019-01-28 22:41:03 917

原创 正则表达式学习笔记(三)模式修饰符与其他量词

今天我们接着学习一些正则表达式高级的话题。模式修饰符当我们做字符串查找的时候,有很多情况我们都需要忽略字符串大小写,但是不是所有的编辑器都像grep一样提供简单的 -i 选项,比如,当我们在使用Notepad++的时候,又或者当我们在.Net,Java里面使用的时候,我们需要忽略大小写匹配正则表达式,有没有什么办法呢?答案是肯定的,这个时候我们就需要用到模式修饰符。常用的模式修饰符有如...

2019-01-25 08:16:29 439

原创 正则表达式学习笔记(二)捕获与环视

我们接着上面的笔记学习。我们今天的内容是捕获,后向引用和环视功能(正向,反向)。在开始之前,有一些对于上一章博客的补充说明。上一章博客我们讲了元字符以及它的作用(用于匹配),但是有一些初学者容易懵逼的点之前没有说明,现在补充在这里。1. 有些元字符代表在不同的语境下面代表不同的意思。典型的有^和-,众所周知,^是锚点,匹配一个行的开头,但是如果在标记括号中,它代表的是反选,[^a]表示...

2019-01-18 17:25:19 252

原创 正则表达式学习笔记(一)初识正则表达式

作为程序员,相信大家经常会遇到很多关于文本查找替换的问题,考虑下面3个例子。1. 去掉下面文本中的空行。    2. 下面是一系列需要从数据库删除的表,它们之间用 ',' 隔开,需要输出相应删除表的语句,比如delete from Customer, delete from Order, delete from Type等。3. 寻找一段文本中的电话号码,即十一位连续数字。...

2019-01-14 22:36:49 745

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除