自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 使用.NET Jieba.NET 的 PosSegmenter 实现中文分词匹配

中文分词是将连续的中文文本切分成有意义的词语的过程。例如,对于句子"我喜欢使用Jieba分词器",分词结果应该是["我", "喜欢", "使用", "Jieba", "分词器"]。中文分词在自然语言处理、文本挖掘等领域都具有重要的应用。Jieba.NET是一个基于Python开源项目jieba的.NET版本。它提供了高效且准确的中文分词和词性标注功能。Jieba.NET支持基于前缀词典和隐马尔可夫模型的分词算法,能够处理各种复杂的中文文本。

2023-08-23 16:15:11 231

原创 【C#/.NET】RESTful风格的Post请求与CreateAtAction

创建资源的Post请求: 在RESTful架构中,使用Post请求来创建新资源。使用POST动词发送请求;在请求的主体中发送要创建的资源的表示形式(通常使用JSON或XML);返回状态码201(Created),表示资源已成功创建;在响应头中包含新资源的位置URL。使用.NET WebApi的CreateAtAction方法可以很方便地返回创建资源的成功响应,并包含新资源的位置。通过遵循RESTful风格的设计原则,我们能够设计出更加灵活和可扩展的Web应用程序。

2023-07-05 18:14:55 382

原创 【C#/.NET】探究Task中ConfigureAwait方法

ConfigureAwait方法在异步编程中扮演着重要的角色,通过配置任务的运行上下文,可以对任务的执行和调度进行灵活控制,从而提高应用程序的性能和响应能力。但在使用时需要注意场景和参数的选择,以确保任务的正确执行和应用程序的稳定性。在.NET开发中,合理地使用ConfigureAwait方法可以帮助我们优化异步代码的性能,提高应用程序的用户体验。希望本篇博客对读者有所帮助,能够在实际开发中更加灵活地运用ConfigureAwait方法。

2023-07-02 12:57:40 318

原创 【C#/.NET】MAUI上的依赖注入

依赖注入是一种设计模式,它通过将对象的创建和依赖关系的管理交给容器来简化应用程序的开发。依赖注入有助于解耦组件之间的依赖关系,使得代码更加灵活、可扩展并且易于测试。

2023-06-30 18:47:18 369

原创 【C#/.NET】使用Automapper映射record类型

我已经将项目的所有Dto都是用record类型,但是record类型还是有些需要注意的点,本文将介绍如何使用Automapper将POCO映射成record的对象。值得注意的是,由于record是不可变的,因此我们只能在创建时初始化其属性,无法在后续代码中修改属性值。因此,在映射过程中,Automapper会自动为record类型的目标对象生成一个构造函数,并根据源对象的属性值进行初始化。安装完成后,我们可以在项目中引入Automapper的命名空间,以便在代码中使用Automapper相关的功能。

2023-06-29 18:08:53 163

原创 【C#/.NET】xUnit和Moq实现TDD

在本文中,我们介绍了如何使用xUnit和Moq库实现TDD。通过编写测试代码并在功能代码之前运行它,我们能够快速发现程序中的错误,并提高代码质量。xUnit提供了各种测试机制,如类、测试函数、断言等,Moq库提供了轻松模拟对象的机制。如果您正在寻找一个快速、简单、可靠的开发方法来编写高质量的代码,请尝试TDD。

2023-06-15 12:14:43 209

原创 【C#/.NET】Dapper使用QueryMultipleAsync执行多条SQL

通过使用Dapper的QueryMultipleAsync一次性查询多个结果,减少了与数据库服务器的请求次数。减少了代码量。

2023-06-09 16:10:24 599

原创 【计算机网络】延迟

延迟计算机网络性能非常重要的术语。延迟用于度量从一个地方到另一个地方传输数据所需的时间,延迟在很大程度上影响了网络性能和用户体验。理解延迟可以帮助我们更好地设计和优化计算机网络。虽然我们不能突破光速限制,但理解光速延迟,可以让我们通过缩短与客户端的距离来达到减少延迟。

