
c#
驰愿
这个作者很懒,什么都没留下…
展开
-
Unity 使用RVO2(orca)算法
动态避障算法 RVO ORCA RVO2原创 2023-01-31 12:44:27 · 3877 阅读 · 2 评论 -
c# 序列化
定义:序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入临时或持久存储区。以后,可以通过从存储区中读取或反序列化对象的状态,从新创建该对象。...原创 2020-08-20 00:52:26 · 6508 阅读 · 1 评论 -
c# 使用EF框架连接MySql
c# 使用EF连接Mysql 坑可不是一般的多!第一:有的使用EF模型时出现: 您的项目引用了最新实体框架;但是,找不到数据链接所需的与版本兼容的实体框架数据库第二:新建连接时,没有Mysql DataBase 选项。第三:使用EF模型时闪退。今天各种问题都遇到了。下面讲述一下我成功使用EF连接MySql的流程,我这里就演示CodeFirst模式。我的环境是:win7 旗舰版 + vs2017 社区版第一步: 下载 mysql-for-visualstudio, 要使用EF模型必须要这个。原创 2020-07-26 01:00:01 · 3476 阅读 · 0 评论 -
c# 根据mysql数据库生成代码
在代码中写sql代码中,经常会用到 字段名,表名。如果每次写字符串将会难以维护,我的习惯是定义一份表的字段名常量。通常也会定义一份对应该表的一个数据结构,在处理数据时便于使用。今天整了一份自动生成字段名表名常量以及根据表生成对应数据结构的工具。思路比较简单:第一步 获取数据库中的所有表名称第二步 根据表名称获取表的字段名,字段类型,注释.第三步 根据获得的表名,字段名,字段类型,注释 生成代码接下来上代码,需要的自己研究下。我这里的MySql 类是我自己包装的方便调用的 Sql语句的类原创 2020-07-26 00:20:19 · 580 阅读 · 0 评论 -
c# 数组与列表通用排序算法
只需要给出权重的算法即可调用算法完成排序, 支持List Array上代码:public static class SortHelper{/// /// 要排序的元素/// private class SortItem{public object data; public int weight;}private class SortItemComparer : IComparer<SortItem>{ public int Compare(SortIte原创 2020-07-24 18:26:35 · 174 阅读 · 0 评论 -
C# winform 选择文件夹的两种方式
方式一: 使用System.Windows.Forms.FolderBrowserDialog 类来选择文件夹示例: FolderBrowserDialog folderBrowser = new FolderBrowserDialog(); folderBrowser.SelectedPath = webpath; folderBrowser.Description = "请选择网页所在的目录"; //folderBrowse原创 2020-07-15 20:18:14 · 9357 阅读 · 5 评论 -
程序的6大原则 与设计模式
高内聚:尽可能类的每个方法只完成一件事。方法与方法之间对内的依赖程度。低耦合:减少类调用其他的类的方法。核心思想就是减少类与类之间的依赖关系。6大原则1.单一职责原则一个类就负责一个责任。高内聚一个类承担的责任越多,代码量也越多,类就越复杂,难以维护,逻辑也不清晰。2.里氏替换原则父类对象可以被子类对象替换后不影响程序的运行。子类可以扩展父类的功能,但不能改变父类原有的功能。子类可以实现父类的抽象,但不能覆盖父类的非抽象方法。子类可以增加自己特有的方法。遵守里氏替换原则让你设计的程序原创 2020-06-12 17:35:23 · 468 阅读 · 0 评论 -
多边形障碍物寻路算法
根据两点之间直线最短。可以知道最短路径的拐点(拐弯的地方)一定是凸多边形障碍物的顶点。1.那么我把所有障碍物的顶点,起点,终点 互相连接 得到的线段。就是可走路径。这里排除穿过障碍物的线段。如上图,红色点为起点,蓝色点为终点,黑色凸多边形为障碍物。那么所有可以走的路径为 12,13,14,7,8,9,10,1,0,4,15,16… 等等 这些有限线段是所有的可走路径。找到可走路径之后, 剩下的事跟A*算法一致. 开放列表中存放将要遍历的顶点,关闭列表中存放计算过的顶点,F值 = 起点到当前点的线段原创 2020-06-12 12:01:28 · 1653 阅读 · 0 评论 -
A* 算法 C# .net
当前点M:进行计算的点。开放列表:等待计算的点。封闭列表:计算过的点。路径长度:F=G+HG=起点移动到当前点的长度。H=当前点到终点的估算长度。可以简单理解为(起点与终点的直线距离,排除障碍物的影响)先把起点 置为 当前点M找到当前点可直接到达的并且不在关闭列表中的所有点,遍历所有点K做步骤2。点K如果是终点,把终点的父节点置为当前点。跳出循环执行步骤6。点K如果不在开放列表。 则把点K的父节点设置为当前点M,并且计算F值。点K如果在开放列表。则比较F值,如果本次计算的F值比之前的F原创 2020-06-11 16:37:05 · 606 阅读 · 0 评论 -
c# BeginInvoke和Invoke引发异常 参数计数不匹配
要注意BeginInvoke 和 Invoke 的第二个参数是可变参数。如果异步回调有一个参数的方法,传递null参数时要注意 可变参数的默认值是null 如果BeginInvoke(delegate,null) 这样传递参数,编译器会认为你没有传递参数。导致运行报错。 正确的传参方法是 BeginInvoke(delegate,new object[]{null})。把null 参数包装成数据...原创 2020-04-15 14:28:25 · 1678 阅读 · 0 评论 -
c# string作为参数传递时 是值拷贝还是引用拷贝
引用类型,在进行参数传递时都是传递引用的。值类型, 在进行参数传递时都是值拷贝传递的。字符串是引用类型没错。但是它是一块固定内存,每次修改都会进行拷贝处理。由于这个比较特殊,不免引发疑问,作为参数传递时。string 会不会比较特殊?我作了如下的试验:在方法中 参数abc的地址 与 Main 方法中的abc的地址是一致的,由此可见,string 类型作为参数是引用传递的!...原创 2020-04-14 16:33:12 · 2747 阅读 · 1 评论 -
c# 线程定时器 System.Threading.Timer
System.Threading.Timer 是由线程池调用的。所有的Timer对象只使用了一个线程来管理。这个线程知道下一个Timer对象在什么时候到期。下一个Timer对象到期时,线程就会唤醒,在内部调用ThreadPool 的 QueueUserWorkItem,将一个工作项添加到线程池队列中,使你的回调方法得到调用。如果回调方法的执行时间很长,计时器可能(在上个回调还没有完成的时候)再次...原创 2020-04-14 10:44:32 · 35801 阅读 · 2 评论 -
c# Task 之任务取消
CLR via 一书中这样写到创建一个 Task 时,可以将一个 CancellationToken 传递给Task的构造器,从而将这个Cancellation 和该 Task 关联起来。如果 CacellationToken 在 Task 调度前取消, Task 会被取消,永远都不会执行。但是,如果Task 已调度,那么Task 为了允许它的操作在执行期间取消,Task 的代码就必须显示支持取...原创 2020-04-13 16:52:59 · 16913 阅读 · 1 评论 -
Unity Socket网络处理
先声明用于网络链的Socket,以及用于接收网络接收数据的缓存区//用于网络链接的Socketprivate Socket _socket;//缓冲区大小private const int buffSize = 1024*1024;//用户存放接收到的网络数据private readonly byte[] packBuffer = new byte[buffSize];链接方法。...原创 2020-04-05 23:56:15 · 1451 阅读 · 0 评论 -
.net Json的几个坑
当反序列化的对象没有无参构造函数时,就会出现乱七八糟的现象据我试验的结果,没有无参数构造函数时,第一步,应该是先找json字符串中有没有与参数名相同的数值,有的话反序列化构建对象时,填入对应的参数,一旦值做为参数填入,后续反序列化流程不会再使用此值,构造完后,剩下的其他值,看对象有没有相应的名称属性,或字段,有则填入值。 …太复杂了,使用起来非常不方便,非常容易出错。 所以 所有将要使用到 J...原创 2019-09-19 18:06:31 · 249 阅读 · 0 评论 -
redis 事务
事务是一个单独隔离操作:事务中的所有命令都会被序列化、按顺序的执行。事务在执行的过程中,不会被其他客户端发送来的命令请求打断。。事务是一个原子操作: 事务中的命令要么全部被执行,要么 全部都不执行。EXEC 命令负责触发并执行事务中的所有命令:如果客户端在使用MULTI 开启一个事务之后,却因为断线而没有成功执行EXEC,那么事务中的所有命令都不会被执行。另一方面,如果客户端成功在开启事务...原创 2019-07-12 14:24:14 · 144 阅读 · 0 评论 -
rabbit ConfirmSelect引发的血案
我在发包时使用 Confirm 模式处理消息确认, 在发消息时使用了锁,在处理接收到的消息时使用了同一把锁,导致了死锁的产生。产生死锁的原因 ConfirmSelect 会等待消费者的收包事件处理完成,注意是处理完成而非收到消费者的确认信号。伪代码生产者:lock(lockobj){ 代码1 ConfirmSelect(); //开启确认模式 代码2}消费者代码...原创 2019-07-01 11:56:46 · 1243 阅读 · 1 评论 -
锁知识点
当进程多线程开发使用的锁:自旋锁:当线程获取不到锁时,就会一直尝试去获取锁。直到获取到锁为止,自旋锁中不能使用sleep代码,否则将会导致cpu无法切换回获取锁的线程,导致死锁的产生,自旋锁只适合锁住的时间很短的代码。互斥锁:当线程获取不到锁时,cpu会把锁放到等待队列中,有更多的时间去执行别的线程。直到解锁为止锁具有限制优化读写操作的作用多进程开发使用的锁:分布式锁:re...原创 2018-09-22 20:01:44 · 225 阅读 · 0 评论 -
Unity 协程的C# 实现
直接上代码:using System;using System.Collections.Generic;using System.Collections;namespace Server { /// <summary> /// 协程类 /// </summary> public sealed class Coroutine {...原创 2019-03-01 14:53:42 · 748 阅读 · 0 评论 -
C# 异步完成老板派发的任务
本次来介绍一下如何使用委托的 BeginInvoke 方法来实现异步编程先来看看异步调用的方法老板派发给我count个任务。我使用printNum来完成这些个任务。static void printNum(int count){ Debug.Log("员工:做事去咯!" + Thread.CurrentThread.ManagedThreadId); for(int i=0;i<...原创 2019-03-28 16:37:08 · 395 阅读 · 0 评论 -
彻底弄懂字符集编码
字符集:字符集是一个字符的集合,每个数字对应一个字符。字符编码: 编码是字符的存储方案。比如说:ASCII字符集 就是ASCII码表, 如数字97对应字母a编码呢,就是如何存储这个97,你可以使用一个字节来存你还可以使用两个字节来存你还可以使用四个字节来存这下终于搞明白了 原来字符集和编码不是一个东西。字符集有ASCII、GB2312、BIG5、GB18030、Unicode。...原创 2019-04-02 14:55:36 · 1989 阅读 · 0 评论 -
c# 闭包探究
闭包: 闭包是能够读取其他函数内部变量的函数c#的实现是使用lambda表达式先来尝试一下:Console.WriteLine("begin");for(int i=0,j=0;i<10;i++,j++){ Action action = ()=>{ Thread.Sleep(10); Console.WriteLine("i:"+i+",j:" + j...原创 2019-04-08 11:19:41 · 201 阅读 · 0 评论 -
浮点值运算不准确,特别注意
可以看到 2222 没有输出数值 b 不是0 而是 -7.450581e -9猜想有可能是float 精度太低了,我换成double 试下结果还是一样,只是小数位数多了一些如果要保证浮点值运算准确必须使用 decimal...原创 2019-04-15 19:36:27 · 632 阅读 · 0 评论 -
c# StackExchange.Redis常用API
String 字符串StringSet:1.设置一个String值2.设置多个String值,要么都设置成功,要么都失败! 非常有用StringSetRange:1.从偏移量offset 开始 使用 value 填充。 如果原来的长度小于offset 中间使用’\0’字符填充(注意,c# 使用 '\0’字符结尾,这种情况导致替换后的字符根本无法显示出来。) 返回值是替换后的字符串长度例...原创 2019-04-21 23:00:31 · 4896 阅读 · 0 评论 -
c# 使用await 与 async 实现异步编程
await : await 运算符只能用于async标记的异步方法中。async :关键字只能标记返回值为void Task Task 的方法。普通方法:可以看到 Task 中的方法在子线程执行,其他都在主线程。会阻塞等待log的执行。加上async关键字:和普通方法执行一模一样,这async白加了。再用上 await 试试可以观察到 加上 await后, log方法执行立即返...原创 2019-04-18 11:09:02 · 845 阅读 · 0 评论 -
c# 枚举
定义:枚举: 是一组命名整型常量 (一组常量表示值可以重复! )枚举可以显示的声明枚举对应的整型类型,隐式是int。显示的声明public enum Days : byte{ default = 1, Sun = 1, Mon = 2, tue = 4, Wed = 8, thu = 16, Fri = 32, Sat = 64 };...原创 2019-04-20 11:54:48 · 3323 阅读 · 0 评论 -
c# StackExchange.Redis的常用数据类型
一、CommandFlags 枚举None = 0; //默认HighPriority = 1; //不用了,废弃FireAndForget = 2; //对结果不感兴趣,调用者将会立即收到默认值PreferMaster = 0; //如果主服务器可用,则应在主服务器上执行此操作,但可以执行读操作DemandMaster = 4; //此操作只应在[主站]上执行Pre...原创 2019-04-20 14:28:26 · 1786 阅读 · 0 评论 -
C# 读取XML配置帮助类
每次写个小程序都要为程序写个读取配置类,今天整理了一个通用读取XML配置类。终于不用在配置上浪费时间了。利用反射把读取到的XML内容装载到实例中,支持 基本数据类型,结构体,一维数组。不支持列表,字典等复杂的集合。使用 LoadConfiguration 加载配置有些功能还未完成,忽略的字段, 默认值, 必须要有的配置等等using System;using System.Xml;us...原创 2019-06-25 14:17:04 · 847 阅读 · 0 评论 -
c# rabbitMQ 基本应用
链接rabbit连接rabbit声明交换机声明消息队列/删除消息队列绑定队列/交换机发送消息接收消息事件功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowc...原创 2019-06-22 14:13:17 · 2888 阅读 · 1 评论 -
c# Rabbit 消息确认机制
如何保证消息一定被消费者接收?如果,发送成功 + 接收成功 那么就能保证消息一定被消费者接收。有些时候,我们希望消息被及时处理(客户端及时响应),那么应该再加上消息超时机制。当消息处理超时时提示玩家服务器繁忙(这种情况应该很少,还是可以接受的)发送确认使用 AMQP事务 来确认消息发送//开启事务channel.TxSelect();//事务提交channel.TxCommit()...原创 2019-06-22 17:36:15 · 1063 阅读 · 0 评论 -
vs studio 类文件的默认格式
vs 默认格式文件是 Class.cs默认安装情况下的路径:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\ItemTemplates\CSharp\Code\2052\Class示例/******************************** * * 作者:作者名称 * 创建时...原创 2019-06-24 13:50:34 · 964 阅读 · 0 评论 -
c# 监听http请求
HttpListener 类属性AuthenticationSchemes验证身份的类型: 默认是匿名认证, 暂时还不知道用法AuthenticationSchemeSelectorDelegate用户身份验证委托IsListening获取HttpListener是否启动,Start() 启动服务IsSupported获取当前操作系统可不可以使用 HttpLi...原创 2018-07-30 16:05:44 · 4121 阅读 · 0 评论