C#
文章平均质量分 83
q__y__L
学习方向是大数据,模式识别。。。微
展开
-
C#中值类型与引用类型的存储
请记住一个引用类型,其实例数据部分始终存放在堆里,既然两个成员都是对象数据的一部分,那么他们都会被存放在堆里,无论他们诗值类型还是引用类型。记住上面的两张图,搞不清楚时,自己划一下,以后分析值对象和引用对象在内存的位置就心里有数了。首先,构造student对象用了new,所以student的实例数据存储在堆上,其引用部分放在堆里。C#中类型分为两种:值类型和引用类型,这两种类型的对象在内存中的存储方式不同。如果存储了一个对象,该对象有多个成员,成员既有值对象又有引用对象时,存储情况如何呢?原创 2024-04-02 20:53:36 · 651 阅读 · 0 评论 -
C# 通过回调获取多线程中的结果
答案是传递一个回调函数。看具体的例子,假设我有一个求自然数的累加和函数,我想让一个线程单独运行,且返回结果。在C#中多线程运行一旦开启,是没办直接返回你要的结果的,但有时候我们确实需要线程给我们结果要怎么做呢?这个类不仅接受参数Number,还接受一个回调函数:Action.在计算完成前将结果传递给回调函数。这里只是简单地打印,事实上还可以将取值拿出来,做法类似于上一节提到的。原创 2023-10-13 12:10:52 · 516 阅读 · 0 评论 -
C# 往多线程传递安全参数的方法
这样,在执行时,我们向多线程传递的是类PassParameter。sToThread的成员函数,且没有任何参数。这样就实现了安全的将参数传递到线程中。为此要如何避免这种问题呢?原创 2023-10-13 11:41:30 · 359 阅读 · 0 评论 -
C# 泛型集合中的排序
就算不熟悉Linq,熟悉SQL查询语句的,也能很快上手Linq。List类的Sort方法有4个重载,其中一个是Sort(IComparer comparer),也就是你可以直接传入一个实现ICompare的对象,Sort方法会调用次对象的固定方法,这里我们将这个特殊的对象叫做。从前面的讨论可以看出最简单的排序方法是利用Linq或者Lambda,另外两种会增加额外的代码量,但是我们应该了解其背后的原理,Linq和Lambda都是C#后面陆续推出的,自然会更能节省开发者时间。原创 2023-02-13 17:51:25 · 1249 阅读 · 1 评论 -
再说多线程(六)——Thread生命周期
前面一直在用Thread介绍多线程任务,本节对线程类Thread的生命周期进行简单的梳理。原创 2023-02-10 15:57:14 · 710 阅读 · 0 评论 -
再说多线程(五)——死锁
在前面四节中,我们一直没有讨论多线程程序的一个负面问题——死锁,有了一定的基础,现在是时候研究一下死锁了。死锁一定是出现在多线程程序中,单线程是不可能造成死锁的,因为你不可能同时加两把锁。死锁有个简单的例子,假设你和你的邻居关系很好,你们相互放了一把备用钥匙在对方家里,一般来说,只要有一个人带了钥匙,那两个人一定可以各回各家,但是恰好有一天,两人出门都忘记带钥匙,回家时发现对方在门口等着,两个人只能干瞪眼。这就是死锁。原创 2023-01-13 16:40:00 · 644 阅读 · 0 评论 -
再说多线程(四)——Semaphore类
C#中的信号量类用于限制可以同时访问共享资源的外部线程的数量。换句话说,我们可以说Semaphore允许一个或多个外部线程进入临界区并在线程安全的情况下并发执行任务。因此,在实时情况下,当我们的资源数量有限并且我们想限制可以使用它的线程数量时,我们需要使用信号量。翻译 2023-01-13 11:15:20 · 758 阅读 · 0 评论 -
再说多线程(三)——Mutex类
在前面2节,我们已经讨论了Lock语句和Monitor类,Locks 和 Monitors 确保 InProcess 线程的线程安全,即由应用程序本身生成的线程,即内部线程。但是,如果线程来自 OutProcess,即来自外部应用程序,那么 Locks 和 Monitors 将无法控制它们。而 Mutex 确保进程外线程的线程安全,即由外部应用程序生成的线程,即外部线程。可能前面一段是说的不是很明白,什么是内部进程和外部进程呢?让我们首先创建一个控制台应用程序,然后将以下代码复制并粘贴到其中。翻译 2023-01-13 09:29:15 · 1111 阅读 · 2 评论 -
再说多线程(一)
世界是并行!做过复杂项目的朋友一定遇到过并发的问题,无论是大项目如订票系统,还是小项目中的文件管理都会有并行需求。所以不同于上学时接触的大部分代码,实际的业务往往是为多人提供服务,必然天然的带有并发的需求。这里我先不解释并行和并发的区别,也不去讨论cpu和操作系统的低层是如何做到并发的,让我们从最简单的串行说起。一个简单的打印函数,只不过,在两句话之间,添加了一个小停顿。原创 2023-01-11 16:30:38 · 354 阅读 · 0 评论 -
关于枚举类(Enumeration Class )
在微软的微服务架构案例eshopOnContainer中,对于订单的状态是这样的: 微软没有直接使用传统的Enum关键字,而是自定了以一个抽象类:Enumeration。最开始,我有些不解,为什么么要“舍近求远”?其实微软官方在此文中提到了枚举类,理由是启动面向对象语言的所有丰富功能。解释的很晦涩,虽然给出了代码案例,但是还是让人很难体会到其中奥妙。直到最近又看了这个博客,似乎才深入理解了一些。结合一个例子说明,可能更好! 假设你要去买咖啡,正常情况下会有“大、中、小”三种原创 2022-12-06 01:45:39 · 971 阅读 · 0 评论 -
关于架构的一些理念
软件的需求是不断变更的,软件的升级也是必然的,因此我们应该再进行架构设计的时候,避免后续软件需求变更,导致软件退化,并且在软件的升级过程中,我们要适时的进行架构的升级,以保持高质量的软件设计。如果我们每次软件升级的时候,没有及时的调整程序结构,而是在原有的程序结构上不断的加入代码,最终的软件就会退化。他分为战略设计和战术设计两个层次:DDD的战略设计可以帮助公司的领导人进行团队的划分,人员的组织,产品线的规划,也可以帮助产品经理对产品功能进行规划,还可以帮助架构师进行项目架构的规划,术站的选择等;原创 2022-11-17 15:13:39 · 1033 阅读 · 0 评论 -
Fluent Facede Pattern(外观模式)
外观模式的用意是为子系统提供一个集中化和简化的沟通渠道,而不是向子系统加入新的行为,新的行为的增加应该通过修改原有子系统类或增加新的子系统类来实现,不能通过外观类来实现。现代的软件系统都非常复杂,尽管我们已经想尽一切方法将其“分而治之”,把一个系统划分为好几个较小的子系统了,但是仍然可能会存在这样的问题:子系统内有非常多的类,客户端往往需要和许多对象打交道之后 才能完成想要完成的功能。接下来我们定义Car的外观,我们将外观定义放在两类中,一类定义颜色,品牌,门数,一类定义生产城市地址。原创 2022-11-11 16:45:53 · 455 阅读 · 0 评论 -
递归泛型(recursive generic)
原因很简单,SetName函数返回的对象类型是EmployeeInfoBuilder,无法调用EmployeePositionBuilder类的函数成员。当然我们可以将Employee对象以构造注入的方式传入进去,但是这样就违背了我们的Fluent原则。稍微说明一下的就是,这么做一方面是不好理解,另一方面可能对性能有一定的影响,我认为这个派生链条不宜过长,希望有懂的朋友可以指点一下。对于上面两个泛型类,我们无法直接定义,只能借助更高层次的派生类构造,且这个类不能再是泛型,也就是泛型链的终点。原创 2022-11-11 11:48:27 · 477 阅读 · 0 评论 -
Asp.NetCore 从数据库加载配置(二)
在第一节中,我们实现了基本的自定义数据库配置源,从而可以读取MySql数据库的配置,但是,我们没有实现动态加载数据库配置,也就是程序一但运行起来,数据库的配置更改后就不在被更新。所以本节重点来解决这个问题。原创 2022-11-03 12:24:36 · 654 阅读 · 0 评论 -
Asp .NetCore 从数据库加载配置(一)
asp.net core官方不支持直接从数据库中读取配置,所以这里我们要自定义配置。而自定义配置都需要实现IConfigurationProvider接口,也就是真正将数据库的字段构建成Dictionary。一般我笨都直接集成这个抽象类,ConfigurationProvider中最重要的方法就是Load,自定义配置提供者要实现Load方法。原创 2022-11-02 15:33:18 · 1649 阅读 · 0 评论 -
Web Api的参数传递建议
在进行Restful接口设计时,我们需要考虑如何给服务器传递参数。原创 2022-10-31 15:28:46 · 805 阅读 · 0 评论 -
C# 新语法
C#8.0,9.0,10.0中增加了很多新的语法,这些语法中有一些对开发人员帮助很大,这里做一点整理。C# 10.0中增加了“全局using指令”语法,我们可以将global修饰符添加到任何using关键字前,这样通过using语句引入的命名空间就可以应用到这个项目的所以源代码中,因此同一个项目中的C#代码就不需要再去重复引入这个命名空间了。在实践中,通常专门创建一个来编写全局using代码的文件,然后把项目中经常用到的命名空间声明到这个C#文件。原创 2022-10-28 16:29:59 · 1950 阅读 · 0 评论 -
C# 中的守卫语句(GuardClause)
一般而言,我们认为代码的最小单元就是一个函数或者方法,我们写出的代码应该能让人迅速理解,所以这要求我们的代码行数不要太多、命名清晰规范、功能单一(一个方法只做一件事)。导致代码复杂性增加的一个原因是条件判断,这时代码中往往会出现或者语句,如果没有组织好你的程序结构,这两种语句很容易将你的代码从简洁易懂的变成冗长,模糊,甚至低效的。所以有一个办法是通过使用守卫语句(Guard Clause)来避免这些问题。原创 2022-09-13 14:14:43 · 688 阅读 · 0 评论 -
简单的密码加密
无论密码长度是对少,因为MD5的算法,都会转为这个长度。原创 2022-09-08 14:39:06 · 482 阅读 · 0 评论 -
建造者模式
今天我们讨论一下 Builder 建造者模式,这个 Builder,其实和模板模式非常的像,但是也有区别,那就是在模板模式中父类对子类中的实现进行操作,在父类之中进行一件事情的处理,但是在 Builder 模式之中,父类和子类都不用关心怎么处理,而是用另一个类来完成对这些方法的有机组合,这个类的职责就是监工,规定了到底要怎么样有机的组合这些方法。...原创 2022-08-13 23:53:41 · 194 阅读 · 0 评论 -
原型模式(prototype pattern)
原型模式其实很简单,又可以成为克隆模式。想象你要造一架飞机,如果你要重头到位掌握造飞机的核心技术,那么你要从力学,材料学开始学起。但是你想快点看到成果,那你就把对应的零件买回来自己组装一个就好了。...原创 2022-08-12 17:20:43 · 446 阅读 · 0 评论 -
抽象工厂模式
为抽象工厂中相互依赖的每种产品定义抽象接口对象,也可以这样说,有几种产品,就要声明几个抽象角色,每一个抽象产品角色和一种具体的产品相匹配。原创 2022-08-12 12:04:11 · 295 阅读 · 0 评论 -
工厂方法模式
在工厂方法中,用户只需要知道所要产品的具体工厂,无须关系具体的创建过程,甚至不需要具体产品类的类名。在系统增加新的产品时,我们只需要添加一个具体产品类和对应的实现工厂,无需对原工厂进行任何修改,很好地符合了“开闭原则”。...原创 2022-08-12 10:36:30 · 137 阅读 · 0 评论 -
简单工厂模式
简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。。原创 2022-08-11 18:24:21 · 448 阅读 · 0 评论 -
在 ASP.NET Core 使用 IOptions pattern
由于配置结构随着嵌套部分而变得多样化,其关键表示变得冗长且难以维护。当然可以通过创建一个强类型的ConfigurationManager类来解决这个问题,该类封装了这种密钥访问机制,并且还处理了非字符串属性的类型转换要求。一个更优雅的方案是根据强类型类匹配,让Asp.NetCore为我们做这些复杂的匹配工站。.........原创 2022-08-03 20:08:19 · 706 阅读 · 0 评论 -
C#Linq中的GroupBy
然后你想根据ID建立一个映射表你要怎么做?原创 2022-07-26 19:00:17 · 2122 阅读 · 0 评论 -
C# Linq中的Select和SelectMany
关于C#中Linq扩展方法SelectMany的解释原创 2022-07-26 14:58:26 · 4815 阅读 · 0 评论 -
C# 查漏补缺(二)
目录1.泛型结构1.1扩展方法和泛型类1.2泛型委托 2.协变和逆变21.协变2.2 逆变3.迭代器3.1IEnumerator接口3.2 IEnumerable 接口 3.3.使用yeild创建可枚举类型4.Linq4.1Join4.2.let子句4.3.into子句5.异步编程5.1线程知识点5.2 ValueTask 5.3 Task.Delay5.4.BackgroundWorker6. 异步编程旧模式6.1介绍6.2. BeginInvoke和EndIvoke6.3 等待直到完成原创 2022-06-10 12:06:25 · 278 阅读 · 0 评论 -
自定义对象深拷贝的几种办法(deepcopy,C#)
目录1. 前提2.通过ICloneable接口3.自定义拷贝接口4.通过拷贝序列化后的二进制(Binary Serialization)5.使用XML对象序列化6.使用拷贝构造函数7.小结卸载前面,先来一句装逼文,原文如下:The maturity of a software engineer is determined by many factors such as knowledge of algorithms, analytical thinking, big-pi翻译 2021-05-13 17:04:27 · 1366 阅读 · 0 评论 -
C# 变量同步(binding)——利用属性和事件
目录1.关于INotifyPropertyChanged2.自定义同步事件3.集合的同步ObservableCollection1.关于INotifyPropertyChanged在WPF中,常常需要让UI空间绑定变量,当我们在UI中修改值时,这个修改能够同步到对象中去,要实现这个功能,往往需要让这个对象派生自INotifyPropertyChanged 接口,下面给一个例子: public class ExecutionModule: INotifyProperty..原创 2020-09-18 10:43:49 · 2687 阅读 · 0 评论 -
C# 特性的基本用法
目录前言一.预定义的保留特性1.Obsolete特性2.Conditional特性3.CallerFilePath、CallerLineNumber、CallerMemberName4.DebuggerStepThough4.其它预定义特性二.自定义特性前言特性是一种允许我们向程序的程序集增加元数据的语言结构,它用于保存程序结构信息的某种特殊类型的类。简单的说,特性主要是结合反射来获得程序的某些信息,在一般情况下其实没什么卵用。特性的使用形式如下: .原创 2020-07-06 00:58:48 · 2662 阅读 · 0 评论 -
C# CallerMemberName特性介绍以及简化InotifyPropertyChanged的实现
目录一.CallerMemberName属性介绍二. CallerMemberName简化InotifyPropertyChange的实现一.CallerMemberName属性介绍在开发过程中,我们有时候需要记录一下调用信息,比如有下面一个函数: public void DoSomething() { TraceMessage("事情开始起变化!"); }为例题哦哈斯方便,除了事件信息外,我们还想知道该..转载 2020-07-03 11:34:11 · 8208 阅读 · 1 评论 -
C#访问数据库的一种方法——NHibernate的配置和使用
目录1.背景2.配置3.使用4. 注意事项1.背景一般C#访问数据库可以通过引用MySql.Data.dll库来实现,然后添加一个MySqlHelper类来对MySql数据库进行访问和操作,添加引用后在你的数据库操作类(如MySqlHelper.cs)中添加引用声明using MySql.Data;using MySql.Data.MySqlClient;...原创 2019-12-26 15:32:28 · 1409 阅读 · 0 评论 -
C# 解析Json文件(使用NewtonJson库)
C#中解析json文件有很多种方法,在多种方法中一般都会提到一个十分优秀的库:NewtonJson。使用NewtonJson处理Json文件十分高效,而且在配置也十分简单,直接在Nuget包中导入即可。目录1.导入NewtonJson库2.解析Json文件2.1 最简单的序列化与反序列化2.2 序列化集合和字典2.3 反序列化集合和字典2.4 将对象保存为Json文件...原创 2019-12-18 11:11:49 · 21119 阅读 · 1 评论 -
C# 根据字符串生成对象——使用反射
在C#中,如果想根据类的字符串名动态生成类的示例对象,需要用到反射的知识。所谓反射,也就是利用程序集中的圆数据信息。凡是要用反射的程序,需要导入System.Reflection命名空间。动态创建对象有两大类:Activator和Assembly。我更喜欢Activator类,先简单介绍下Assembly。目录1.Assembly的使用方法1.1 假设你要反射一个 DLL 中的类,...原创 2019-11-20 12:26:19 · 5790 阅读 · 0 评论 -
C# LINQ入门
这里只是贴一些代码示例,很容易看懂,忘记了怎么用了就来翻看一下。目录1.不同的查询方法2.查询表达式的结构 2.1. from子句2.2. join子句2.3 from和join的完整示例 2.3 from...let ...where2.4 where子句2.5 orderby子句2.6 group子句2.7 into子句3. 标准查询运算符4...原创 2019-01-24 10:18:45 · 936 阅读 · 0 评论 -
C# 用户自定义转换
在C#中,我们可以为类和结构定义隐式和显示转换原创 2019-01-19 11:47:00 · 453 阅读 · 0 评论 -
C#泛型笔记
1.泛型的意义泛型编程最初诞生于C++中,由Alexander Stepanov[2]和David Musser[3]创立。目的是为了实现C++的STL。其语言支持机制就是模板(Templates)。模板的精神其实很简单:参数化类型。换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数T。所以如果你学过C++,那么你一定很熟悉泛型的概念,C++中常说的模...原创 2019-01-22 09:52:04 · 259 阅读 · 0 评论 -
C# using的三种用法详解
 一、using作为指令,有如下两个作用 1、导入其他命名空间或命名空间中定义的类型,这样就可以不必对类型使用完全限定名了。       注意:(1) using引入命名空间,并不等于编译器编译时加载该命名空间所转载 2019-02-01 11:48:49 · 1871 阅读 · 0 评论 -
Google.Protobuf 入门详解
目录1.介绍1.1官方解释1.2 通俗解释1.3 为什么要用protobuf2. 安装3. Proto文件编译4. 使用编译后的文件5. 将类文件信息转化为字节流5.1 通过流的形式转化5.2 直接通过函数转化附: Sublime3 配置proto文件语法高亮 1.介绍1.1官方解释Protobuf应该是Protoc buff...原创 2019-02-11 11:21:00 · 9749 阅读 · 1 评论