TKey

Noah Mt4跟单系统制作第十篇 锁篇

試著忘記壹切 提交于 2021-02-18 16:43:53
using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Copier.Core { public sealed class KeyLocker<T> : IDisposable { private static readonly object _lockerDictionary = new object(); private static readonly Dictionary<T, LockerObject> _lockerObjects = new Dictionary<T, LockerObject>(); private T _key; public KeyLocker(T key) { _key = key; LockerObject lockerObject; lock (_lockerDictionary) { if (!_lockerObjects.TryGetValue(_key, out lockerObject)) { lockerObject =

Entity Framework DBContext 增删改查深度解析

左心房为你撑大大i 提交于 2021-02-10 05:23:33
   Entity Framework DBContext 增删改查深度解析 有一段时间没有更新博客了,赶上今天外面下雨,而且没人约球,打算把最近对Entity Framework DBContext使用的心得梳理一下,早些时候在网上简单查过,对于最新版本的EF并没有类似的知识梳理类文章,希望对大家有所帮助。 1. 不要Code first, 也不要DB first 我为什么讨厌Code first和DB first呢?首先Code first是先写代码,数据库完全由代码生成,开发阶段尚可,一旦到了产品发布阶段,如果需要添加字段,我们总不能用 visual studio去生产环境上去更新数据库吧,听起来就很可怕。而且另外的一个问题自动是生成的数据库脚本也不可控,还不如自己提前设计好。DB first也好不了哪去,反向转过来的代码包含很多没有用的文件,而且数据库的更新还要重新走Model生成过程,简直无法理解为什么会有这样的设计。 说了这么多,怎么解决呢? 数据库和领域模型分开设计,按照对应关系映射字段,使用自定义链接字串,既不使用领域模型生成数据库,也不用数据库生成领域模型,示例代码如下, SQL Code 以 Destinations和TTable表为例: CREATE TABLE [DBO].[Destinations] ( [DestinationId] [ int ]

深入Lua:Table的实现

£可爱£侵袭症+ 提交于 2021-02-04 04:04:54
Table的结构 Lua和其他语言最不同的地方在于,它只有一个叫表的数据结构:这是一个数组和哈希表的混合体。神奇的地方在于只通过表,就可以实现模块,元表,环境,甚至面向对象等功能。这让我们很好奇它内部的结构到底是怎么样的。 它的结构定义在 lobject.h 中,是这样的: typedef struct Table { // 这是一个宏,为GCObject共用部分,展开后就是: // GCObject *next; lu_byte tt; lu_byte marked // 所有的GC对象都以这个开始 CommonHeader; // 和快速判断元方法有关,这里可以先略过 lu_byte flags; // 哈希部分的长度对数:1 << lsizenode 才能得到实际的size lu_byte lsizenode; // 数组部分的长度 unsigned int sizearray; // 数组部分,为TValue组成的数组 TValue * array ; // 哈希部分,为Node组成的数组,见下面Node的说明 Node *node; // lastfree指明空闲槽位 Node *lastfree; // 元表:每个Table对象都可以有独立的元表,当然默认为NULL struct Table * metatable ; // GC相关的链表,这里先略过 GCObject

Arraylist 与 LinkedList 异同

大城市里の小女人 提交于 2021-01-09 08:08:28
1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全; 2. 底层数据结构: Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向链表数据结构(JDK1.6之前为循环链表,JDK1.7取消了循环。注意双向链表和双向循环链表的区别:); 详细可阅读JDK1.7-LinkedList循环链表优化 https://www.cnblogs.com/xingele0917/p/3696593.html 3. 插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行 add(E e) 方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话( add(int index, E element) )时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。 ② LinkedList 采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响,都是近似 O(1)而数组为近似 O(n)。 4. 是否支持快速随机访问: LinkedList

C语言sprintf与sscanf函数

冷暖自知 提交于 2020-12-27 10:05:19
1、前言   OUI是指Organizationally unique identifier (组织唯一标识符),签发给各类组织的唯一标识符。MAC地址共有6个字节48位组成,前3个字节体现了OUI,其表明了NIC的制造组织。通常情况下,该标识符是唯一的。详细介绍参考: http://standards.ieee.org/develop/regauth/oui/public.html 。oui.txt文件中记录世界所有网卡的制造厂商,共有18859个。文件中记录mac的前三位与公司的对应关系。本文目地是对oui.txt文件进行解析,生产一个信息的文件,在程序中可以根据制定的mac地址,快速查找其对应的公司名称。在此将MAC前三个字节简称为MAC前缀。 2、初步处理   oui.txt文件内容很有规律,根据MAC前缀由小到大记录。但是,MAC前缀并不是连续的,中间有些间断,但是顺序是由小到大。原始文件内容格式如下所示: OUI Organization company_id Organization Address 00-00-00 (hex) XEROX CORPORATION 000000 (base 16) XEROX CORPORATION M/S 105-50C 800 PHILLIPS ROAD WEBSTER NY 14580 UNITED STATES 00-00

第十节:基于MVC5+Unity+EF+Log4Net的基础结构搭建

妖精的绣舞 提交于 2020-12-19 01:15:02
一. 前言   本节继续探讨一种新的框架搭建模式,框架的结构划分和上一节是相同的,本节IOC框架换成了Unity,并且采用构造函数注入的方式,另外服务层的封装模式也发生了变化,下面将详细的进行探讨。 (一). 技术选型   1. DotNet框架:4.6   2. 数据库访问:EF 6.2 (CodeFrist模式)   3. IOC框架:Unity 5.8.13   4. 日志框架:log4net 2.0.8   5. 开发工具:VS2017 (二). 框架目标   1. 一个项目同时连接 多个相同种类 的数据库,在一个方法中可以同时对多个数据进行操作。   2. 支持多种数据库:SqlServer、MySQL、Oracle,灵活的切换数据库。   3. 抽象成支持多种数据库连接方式:EF、ADO.Net、Dapper。 二. 搭建思路 1. 层次划分   将框架分为:Ypf.Data、Ypf.IService、Ypf.Service、Ypf.DTO、Ypf.Utils、Ypf.AdminWeb 六个基本层(后续还会补充 Ypf.Api层),每层的作用分别为:   ①. Ypf.Data:存放连接数据库的相关类,包括EF上下文类、映射的实体类、实体类的FluentApi模式的配置类。   ②. Ypf.IService:业务接口层,用来约束接口规范。   ③. Ypf

java的集合工具类Collections

与世无争的帅哥 提交于 2020-12-17 15:48:57
集合框架的工具类。 Collections: 集合框架的工具类。里面定义的都是静态方法。 Collections 和 Collection 有什么区别? Collection 是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。 它有两个常用的子接口 : List :对元素都有定义索引。有序的。可以重复元素。 Set :不可以重复元素。无序。 Collections 是集合框架中的一个工具类。该类中的方法都是静态的 提供的方法中有可以对 list 集合进行排序,二分查找等方法。 通常常用的集合都是线程不安全的。因为要提高效率。 如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。 Collections 常用方法 排序 static <T extends Comparable<? super T>> void sort(List<T> list) 根据元素的自然顺序 对指定列表按升序进行排序 <T extends Comparable> 要排序的对象必须是 Comparable 的子类 static <T> void sort(List<T> list, Comparator<? super T> c) 根据指定比较器产生的顺序对指定列表进行排序。 自定义比较器排序 最大值最小值 static <T extends Object &

NLayerAppV3--基础结构层(Cross-Cutting部分)

混江龙づ霸主 提交于 2020-12-14 07:30:15
回顾:NLayerAppV3是一个使用.net 2.1实现的经典DDD的分层架构的项目。 NLayerAppV3是在NLayerAppV2的基础上,使用.net core2.1进行重新构建的;它包含了开发人员和架构师都可以重用的DDD层。 Github地址: https://github.com/cesarcastrocuba/nlayerappv3 NLayerAppV3的基础结构层一共分为两个部分。处理数据相关的基础组件和Cross-Cutting的基础组件。 处理数据相关的基础组件主要包含UOW和仓储的实现; Cross-Cutting的基础组件目前主要包含数据适配器、国际化、验证; 本节我们主要介绍Cross-Cutting的基础组件。 这部分相关的项目主要有两个Infrastructure.Crosscutting和Infrastructure.Crosscutting.NetFramework。 Infrastructure.Crosscutting封装了数据适配器、国际化、验证相关的接口; Infrastructure.Crosscutting.NetFramework包含了Infrastructure.Crosscutting中相关契约的实现; 1、Infrastructure.Crosscutting --Adapter数据适配器

Hashtable与Dictionary<K,V>的比较。

房东的猫 提交于 2020-12-12 13:31:57
Hashtable 和 Dictionary <K, V> 类型 1):单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分. 2):多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized()方法可以获得完全线程安全的类型. 而Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减. 3):Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便. HashTable中的key/value均为object类型,由包含集合元素的存储桶组成。存储桶是 HashTable中各元素的虚拟子组,与大多数集合中进行的搜索和检索相比,存储桶可令搜索和检索更为便捷。每一存储桶都与一个哈希代码关联,该哈希代码是使用哈希函数生成的并基于该元素的键。HashTable的优点就在于其索引的方式,速度非常快。如果以任意类型键值访问其中元素会快于其他集合,特别是当数据量特别大的时候,效率差别尤其大。 HashTable的应用场合有:做对象缓存,树递归 算法 的替代,和各种需提升效率的场合。

基于STM32F429的内存管理

偶尔善良 提交于 2020-11-18 20:09:05
1.内存管理介绍    内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如 何高效,快速的分配,并且在适当的时候释放和回收内存资源。 内存管理的实现方法有很多种, 他们其实最终都是要实现 2 个函数: malloc 和 free ; malloc 函数用于内存申请, free 函数用于 内存释放。  从上图可以看出,分块式内存管理由内存池和内存管理表两部分组成。内存池被等分为 n 块,对应的内存管理表,大小也为 n ,内存管理表的每一个项对应内存池的一块内存。 内存管理表的项值代表的意义为:当该项值为 0 的时候,代表对应的内存块未被占用,当 该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。 比如某项值为 10 ,那么说明包括本项对应的内存块在内,总共分配了 10 个内存块给外部的某 个指针。 内寸分配方向如图所示,是从顶  底的分配方向。即首先从最末端开始找空内存。当内存 管理刚初始化的时候,内存表全部清零,表示没有任何内存块被占用。 分配原理     当指针 p 调用 malloc 申请内存的时候,先判断 p 要分配的内存块数( m ),然后从第 n 项开 始 ,向下查找,直到找到 m 块连续的空内存块(即对应内存管理表项为 0 ),然后将这 m 个内 存管理表项的值都设置为 m (标记被占用),最后