2023-06-09 10:40:01 830

原创 【C#/.NET】record介绍

record是.NET 5中的一种新特性,可以看作是一种概念上不可变的类。records可以帮助我们在C#中更容易地处理数据,同时提供了重要的功能,如对象相等性、hashcode和解构。与类不同,records具有值语义。也就是说,当比较两个records的实例时,比较的是这些实例的属性而非引用。这意味着,如果两个records的属性值相同,它们就是相等的。record也可以简化需要类似于Dto的数据结构容器的定义。

2023-06-06 10:55:51 331

原创 【踩坑记录】字节流数据按照string的方式读取然后按照string的方案存储,编码导致二进制数据发生变化,原理记录

当一个byte[]在计算机中存储时,它就是以二进制形式保存的。如果这个byte[]中的每一个字节代表的是ASCII码(一个字节表示一个字符),那么它在不同的编码下读取应该没有问题。但是,如果它代表的是Unicode字符集(UTF-8和UTF-16等),那么在不同的编码下读取就会发生问题。

2023-06-01 20:19:14 95

原创 【软件开发】代码整洁之道概念

使用不可变对象的一个好处是可以提高代码的安全性和可靠性。此外,不可变对象还能够避免副本共享和值传递的问题,因为对不可变对象的任何修改都是返回一个新的对象,不会影响原始对象,从而避免了意外修改原始对象带来的风险。低内聚意味着模块或组件内部的元素之间的联系很弱,彼此之间交流和合作的频率很低,使得系统难以设计和维护,需要更多的时间和资源。在传统应用程序中,程序的控制权通常由开发人员直接编写的代码来决定,程序的各个组件之间相互协作和依赖也较为紧密,这种方式的缺点是改动和维护成本较高,可扩展性和可测试性也不足。

2023-05-30 11:31:22 65

原创 【C#/.NET】使用ASP.NET Core对象池

T Get()负责获取复用对象。Return负责将复用的对象释放回对象池中。如果不调用Return,表示该对象在对象池被移除。

2023-05-28 15:27:04 89

原创 【C#代码整洁之道】读后总结

GPT回答:DRY是"Don't Repeat Yourself"的缩写,意为“不重复自己”。这个原则是指在代码中避免出现重复的、冗余的代码,而是尽可能地使用模块、函数和其他工具来进行抽象和复用。可维护性更好:由于代码的可重用性更高,因此需要修改的代码也更少,减少了维护成本。可读性更好:因为代码更少且更简单,因此容易理解,同时也更易于找到、修改和重构,提高了代码的可读性。可扩展性更好:由于代码更加通用和抽象,因此可以轻松地扩展为其他功能,提高了代码的可扩展性。

2023-05-18 11:44:38 105

原创 【.NET】C#/.NET新建项目sln,增加src和test文件夹问题和解决方案

经常逛github找优秀的.NET项目看,看到github上的项目的层级有src test,sln放在外层。如下图:发现自己在Visaul Studio新建的项目即使添加了src和test,然后基于文件夹下新建项目,物理路径上也不是这样的结构。如图:物理路径下依然和sln是平级状态。通过Visaul Studio直接在解决方案添加新建项目会产生一个虚拟目录,导致物理路径不符。通过dotnet CLi或者手动拷贝,添加现有项目可以解决此问题。

2023-05-17 15:00:44 351

原创 【面向对象依赖关系概念总结】面向对象程序设计的五种依赖关系

面向对象程序设计中,要实现复杂的模块化系统,需要将系统划分为多个对象并组织它们之间的关系,这就涉及到常说的面向对象五大依赖关系。这五种依赖关系分别是:继承、聚合、组合、关联和依赖。本文将逐一介绍这五种依赖关系。总的来说,面向对象程序设计中的五大依赖关系是程序员必须理解和掌握的一些基本概念。当我们设计、实现和维护面向对象系统时,需要合理使用这些依赖关系,以便让我们的程序结构更为清晰、易懂、易扩展和易维护。

