微信公众号登录不上seo门户网

pingmian/2025/10/8 19:02:58/文章来源:
微信公众号登录不上,seo门户网,做网站和推广的公司哪家好,爱客crm软件下载前言实体类的动态生成#xff08;一#xff09;由于采用字典的方式来保存属性变更值的底层设计思想#xff0c;导致了性能问题#xff0c;虽然.NET的字典实现已经很高效了#xff0c;但相对于直接读写字段的方式而言依然有巨大的性能差距#xff0c;同时也会导致对属性的… 前言实体类的动态生成一由于采用字典的方式来保存属性变更值的底层设计思想导致了性能问题虽然.NET的字典实现已经很高效了但相对于直接读写字段的方式而言依然有巨大的性能差距同时也会导致对属性的读写过程中产生不必要的装箱和拆箱。那么这次我们就来彻底解决这个问题同时还要解决“哪些属性发生过变更”、“获取变更的属性集”这些功能特性所以我们先把接口定义出来以便后续问题讲解。/* 源码位于 Zongsoft.CoreLibary 项目的 Zongsoft.Data 命名空间中 *//// summary 表示数据实体的接口。/summarypublic interface IEntity{/// summary/// 判断指定的属性或任意属性是否被变更过。/// /summary/// param namenames指定要判断的属性名数组如果为空(null)或空数组则表示判断任意属性。/param/// returns/// para如果指定的paramref namenames/参数有值当只有参数中指定的属性发生过更改则返回真(True)否则返回假(False)/para/// para如果指定的paramref namenames/参数为空(null)或空数组当实体中任意属性发生过更改则返回真(True)否则返回假(False)。/para/// /returnsbool HasChanges(params string[] names);/// summary/// 获取实体中发生过变更的属性集。/// /summary/// returns如果实体没有属性发生过变更则返回空(null)否则返回被变更过的属性键值对。/returnsIDictionarystring, object GetChanges();/// summary/// 尝试获取指定名称的属性变更后的值。/// /summary/// param namename指定要获取的属性名。/param/// param namevalue输出参数指定属性名对应的变更后的值。/param/// returns如果指定名称的属性是存在的并且发生过变更则返回真(True)否则返回假(False)。/returns/// remarks注意即使指定名称的属性是存在的但只要其值未被更改过也会返回假(False)。/remarksbool TryGetValue(string name, out object value);/// summary/// 尝试设置指定名称的属性值。/// /summary/// param namename指定要设置的属性名。/param/// param namevalue指定要设置的属性值。/param/// returns如果指定名称的属性是存在的并且可写入则返回真(True)否则返回假(False)。/returnsbool TrySetValue(string name, object value);}设计思想根本要点是取消用字典来保存属性值回归到字段方式只有这样才能确保性能关键问题是如何在写入字段值的时候标记对应的属性发生过变更的呢应用布隆过滤器(Bloom Filter)算法的思路来处理这个应用场景是一个完美的解决方案因为布隆过滤器的空间效率和查询效率极高而它的缺点在此恰好可以针对性的优化掉。将每个属性映射到一个整型数byte/ushort/uint/ulong的某个比特位(bit)如果发生过变更则将该 bit 置为1只要确保属性与二进制位顺序是确定的即可算法复杂度是O(1)常量并且比特位操作的效率也是极高的。实现示范有了算法我们写一个简单范例来感受下public class Person : IEntity{#region 静态字段private static readonly string[] __NAMES__ new string[] { Name, Gender, Birthdate };private static readonly Dictionarystring, PropertyTokenPerson __TOKENS__ new Dictionarystring, PropertyTokenPerson(){{ Name, new PropertyTokenPerson(0, target target._name, (target, value) target.Name (string) value) },{ Gender, new PropertyTokenPerson(1, target target._gender, (target, value) target.Gender (Gender?) value) },{ Birthdate, new PropertyTokenPerson(2, target target._birthdate, (target, value) target.Birthdate (DateTime) value) },};#endregion#region 标记变量private byte _MASK_;#endregion#region 成员字段private string _name;private bool? _gender;private DateTime _birthdate;#endregion#region 公共属性public string Name    {get _name;set{_name value;_MASK_ | 1;}}public bool? Gender    {get _gender;set{_gender value;_MASK_ | 2;}}public DateTime Birthdate    {get _birthdate;set{_birthdate value;_MASK_ | 4;}}#endregion#region 接口实现public bool HasChanges(string[] names){PropertyTokenPerson property;if(names null || names.Length 0)return _MASK_ ! 0;for(var i 0; i names.Length; i){if(__TOKENS__.TryGetValue(names[i], out property) (_MASK_ property.Ordinal 1) 1)return true;}return false;}public IDictionarystring, object GetChanges(){if(_MASK_ 0)return null;var dictionary new Dictionarystring, object(__NAMES__.Length);for(int i 0; i __NAMES__.Length; i){if((_MASK_ i 1) 1)dictionary[__NAMES__[i]] __TOKENS__[__NAMES__[i]].Getter(this);}return dictionary;}public bool TryGetValue(string name, out object value){value null;if(__TOKENS__.TryGetValue(name, out var property) (_MASK_ property.Ordinal 1) 1){value property.Getter(this);return true;}return false;}public bool TrySetValue(string name, object value){if(__TOKENS__.TryGetValue(name, out var property)){property.Setter(this, value);return true;}return false;}#endregion}// 辅助结构public struct PropertyTokenT{public PropertyToken(int ordinal, FuncT, object getter, ActionT, object setter){this.Ordinal ordinal;this.Getter getter;this.Setter setter;}public readonly int Ordinal;public readonly FuncT, object Getter;public readonly ActionT, object Setter;}上面实现代码主要有以下几个要点属性设置器中除了对字段赋值外多了一个位或赋值操作这是一句非常低成本的代码需要一个额外的整型数的实例字段 _MASK_ 来标记对应更改属性序号分别增加 __NAMES__ 和 __TOKENS__ 两个静态只读变量来保存实体类的元数据以便更高效的实现 IEntity 接口方法。根据代码可分析出其理论执行性能与原生实现基本一致内存消耗只多了一个字节如果可写属性数量小于9由于 __NAMES__ 和 __TOKENS__ 是静态变量因此不占用实例空间理论上该方案的整体效率非常高。性能对比上面我们从代码角度简单分析了下整个方案的性能和消耗那么实际情况到底怎样呢跑个分呗https://github.com/Zongsoft/Zongsoft.CoreLibrary/tree/feature-data/samples/Zongsoft.Samples.Entities。下面是某次在我的老旧台式机CPU:Intel i5-34703.2GHz | RAM:8GB | Win10 | .NET 4.6上生成100万个实例的截图“Native Object: 295”表示原生实现版即简单的读写字段的运行时长单位毫秒下同“Data Entity: 295”为本案的运行时长通常本方案比原生方案要慢10毫秒左右偶尔能跑平属于运行环境抖动可忽略“Data Entity(TrySet): 835”为本方案中 TrySet(...) 方法的运行时长由于 TrySet(...) 方法内部需要进行字典查询所以有性能损耗亦属正常在百万量级跑到这个时长说明性能也是很不错的如果切换到 .NET Core 2.1 的话得益于基础类库的性能改善还能再享受一波性能红利。综上所述该方案付出极少的内存成本获得了与原生简单属性访问基本一致的性能同时还提供了属性变更跟踪等新功能即高效完成了 Zongsoft.Data.IEntity 接口中定义的那些重要功能特性为后续业务开发提供了有力的基础支撑。实现完善上面的实现范例代码并没有实现 INotifyPropertyChanged 接口下面补充完善下实现该接口后的属性定义public class Person : IEntity, INotifyPropertyChanged{// 事件声明public event PropertyChangedEventHandler PropertyChanged;public string Name    {get _name;set{if(_name value)return;_name value;_MASK_ | 1;this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Name)));}}}如上属性的设置器中的做了一个新旧值的比对判断和对 PropertyChanged 事件激发其他代码没有变化。另外我们使用的是 byte 类型的 _MASK_ 的标记变量来保存属性的更改状态如果当实体的属性数量超过 8 个就需要根据具体数量换成相应的 UInt16,UInt32,UInt64 类型但如果超过 64 就需要采用 byte[] 了当然必须要变动下相关代码假设以下实体类有 100 个属性注意仅例举了第一个 Property1 和最后一个 Property100属性public class MyEntity : IEntity{#region 标记变量private readonly byte[] _MASK_;#endregionpublic Person(){_MASK_ new byte[13]; // 13 Math.Ceiling(100 / 8)}public object Property1    {get _property1;set{_property1 value;_MASKS_[0] | 1; // _MASK_[0 / 8] | (byte)Math.Pow(2, 0 % 8);}}public object Property100    {get _property100;set{_property100 value;_MASKS_[12] | 8; // _MASK_[99 / 8] | (byte)Math.Pow(2, 99 % 8);}}}变化内容为先根据当前属性的顺序号来确定到对应的标记数组的下标然后再确定对应的掩码值。当然也别忘了调整 Zongsoft.Data.IEntity 接口中各方法的实现。public class MyEntity : IEntity{public bool HasChanges(params string[] names){PropertyTokenUserEntity property;if(names null || names.Length 0){for(int i 0; i _MASK_.Length; i){if(_MASK_[i] ! 0)return true;}return false;}for(var i 0; i names.Length; i){if(__TOKENS__.TryGetValue(names[i], out property) (_MASK_[property.Ordinal / 8] (property.Ordinal % 8) 1) 1)return true;}return false;}public IDictionarystring, object GetChanges(){var dictionary new Dictionarystring, object(__NAMES__.Length);for(int i 0; i __NAMES__.Length; i){if((_MASK_[i / 8] (i % 8) 1) 1)dictionary[__NAMES__[i]] __TOKENS__[__NAMES__[i]].Getter(this);}return dictionary.Count 0 ? null : dictionary;}public bool TryGet(string name, out object value){value null;if(__TOKENS__.TryGetValue(name, out var property) (_MASK_[property.Ordinal / 8] (property.Ordinal % 8) 1) 1){value property.Getter(this);return true;}return false;}public bool TrySetValue(string name, object value){/* 相对之前版本没有变化 *//* No changes relative to previous versions */}}代码变化部分比较简单只有掩码处理部分需要调整。新问题有了这些实现范式定义个实体基类并在基类中完成主要功能即可推广应用了但是这里有个掩码类型和处理方式无法通用化实现的问题如果要把这部分代码交由子类来实现的话那么代码复用度会大打折扣甚至完全失去复用的意义。为展示这个问题的艰难在 https://github.com/Zongsoft/Zongsoft.CoreLibrary/blob/feature-data/tests/Entities.cs 源文件中写了属性数量不等的几个实体类Person、Customer、Employee、SpecialEmployee采用继承方式进行复用性验证可清晰看到实现的非常冗长繁琐对实现者的细节把控要求很高、实现上非常容易出错更致命的是复用度还极差。并且当实体类需要进行属性增减是非常麻烦的需要仔细调整原有代码结构中掩码的映射位置这对于代码维护无意是场恶梦。新办法解决办法其实很简单正是本文的标题——“动态生成”彻底解放实现者并确保实现的正确性。业务方不再定义具体的实体类而是定义实体接口即可实体类将由实体生成器来动态生成。我们依然“从场景出发”先来看看业务层的使用。public interface IPerson : IEntity{string Name { get; set; }bool? Gender { get; set; }DateTime Birthdate { get; set; }}public interface IEmployee : IPerson{byte Status { get; set; }decimal Salary { get; set; }}var person Entity.BuildIPerson();var employee Entity.BuildIEmployee();总结至此终于得到了一个兼顾性能与功能并易于使用且无需繁琐的手动实现的最终方案虽然刚开始看起来是一个多么平常又简单的任务。那么接下来我们该怎么实现这个动态生成器呢最终它能性能无损的被实现出来吗请关注我们的公众号Zongsoft留言讨论。相关文章实体类的动态生成一原文地址http://zongsoft.github.io/blog/zh-cn/zongsoft/entity-dynamic-generation-2/.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/90099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提升网站流量广州的网站建设公司

