摘要:Introduction: ※本文不是在描述旧版本Unity中mono编译器导致的foreach语句额外装箱错误 博主是一名Unity 3D游戏开发者,游戏使用C#+lua开发,最近在优化C#代码时,发现了一处使用foreach不恰当的地方,其结果是造成了每帧近3k的GC Alloc,如此高频率的G 阅读全文
posted @ 2019-03-22 15:36 Minotauros 阅读 (1447) 评论 (2) 编辑
摘要:一、JIT编译器可以通过将方法内联展开(Method Inline Expansion)来提升效率,类似C++中的内联函数(Inline Function),与C++的内联函数不同的是,C#并不支持内联函数,而是由JIT编译器在运行时自动进行; 1.对于虚方法,如果JIT编译器可以确认调用该方法时变 阅读全文
posted @ 2019-01-31 11:59 Minotauros 阅读 (1791) 评论 (0) 编辑
摘要:本想接着上一篇详解泛型接着写一篇使用泛型时需要注意的一个性能问题,但是后来想着不如将之前的详解XX系列更正为现在的效率优化XX系列,记录在工作时遇到的一些性能优化的经验和技巧,如果有什么不足,还请大家多多指出; 在使用集合时,通常为了防止装箱操作而选择List<T>、Dictionary<TKey, 阅读全文
posted @ 2018-11-30 11:24 Minotauros 阅读 (1331) 评论 (2) 编辑
摘要:在优化C#代码或对比某些API的效率时,通常需要测试某个方法的运行时间,可以通过DateTime来统计指定方法的执行时间,也可以使用命名空间System.Diagnostics中封装了高精度计时器QueryPerformanceCounter方法的Stopwatch类来统计指定方法的执行时间: 1. 阅读全文
posted @ 2018-11-08 20:29 Minotauros 阅读 (1380) 评论 (6) 编辑
摘要:占个坑。。 阅读全文
posted @ 2019-10-31 21:13 Minotauros 阅读 (11) 评论 (0) 编辑
摘要:占个坑。。 阅读全文
posted @ 2019-10-31 21:13 Minotauros 阅读 (13) 评论 (0) 编辑
摘要:一、is运算符用于判断一个对象是否可以转换为指定的类型,不会抛出异常,返回bool值用来表示是否转换成功: 当满足以下任意一种情况时转换成功: 1.转换对象是目标类型的实例; 2.转换对象是派生自目标类型的类型的实例; 3.转换对象是实现目标接口的类型的实例; 在C#7.0以上版本中支持is模式匹配 阅读全文
posted @ 2019-09-30 20:37 Minotauros 阅读 (118) 评论 (0) 编辑
摘要:一、抽象和封装是面向对象编程的基础特性,抽象用来忽略细节,在不同的层次上处理细节,封装则实现了对细节的不同程度的访问权限;即抽象允许相关信息可视化,封装用来实现所需级别的抽象; 1.根据封装的原则,命名空间可以指定其中每个类型对外部代码的可访问性,类和结构可以指定其中每个成员对外部代码的可访问性,可 阅读全文
posted @ 2019-09-29 22:36 Minotauros 阅读 (178) 评论 (0) 编辑
摘要:一、由于C#是强类型语言,变量在声明后不能重新声明为其它类型,但可以通过类型转换(Type Conversion)将符合转换条件的其它类型的变量转换为目标类型的变量,有以下几种类型的转换方式: 二.隐式转换(Implicit Conversion):该转换是一种安全的类型转换,不会导致数据丢失,因此 阅读全文
posted @ 2019-08-31 18:39 Minotauros 阅读 (243) 评论 (0) 编辑
摘要:一、C#提供对面向对象编程(Object Oriented Programming)的完整支持;类描述对象的类型,而对象是类的具体实例,创建对象的过程也被称为实例化(Instantiation);通常使用new运算符来创建对象: ※其中()实际上代表的是调用类的默认构造函数来构建类的实例; ※C#还 阅读全文
posted @ 2019-08-29 20:59 Minotauros 阅读 (126) 评论 (0) 编辑
摘要:使用编译器可以将C#代码编译为中间语言(Intermediate Language,IL)代码,中间语言是一种平台无关的指令集,最终会由CLR将中间语言字节码转换为对应平台的机器码从而执行;阅读IL代码通常可以让我们更好的了解C#的底层实现方式; ※中间语言又称为通用中间语言(Common Inte 阅读全文
posted @ 2019-07-31 14:29 Minotauros 阅读 (115) 评论 (0) 编辑
摘要:原文链接:https://jonskeet.uk/csharp/memory.html 人们在理解值类型和引用类型之间的差异时因为“值类型在栈上分配,引用类型在堆上分配”这句话造成了很多混乱。这完全是不对的,本文试图澄清这个问题。 变量中有什么? 理解.NET中内存工作方式的关键是理解变量是什么,以 阅读全文
posted @ 2019-07-27 11:35 Minotauros 阅读 (359) 评论 (0) 编辑
摘要:一、可空类型(Nullable Type)表示在值类型的正常取值范围内再加上一个null值,声明一个可空类型的标准语句如下: 例如,声明一个可空整数类型并赋值为null: 1.可空类型是泛型结构Nullable<T>的实例,其声明为:public struct Nullable<T> where T 阅读全文
posted @ 2019-06-30 22:22 Minotauros 阅读 (640) 评论 (0) 编辑
摘要:一、可以使用位于命名空间System.Threading中的Thrad类开启线程: 1.通过Thread类的静态属性CurrentThread可以获取执行当前函数所在的线程,通过实例属性ManagedThreadId可以查看当前线程的唯一标识符ID,通过实例属性Name可以获取或设置当前线程的名称; 阅读全文
posted @ 2019-06-27 11:03 Minotauros 阅读 (281) 评论 (1) 编辑