性能测试 先放结果,经过多次性能测试并取得平均值: 明确类型的委托:执行时间:41, 内存消耗:64120 不明确类型的委托:执行时间:6339,内存消耗:1524224 通过反射Invoke执行:执行时间:1087,内存消耗:4344552 明确类型的委托 委托作为C#特殊类型,在明确委托类型下编译器则会特殊照顾,在委托类中生成隐藏的函数,如System.Action<T>的Invoke函数: .method public hidebysig newslot virtual instan…
性能测试 先放结果,经过多次性能测试并取得平均值: 明确类型的委托:执行时间:41, 内存消耗:64120 不明确类型的委托:执行时间:6339,内存消耗:1524224 通过反射Invoke执行:执行时间:1087,内存消耗:4344552 明确类型的委托 委托作为C#特殊类型,在明确委托类型下编译器则会特殊照顾,在委托类中生成隐藏的函数,如System.Action<T>的Invoke函数: .method public hidebysig newslot virtual instan…
C与C#的交互 在C#执行C编写的DLL时可能会出现很多问题,而绝大部分问题都出自数据封装传送上,接下来总结了本次交互实验。 环境使用MSVC2019,使用__declspec(dllexport)作为DLL导出关键字,使用__stdcall作为调用协议。 为了更方便使用,声明两个宏:(WINAPI就是__stdcall,来自于windows.h) #define DLLEXPORT __declspec(dllexport) #define CALLAPI WINAPI C#中使用char*和sbyte*等指针使…
通过这种方式可以直接对接口实例化了(伪),动态的通过委托来实现接口,匿名类型是在运行时动态构建的。 实现思路: 使用AssemblyBuilder、TypeBuilder构建类型,并用FieldBuilder构建一个字典字段<String, Delegate>,用来保存函数名和匿名函数,MethodBuilder构建方法并使用IL流填充,调用保存的匿名函数表中的函数。 构建动态类型的方法要求传入一个<String, Delegate>函数字典,可以使用字典的初始化器来初始化匿名函数来达到实现…
在写关于二进制文件操作程序的时候,经常要去解析文件头,在C++中我通常是使用Stream把文件读取进来后直接将二进制数据拷贝到一个文件头结构体的内存中(memcpy,此处要注意内存对齐的问题),但在C#中没有这个函数,就自己实现了个。整体来说比较麻烦,我也没想到什么其他的好办法,如果有请给我留言。 public unsafe class Unmanaged { public static T CreateStructByBytes<T>(byte[] bytes) where T : unmanaged…
扩展方法可以使对象增加额外的“看似是成员”的方法。 普通的实例类型定义: public class InstanceClass { public int a = 3; public void instanceMethod() { this.a = 122; } } 扩展方法的定义: public static class InstanceClassExt { public static void Ext(this InstanceClass _this) { _this.a = 5; } } 分别对成员实例方法和扩…
无论是System.Draw.Color还是UnityEngine.Color对颜色操作的功能还是太少了,我们在用ps等调色面板使用的都是0-255范围的颜色值,但在图形层却使用的是0-1的浮点数,所以自己封了个支持多种Color操作的类型。 大写的RGB代表着0~255的整数。 小写rgb的范围是0~1的浮点数。 浮点转换整形使用四舍六入五求偶。 RGB转HSV公式: R' = R/255 G' = G/255 B' = B/255 Cmax = max(R', G', B') Cmin = min(R', G'…
在程序编写过程中List的使用频率是相当之高,高过了数组,和Dictionary并起成为dotNet中的两大容器,但也只是会用而已,并不清楚具体的原理,早期我认为List内部是由链表实现的,但实际上并不是那样,本次查看了源码,对常用的基础容易有一定的了解。因ArrayList和List基本相同,所以先对ArrayList剖析,再来对比与List的不同。 数组在声明时就需要确认长度以便申请内存,在内存中是连续并且长度是固定的,索引速度上肯定是最快的,赋值与修改也非常简单,但因长度固定,插入和删除是个比较麻烦的事情,为…
不引入即可使用 using的三种用法其一就是创建别名,给静态类创建别名,例 using File = System.IO.File; 这样即使不引入System.IO命名空间,也不用输入System.IO.File的全名,可以直接使用File调用。 解决二义性 可以用别名来覆盖当前文档中的类型,例如进行Unity开发的时候可能会出现System.Object和UnityEngine.Object冲突的情况,这时就可以使用using来制定默认的Object是哪个命名空间下的。 using Object = Unity…
在C#中委托是个非常好用的东西,可以声明event事件,而且只需要+=即可订阅,制作类库作为内外的通信是很方便的,但是Java中却没有,但是可以使用接口来实现委托以及事件订阅的功能。 还有一部分人觉得在C#中使用委托可能会使代码的可读性下降,也推荐在C#中使用接口来实现该功能。 以下的代码使用C#写的,Java中也同样适用,但是Java一个类文件不能存在多个公共类,所以需要把每个文件分开写。 //接口的声明 public interface ICustomInterface { void CustomState(C…
首先要保证电脑中要安装有.Net Framework 他的位置在C:\Windows\Microsoft.NET\Framework\版本号 目前最常用的版本是.Net4.0,也是xp可以支持的最高版本,同时也是win10自带的版本,而且很多软件也都需要使用该运行库,所以基本每个电脑都有安装。 在C:\Windows\Microsoft.NET\Framework\v4.0.30319 的文件夹目录下很多文件,其中 csc 为C#(csharp)编译器,vbc为vbNet编译器。 在控制台中输入vbc可以获得帮助 …
JomiXedYu
一名游戏玩家。