目录 1.问:如何设计一个系统来确保在可能出现网络分区和故障的分布式环境中的数据一致性?

贸易网站建站两栏式设计网站

基础组件 索引组件—AlphabetIndexer&#xff08;相当于安卓的seedbar&#xff09; 使用&#xff1a;AlphabetIndexer(value: {arrayValue: Array<string>, selected: number})空白填充组件—Blank&#xff08;占位使用&#xff0c;当父组件为Row/Column/Flex时生效&am…

外贸建站如何推广梓潼移动网站建设

<a onclick"alert(1)">超链接1</a><br> <a href"#" onclick"alert(2)">超链接2</a> <br> <a href"javascript:alert(3)">超链接3</a>

自己做的网站可以运营不wordpress文章文件夹

创作不易&#xff0c;来个三连呗&#xff01; 一、预定义符号 C语⾔设置了⼀些预定义符号&#xff0c;可以直接使⽤&#xff0c;预定义符号也是在预处理期间处理的。 __FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE__ //⽂件被编译的⽇期 __TIME__ //⽂件被编…

太原招聘网站开发电商大数据查询平台免费

本文实例讲述了jQuery无刷新分页实现方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;这款jQuery分页示例&#xff0c;是分页经典形式&#xff0c;兼容性也做的好&#xff0c;网页上的分页代码&#xff0c;分享给大家。运行效果截图如下&#xff1a;在线演示地址如…