2023-05-08 11:32:03 408

原创 【踩坑】.NET异步方法不标记async,Task<int>返回值 return default问题

在.NET中,返回类型为Task的方法并不一定要标记为async。这是因为async关键字只是用来告诉编译器该方法中包含异步操作,并且可以使用await和其他异步特性(如)来等待异步操作完成。如果一个方法中没有使用await或者其他异步特性,但是返回类型为Task,那么该方法仍然是异步方法。它返回的任务(Task)表示一项异步操作,可以被等待。例如,以下示例中的方法返回一个Task对象,但是没有使用async关键字:在上述示例中,方法使用Task.Run。

2023-04-25 15:25:33 277

原创 【介绍】C++五种迭代器介绍

支持单次读取和前进;即只能遍历一遍集合,并且只能向前跳转。- 递增操作(Increment):++iter- 解引用操作(Dereference):*iter- 比较操作(Equality Comparable):iter1 == iter2、iter1!= iter2- const支持:同时支持const和non-const迭代器,因为输入流不应该改变容器元素。

2023-04-24 15:41:45 507

原创 【介绍】.NET新加特性介绍

当下的.Net新版本引进了几种新特性,包括全局命名空间引用、可空引用类型和顶级语句。这些特性在一定程度上改善了 .NET 平台的开发效率, 对于短小精干的小程序,这些新的特性无疑可以把开发效率提高到新的高度。正文1. .NET 7 中的全局命名空间引用特性可以在一个项目的全局范围内导入命名空间,从而减少代码中使用 using 指令导入命名空间的重复头部的工作。2. 可空类型(Nullable Type)是.NET中的值类型,在表示这些类型的变量时,允许变量持有 null 值。

2023-04-23 12:12:22 367

原创 【总结】浅刷leetcode,对于位运算提高性能的一些总结

位运算是一种对二进制数进行操作的运算。它包括按位与、按位或、按位异或、按位取反等操作。在计算机中,位运算是非常快速的,因为它们可以直接在硬件层面上执行。

2023-04-20 11:54:38 93

原创 从++i思考原子性和线程安全问题

也就是说,在多个线程同时访问共享资源时,每个线程都能按照正确的顺序进行访问,而不会相互干扰或破坏数据的一致性和正确性。比如,在单线程环境中,++i确实是原子性的,它可以保证操作的完整性和正确性。然而,在多线程环境中,由于没有同步机制的保护,多个线程可能会同时对i进行修改,从而导致竞态条件问题,进而破坏数据的一致性和正确性。然而,有些人可能会将原子性和线程安全混淆,认为一个原子性操作就一定是线程安全的。总之,虽然++i被认为是原子性操作,但它在多线程环境中仍有可能出现竞态条件问题,因此并不是线程安全的。

2023-04-14 11:02:12 171

原创 C++与C#对于有无符号数值运算的区别

得到结果65534,因为short最大值为32767.比较反直觉的是 此处应该发生算数溢出。而由于C#的数值运算,小于int类型的数值统统都会转成int进行运算。原因:int由于与有符号变量u进行加法运算,C++编译器将进行类型转换,i的值变为 2^32 - 42 +1成为一个有符号数值然后与u相加得到结果。此处 直觉认为应该还是12345,结果却为53191。也是由于无符号转换为有符号,进行了反码到原码的转换 得到了53191。C#也依然存在 无符号数转型发生不符合直觉的结果。

2023-02-02 16:06:23 88

原创 DDD术语

我们需要区分不同的对象,引入实体来保证唯一性。而实体在一段时间只能状态可以改变,甚至可以变得和之前完全不同的状态,但是实体依然要有一个唯一标识。实体的唯一性和可变性也是区分实体和值对象的一项指标。通常,领域模型通过对象模型来实现,这些对象同时包含了数据和行为,并且表达了准确的业务含义。表示一种强关联的关系,整体与部分的关系。值对象的内部状态发生了改变,应该整体替换,而不是通过某个内部方法改变状态。值对象的比较应该也是比较所有的属性值而不是比较引用。将相关联的领域对象进行显示的分组,表达整体的概念。

