C#
文章平均质量分 92
老胡写代码
这个作者很懒,什么都没留下…
展开
-
聊聊C#中的composite模式
聊聊设计模式中的组合模式以及它在C#中的使用原创 2022-06-18 22:38:44 · 249 阅读 · 1 评论 -
聊聊C#中的Mixin
在C#中使用Mixin编程技法原创 2022-05-28 15:32:37 · 405 阅读 · 0 评论 -
定制基于不同类型的访问方法——C#中的Visitor模式
文章目录写在前面模式演进史一个简单的例子使用了基本抽象的版本写在前面Visitor模式在日常工作中出场比较少,如果统计大家不熟悉的模式,那么它榜上有名的可能性非常大。使用频率少,再加上很多文章提到Visitor模式都着重于它克服语言单分派的特点上面,而对何时应该使用这个模式,这个模式是怎么一点点演讲出来的提之甚少,造成很多人对这个模式有种雾里看花的感觉,今天跟着老胡,我们一起来一点点揭开它的面纱吧。 模式演进史一个简单的例子现在假设我们有一个简单的需求,需要统计出一篇文档中的字数、词数原创 2021-10-14 21:25:35 · 159 阅读 · 0 评论 -
C#中子类对基类方法的继承、重写和隐藏
提起new,大家都不陌生。最常见的用法就是创建类(class)或者结构(struct)的实例时使用,原创 2020-07-24 23:28:07 · 674 阅读 · 1 评论 -
权力越大职责越大——C#中的职责链模式
大家好,欢迎来到老胡的博客,今天我们继续了解设计模式中的职责链模式。跟往常一样,我们还是从一个真实世界的例子入手,这样大家也对这个模式的应用场景有更深刻的理解。一个真实的栗子class Program{ static void Main(string[] args) { VacationApproveSystem system = new VacationApproveSystem(); system.HandleVacationRequest(new原创 2020-07-08 22:35:21 · 197 阅读 · 3 评论 -
让对象拥有状态——C#中的状态模式
大家好,老胡又在博客和大家见面了,在聊今天的主角之前,老胡先给大家讲一个以前发生的故事。真实的故事当老胡还是小胡的时候,跟随团队一起开发一款游戏。这款游戏是一款末日生存类游戏,玩家可以收集资源,两种,一种金子,一种铁。自身升级击杀敌人用资源合成装备项目开发的很顺利,我那时得到一个任务,是为游戏做一个新手教程,在这个教程里面,通过一系列步骤,引导玩家...原创 2020-07-01 20:40:16 · 1030 阅读 · 2 评论 -
如果人生也能存档——C#中的备忘录模式
大家好,老胡又和大家见面了。首先承认今天的博客有点标题党了,人生是没有存档,也没有后悔药的。有存档和后悔药的,那是游戏,不知道这是不是游戏让人格外放松的原因之一。今天恰逢端午放假,就让我们来试着做一个小游戏吧,顺带看看备忘录模式是如何在这种情况下面工作的。游戏背景这是一个简单的打怪游戏,有玩家,有怪兽,玩家作为主角光环,有如下三个特殊能力攻击怪兽有暴击几率有几率回避怪兽攻击可以自己治疗一定生命值游戏实现角色类角色基类首先是角色类,角色类提供玩家和怪兽最基本的抽象,比如血量、攻击力、攻原创 2020-06-25 10:09:32 · 1695 阅读 · 4 评论 -
生活中的设计模式——Adapter
设计模式虽然是编程领域的术语,但是在生活中也不乏类似的例子,应该说,精巧的设计都是相似的吧,今天我们就来谈一个在生活中很常见,很容易被使用的设计模式。原创 2020-06-20 22:19:25 · 329 阅读 · 0 评论 -
接口和抽象类的区别,你真的了解吗
老胡最近浏览博客,发现很多公司的面试题库上面,都有一道比较经典的题目,描述C#中接口和抽象类的区别。不由的想起,几年前我去面试的时候,也是被这么问过。似乎这是一道简单的不能再简单,寻常的不能再寻常的题目。可是,你真的了解这两者的区别吗?今天就让我们来聊聊这个话题吧。 首先提纲挈领地总述一下,要想回答好这个问题,能够在一个比较有水平的面试官手上拿到不错的分数,起码我们应该从语法,语意和用途这三个层次来思考它们。 语法层面抽象类是类,C#不允许多继承,所以一个类只能有至多一个原创 2020-06-05 23:04:11 · 278 阅读 · 0 评论 -
C#终结器妙用
熟悉C#的程序员都知道,在C#类中,有一种函数类似于C++类析构函数,它们的表达方式也一样,都是 ~。没错,它就是C#中的终结器。乍看之下,C#终结器和C++析构函数好像一样,相同的表达方式,同样一个类只能有一个,同样是在类对象被销毁的时候由系统调用。但是由于C#垃圾回收机制的存在,C#终结器并不能所分配的类对象超出其生命周期的时候及时被调用,它只会被垃圾回收器标记,并在垃圾回收器运行的时候调...原创 2020-04-04 15:05:24 · 1045 阅读 · 0 评论 -
使用Roslyn动态编译代码
什么是Roslyn从C# 6 开始,编译器被完全用C#重写并且模块化,这个模块化的编译器就是Roslyn。利用Roslyn,我们可以方便地在我们的程序中动态编译代码,即,把代码当做数据传递给Roslyn编译器,得到编译后的程序集。 安装并引用Roslyn在开始使用之前,先在使用Nuget安装Microsoft.CodeAnalysis.CSharp之后在命名空间声明中,添加u...原创 2019-11-30 14:25:40 · 3198 阅读 · 0 评论 -
通讯基本靠吼——EventAggregator
俗话里,笑话一个地方穷,就经常说“通讯基本靠吼,交通基本靠走”。无独有偶,今天我们也要介绍一个类似于通讯基本靠吼的事件处理方式——EventAggragator。 传统事件处理方式现在回想一下,我们之前怎么完成事件处理?简单的三步。定义主体(被收听者)的暴露的事件类型。在订阅者中定义事件处理程序并关联到主体。主体触发事件。非常简单的结构,如下所示。订阅者依赖于主体。...原创 2019-11-22 23:09:27 · 2494 阅读 · 0 评论 -
从汉堡加料说起——浅谈C#中的Decorator模式
相信大家都在都在汉堡店吃过汉堡,有些汉堡店很有特色,推出了汉堡订制服务,即,可以在汉堡中加料,加肉饼,加生菜之类(有点类似我们本地的肥肠粉里面加冒结子)。更是让不少吃货大快朵颐,大呼过瘾,加6,7层肉饼的感觉简直不要太好。 那么大饱口福之后,让我们来思考一个问题,汉堡是要钱的,加的料,比如肉饼,生菜,也都是收费的,如果让我们来设计出一套类,计算客户买汉堡的消费,我们应该怎么做比较合适...原创 2019-11-16 17:06:49 · 328 阅读 · 0 评论 -
C#中仅运行一个程序实例的方法
在日常工作中,大家经常会遇到想要让程序同时只能有一个实例在内存中运行的情况。比如某些比较耗费资源的工具,或者占用了某些特定端口的程序,启动多个实例没有意义。那么我们是怎么实现这种限制的呢?在C#中,一般我们有两种办法,都非常简单。使用Mutex在C#中有两种Mutex,一种是Local的,仅在创建的进程中可见,主要作用就是实现进程内线程之间的同步。还有一种是有名字的,也叫Global M...原创 2019-11-02 23:34:39 · 1041 阅读 · 0 评论 -
在C#中使用硬链接
在日常工作中,我们经常会有拷贝文件的需求。相应的,我们也经常会有在编程语言里面调用拷贝文件的时候,比如C#中的System.IO.File.Copy。然而,拷贝一个大文件常常需要比较多时间和额外的硬盘空间,有时候,在某些情况下(哪些情况我们之后会谈到)我们可以考虑使用建立文件硬链接的方式。硬链接,英文名HardLink。区别于软链接SoftLink,硬链接的一些使用规则如下:硬链接只能对文件...原创 2019-10-13 21:31:39 · 869 阅读 · 0 评论 -
c#中的值类型和引用类型
c#中的值类型和引用类型前言典型类型典型值类型典型引用类型基类值类型基类引用类型基类在内存中的表现值类型前言值类型和引用类型,是c#比较基础,但是也必须掌握的知识点,但是也不是那么轻易就能掌握,今天让我们一起来看看。 典型类型首先我们看看这两种不同的类型有哪些比较典型的代表。 典型值类型int, long, float, double等原始类型中表示数字的类型都...原创 2019-02-03 15:43:04 · 2421 阅读 · 0 评论 -
C#中的TemplateMethod模式
C#中的TemplateMethod模式一个真实的故事一个真实的故事大学的时候就开过一门课程,讲设计模式,可是大学生没什么编程实践经验,在大学里面听设计模式的感觉,就像听天书。听着都有道理,可是完全领会不到其中的奥妙,大抵原因就在于没有走过弯路,没有吃过设计不当的亏。古人云,“操千曲而后晓声,观千剑而后识器”,诚不欺我。 博主在之前的某个项目中,设计出了一些工具类,像属性窗口,错...原创 2019-02-16 13:42:46 · 695 阅读 · 0 评论 -
C#中的浅拷贝和深拷贝
C#中的浅拷贝和深拷贝前言啥叫拷贝?浅拷贝深拷贝通过序列化实现深拷贝使用Json实现的深拷贝总结前言在之前的文章中,我们提及了C#中的值类型和引用类型,同时也简单提到了C#中的拷贝,今天让我们来深入看看这个话题。 啥叫拷贝?拷贝又名复制,在计算机里面,拷贝的意思就是按照字节一一复制出一个全新的、和现有对象一模一样的对象,在C#中,拷贝又有浅拷贝和深拷贝的区别。 浅...原创 2019-02-12 08:20:05 · 1354 阅读 · 5 评论 -
C#中的Builder模式
C#中的Builder模式设计模式中的Builder模式,又叫建造者模式,是一种常用的模式,它主要的作用是分离一个复杂对象的构建过程和复杂对象的表现形式,抽象出构建过程,这样可以使用相同的构建过程,配合依赖注入构建出不用的产品。 UML其中有两点需要注意。Director和Builder之间是聚合关系而不是合成关系,暗示Director不需要对Builder的生命周期负责,...原创 2019-02-23 15:49:53 · 2723 阅读 · 1 评论 -
C#中的is, as 和 cast
C#作为静态强类型语言,要想使用好它,掌握好几种类型判断的方法是很基础也很必要的。如我们所知,最常用的几种就是,is,as,铸型cast和自定义类型转换。但是这几种之间有什么区别是一个容易混淆的地方,现在让我们来看看。isis如下场合返回true:实例属于该类型 class Person { } Person p = new Person(); bool resu...原创 2019-03-02 11:06:59 · 5037 阅读 · 0 评论 -
C#中的协变和逆变
C#从2.0开始推出了泛型,极大的简化了相同算法对应不同数据类型的工作。在此基础上,C#4.0更进一步推出了泛型中的协变和逆变,有不少人对这个概念感觉比较模糊,今天就让我们来简单的捋一捋。最常见的情况考虑下面代码object[] objs = new string[]{};List<object> objList = new List<string>();这段代...原创 2019-03-10 16:28:49 · 2589 阅读 · 0 评论 -
C#中的异常机制
C#中的异常机制主要依赖于几个关键字,try,catch,finally和throw。合理实现异常机制有利于程序健壮性,不至于在一个异常抛出就造成程序崩溃。 最简单的情况C#使用try来包括可能会抛出异常的代码块,之后可以接catch,可以接finally,也可以接catch和finally,但是不能一个都没有。catch代码块能够处理抛出来的异常,而finally主要是为了执行一...原创 2019-03-16 17:49:42 · 710 阅读 · 0 评论 -
使用应用程序清单提升权限
众所周知,C#中最小的部署单元和可执行,可测试单元是程序集(Assembly),程序集一般分为类库(dll)和可执行文件(exe)。这些都是很浅显的,但是除此之外,我们经常会发现有一个后缀名为manifest的xml文件,这又是什么呢?它就是我们今天要提到的,应用程序清单文件。 程序集的组成程序集可以由四部分组成。程序集清单(Assembly Manifest):每个程序集必...原创 2019-03-23 23:12:47 · 365 阅读 · 0 评论 -
提供调试便利——C#中的Debugger类
Debugger类存在于命名空间System.Diagnostics中,它提供了一些静态方法以帮助用户调试代码。这是一个经常被忽视的类,但是在某些情况下,它会很有用。 Debugger.Break这个方法和在Visual Studio中加入红色的断点是一模一样的,但是好处在于,有些程序员不喜欢满屏幕的红色断点,这个时候用这个方法来替代吧。 Debugger.Log像...原创 2019-04-05 21:36:55 · 3625 阅读 · 0 评论 -
轻松实现记录与撤销——C#中的Command模式
Command模式属于行为模式,作为大名鼎鼎的23个设计模式之一,Command模式理解起来不如工厂模式,单例模式等那么简单直白。究其原因,行为模式着重于使用,如果没有编程实践,确实不如创造模式那么直白。我们先看看UML类图。估计很多同学看着图就晕了,那么多东西,Command和Concrete Command还好理解,那些Receiver和Invoker又是什么东西呢? 别着急...原创 2019-04-20 16:03:53 · 1833 阅读 · 0 评论 -
C#中的Singleton模式
c#中的Singleton模式写在前面实现思路实现方法最简单的实现方法如果多线程乱入?线程安全的单例模式第一次尝试功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表...原创 2019-02-01 09:09:45 · 1803 阅读 · 0 评论