官方电商平台咸阳seo培训

“Jack&#xff0c;这次你要是不帮我&#xff0c;我就死定了&#xff01;” 收到美国公司采购Antony的信息时&#xff0c;我有些哭笑不得&#xff0c;因为在我电脑屏幕上除了他的信息外&#xff0c;还有来自他公司监察部门的邮件&#xff1a; “jack先生&#xff0c;我们调查…

新乡做网站价格一线互联网公司有哪些

思科配置tftp服务器 内容精选换一换使用mount命令挂载文件系统到云服务器&#xff0c;云服务器系统提示timed out。原因1&#xff1a;网络状态不稳定。原因2&#xff1a;网络连接异常。原因3&#xff1a;云服务器DNS配置错误&#xff0c;导致解析不到文件系统的域名&#xff0c…

佛山三水网站建设免费wordpress博客

究竟什么是搜索引擎&#xff1f;正式介绍XunSearch 啥&#xff1f;还要单独讲一下啥是搜索引擎&#xff1f;不就是百度、Google嘛&#xff0c;这玩意天天用&#xff0c;还轮的到你来说&#xff1f; 额&#xff0c;好吧&#xff0c;虽然大家天天都在用&#xff0c;但是我发现&am…

做网站需要的课程做一个企业网站多少钱