2022-10-23 18:29:08 127

原创 ASP.NET Core中Get方式QueryString映射的小坑

我以为这样,映射到Dto上依然能使用默认值。不需要传的参数,swagger没有在URL上做拼接,之前没注意这个细节。直到前端给我说他用Name默认值排序没有预期的效果。后端自己写完接口后,我都是用swagger测试的。对于Get方式类似分页,过滤,排序这种字段,我喜欢加上默认值。1.让前端把需要默认值的,URL不要加上。(还是让前端感知到了默认值的事,跟他们自己显式指定区别不大了。要么就是在属性后直接赋值,要么就构造函数赋值这两种。2.我在代码或者Filter在做一层,如果是Null值就赋值成默认值。

2022-10-22 13:22:54 257

原创 .NETCore3.1升级.NET6坑点记录

NETCore3.1我Post请求正常情况下返回的是CreatedAtRoute()。到更高版本需要在services.AddControllers中设置c.SuppressAsyncSuffixInActionNames = false;(Action后缀Async)然后改用CreatedAtAction。

2022-10-20 15:07:46 424

原创 Guid做数据库主键和自增数字做主键的区别

MySQL不适合使用Guid做主键,因为InnoDB引擎默认把主键设置为聚集索引,强制的。而Guid生成的值是不连续的。SQLServer使用Guid类型作为主键,不要把主键设置为聚集索引。

2022-10-16 17:03:14 489

原创 C#/.NET 关于抛出异常

而File.Open()如果文件不存在或者没有权限读取可以抛异常,因为Open只有在满足上述条件才有意义。.NET也有很多做的好的示例,比如类型转换有int.parse和int.Tryparse两种,一般容易有异常的都有Try开头的版本。创建自己的异常类是为了能用不同的catch捕获不同的状况。大量的用到非托管资源其实非常的坑,没办法像C++那样及时的释放。而需要清晰的异常信息来保证更快的修复程序效率,可以试着创建自己的异常类。Try/finally是保证程序出异常了,依然能释放非托管资源。...

2022-08-17 00:00:00 1095

原创 C#/.NET 关于Linq比较好的做法和坑

某些查询操作会把整个集合都处理一遍,数据集过大的话,还是性能成问题,操作会产生新的数据集,内存资源占用大。lambda表达式代码访问了变量,编译器就会针对对象生成方法,实例的或者静态的。在闭包中捕获了变量,引用的对象生命周期会延长,直到最后一个引用该变量的委托变为垃圾之后,对象才标记成垃圾。多重嵌套的循环语句不容易理解意图,特别是对集合不止有循环,还有排序,分组,过滤。处理数据集的代码段,如果有修改状态的,而中途抛出了异常,会导致数据不一致。最好使用Linq这种查询语句,执行结果一样,但是代码容易理解。..

2022-08-16 00:00:00 320

原创 C#/.NET 关于泛型比较好的做法 笔记

泛型方法提供的泛型参数只需要与该方法的要求相符就行,而泛型类提供的泛型参数要满足该类定义的每一条约束。如果根据类型参数去创建实例需要保证,实例类型是否实现了IDispose接口,实现了就需要编写相关代码。25.如果不需要把类型参数所表示的对象设为实例字段,那么应该优先考虑创建泛型方法,而不是泛型类。如果在X可以转换成Y的前提下能够把C当成C,叫做该泛型对T协变。如果在Y可以转换成X的前提下能够把C当成C,叫做该泛型对T协变。.NET是2.0支持泛型的,还有很多非泛型的代码需要兼容。...

2022-08-15 00:00:00 143

原创 C#/.NET关于资源更好的做法 笔记

C#中定义了析构函数的类会在生命周期结束后,先被放进析构队列,由执行析构队列的线程去执行指令,然后才能释放。析构函数是由CLR进行调用的,如果调用析构函数的时候,通过其他类引用当前类,那么会导致析构函数已经被执行,而引用却从无到有。直接设定的初始值比起构造函数好处是以后增加构造函数,不需要在新构造函数中又加一边初始化,防止出错。在类中频繁使用相同的对象,尽量维护一个私有字段对象实例,而不是每次调用创建局部变量。过多的对象占用内存,而又频繁触发GC,GC又会挂起所有线程,导致程序效率低。...

2022-08-14 05:00:00 91

原创 C#精益求精

编译期的常量用const来声明(const可以在方法体内声明,readonly不行),常量是编译器把变量给替换成常量值,如果不同程序集都使用某个其他程序集的常量。这种写法成立,由于有多个string.Format重载,编译器只会确定重载方法是否有合适的,不会检查参数个数与序号数量是否匹配。类型不受限制,可以是随意的class。如果变量是事件处理器,多线程的环境下,有可能其他线程正好取消事件订阅,而执行判断的线程被打断了。2.多播委托,如果有返回值,前面的返回值都被丢弃,最后一个执行委托的返回值被返回。...

2022-08-13 19:23:20 295

原创 设计模式笔记,看完Head First设计模式记录的笔记

LINQ的实现可以看作是一种特殊的模板方法,将大部分的代码写好,而将部分代码通过委托的形式交给客户端。定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。通过在类结构中加入新方法,可以在解释的同时增加新的行为,例如打印的美化或者进行复杂程序验证。将一个类的接口,转换成客户期望的另一个接口。...

2022-08-07 15:30:46 155

原创 .NET7打包发布部署在Linux上

还有一种就是我这种publish的,直接cd到published目录下输入命令dotnetmymvc.dll--urls=http//ipport就可以。1.创建首先我通过dotnetnewmvc-nmymvc创建了一个mvc的Project,默认的一般都能运行。3.直接运行,这里有两种方式,一种是不publish,直接dotnetrun让CLI去编译然后运行编译后的。我自己本地有Linux的物理机,也装了VSCode,开发部署环境都有。也就简单的尝试了一下。...

2022-07-30 13:56:39 2485

原创 ubuntu 安装.NET7 preview

添加了两条变量之后,重新打开命令行,dotnet--list-sdks显示.net7preview。在ubuntu下安装.NET7preview,我是手动下载压缩包,并且配置环境变量。准备好了安装包后,一般解压就可以用了,Linux下万物皆文件。解压之后呢,我把dotnet拷贝到/usr/local目录下。通过进入用户环境变量配置下就比较方便使用。我是vi~/bashrc。...

2022-07-25 16:44:24 1230

原创 记一次.NET6连接ubuntu下RabbitMQ的报错

记一次.NET6下使用rabbitmq的错误

2022-06-26 23:03:09 170

原创 C++与C#对于接受bool变量输入的不同

对于C#来说,接收控制台输入,一般用Console静态类的Read,ReadLine等等。但是C#都只能识别成字符串来接收,由程序员自己进行转化为想要的数据类型,比如想接受bool类型的变量,只能输入false,true的字符串(不区分大小写)然后转成bool类型。如果输入的是其他的字符串再进行转换,比如0或者1则会抛出异常(当然可以使用bool.TryParse()使其捕获异常)。对于C++来说,目前学习到的cin接收bool类型的输入却是通过输入0跟非0,0即是false,非0的整数值为t.

2021-10-05 12:33:42 662

原创 记一次Ubuntu下C++用sleep错误

最近国庆在学C++,学到C++信号处理发现线程睡眠sleep函数找不到。报错信息:经过学习发现,原来Sleep是Windows下使用。那么linux下怎么办呢?首先引入头文件:#include <unistd.h>,然后使用函数usleep()....

2021-10-03 13:52:46 1521

空空如也

空空如也

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

TA关注的人

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