好久木有在知乎冒泡了&#xff0c;不知道还能不能出现在大家的timeline上哇QAQ正文开始之前还是先习惯性的碎碎念一下。前段时间换了研究方向&#xff0c;重新pick了问答和检索&#xff0c;为了追上相关问题的最新进展&#xff0c;就顾不上写文的刷了一堆paper&#xff0c;加上…

家乡网站设计目的互联网公司排名名单

点击上方蓝字关注我们0. 简介在某些时候我们可能会需要执行后台任务&#xff0c;或者是执行一些周期性的任务。比如说可能每隔 1 个小时要清除某个临时文件夹内的数据&#xff0c;可能用户会要针对某一个用户群来群发一组短信。前面这些就是典型的应用场景&#xff0c;在 Abp 框…

石岩医院网站建设网络建设标准

原题链接&#xff1a;https://leetcode.cn/problems/reverse-linked-list/description/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 方法一&#xff1a;三指针翻转法 使用三个结构体指针n1&#xff0c;n2&#xff0c;n3&#xff0c;原地修改结点…

企业在网站推广汕尾网站seo

文章目录 工厂模式1、简单工厂模式2、工厂模式3、抽象工厂4、总结 工厂模式 工厂模式是 Java 中最常用的设计模式之一&#xff0c;工厂模式模式的写法有好几种&#xff0c;这里主要介绍三种&#xff1a;简单工厂模式、工厂模式、抽象工厂模式 1、简单工厂模式 这里以制造cof…

做棋牌网站违法吗做暧昧免费视频大全网站

[NOIP2008 普及组] 传球游戏 题目描述 上体育课的时候&#xff0c;小蛮的老师经常带着同学们一起做游戏。这次&#xff0c;老师带着同学们一起做传球游戏。 游戏规则是这样的&#xff1a; n n n 个同学站成一个圆圈&#xff0c;其中的一个同学手里拿着一个球&#xff0c;当老…

网站建设常用的编程语言网站接口怎么做

UTC时间格式是什么 首先我们先简单的了解一下&#xff1a;UTC时间&#xff08;协调世界时&#xff0c;Coordinated Universal Time&#xff09;使用24小时制&#xff0c;以小时、分钟、秒和毫秒来表示时间 HH:mm:ss.SSSHH 表示小时&#xff0c;取值范围为00到23。mm 表示分钟…

做设计找素材的+网站有哪些使用wordpress版权

在博客上看到一篇关于给二十几岁人的人生建议&#xff0c;觉得颇有道理&#xff0c;写一下关于这个感想&#xff0c;提醒现在和以后的你和自己。 人生路上&#xff0c;确实是一切都是未知的&#xff0c;你不知道你下一刻&#xff0c;面临的会是什么&#xff0c;我们无法预知未…

网站不公开简历做家教wordpress自动评论工具

在当今数字化时代&#xff0c;网络安全和隐私保护日益受到重视。作为网络工程师和网络文章主编&#xff0c;我将为您介绍一种强大而高级的代理技术——SK5代理&#xff0c;并探讨其在网络安全、爬虫以及HTTP通信中的重要应用。 1. SK5代理简介 SK5代理是一种基于SOCKS5协议的…

seo 专业为网站建设专业网站开发方案

目录 一、修改PPT中每一页的字体二、将文本框中的字都放到word里 将一份PPT的每一页字体、大小、是否加粗都统一&#xff0c;是一个常见需求。特别是字体统一是高频、热点需求。在python操控PPT常用库python-pptx中有一个bug&#xff0c;对字体的修改只能修改数字和英文字母&am…

教学网站建设计划怎么免费创建网页

1.Android.mk导包 1).jar包位置 与res和src同一级的libs中(没有就新建) 2).Android.mk文件 LOCAL_STATIC_ANDROID_LIBRARIES&#xff1a;android静态库&#xff0c;经常用于一些support的导包 LOCAL_JAVA_LIBRARIES&#xff1a;依赖的java库&#xff0c;一般为系统的jar…

网站管理员怎么做软件开发包括什么内容

1、环境搭建 https://github.com/ultralytics/yolov5 2、安装需要的软件 pip install -U -r requirements.txt 3、准备数据 在data文件下建立上面三个文件&#xff08;Annotations、images与ImageSets&#xff0c;labels后续我们脚本生成&#xff09;其中Annotations存放xml…

深做网站公司Wordpress数据怎么导出

搜索热词ThinkPHP的数据库条件查询语句有字符串式&#xff0c;数组式书写方法字符串式即是原生式&#xff0c;数组式查询语句因书写方式与特定字符的原因比较复杂&#xff0c;下面为大家例出了常用的ThinkPHP数组式查询语句的使用方法ThinkPHP一般查询$data_gt[id]array(gt,8);…