
C#高级
文章平均质量分 85
类人_猿
游戏开发人员,时不时会分享游戏的一些知识,感谢大家支持!
展开
-
Unity中Stack<T>用法以及删除Stack<GameObject>的方法
因为之前很少使用Stack这个表,然后在做对象池的时候用了一下然后发现我的对象有时候无法删除,然后这里我分享一下Stack的用法和删除方式。原创 2025-03-06 15:00:24 · 459 阅读 · 0 评论 -
C#中类的反射以及调用小妙招
最近看到原来同事写的代码感叹了一下,优化这个东西确实是永无止境的,其实就是不了解类的反射和返回值的使用。优化永无止境。原创 2024-07-02 15:03:02 · 562 阅读 · 0 评论 -
进程、线程与协程
一听到进程、线程与协程第一时间想起以前大学时候老师提到过的必考题,之前可能只是背过而已,没有真正理解,这里我用我参加工作的经验分享一下我对这块的理解,下面这个图只是对于进程、线程与协程的包含图,不涉及进程线程中包含的其他堆栈等。原创 2024-01-07 12:50:43 · 962 阅读 · 0 评论 -
ArrayList底层实现
之前在网上看到过一个面试题就是ArrayList和List< Int>的区别,正好借着这个的区别下面说一下ArrayList的底层是如何实现的。做程序时间长了越来越发现基础能决定自己的程序之路走多远,现在对这句话深信不疑,所有的底层实际上都是对我们代码基本工地的一种考察,包括算法也好,数据结构也好,在.net 程序集中的代码实际上就是用到了这些知识,只不过他们在一步一步优化最终封装成了程序集。原创 2024-01-07 12:48:02 · 864 阅读 · 0 评论 -
C#集合类型总结和性能分析
这里有不太明白FCL的可以去我之前总结的一片文章.NET中的 FCL(Framework Class Library)我们平时使用的各种类库都包含在这里,它其中还包含BCL基础类库,如IO,String,Net等。这里我们把集合单独拎出来说一下,所有的集合都是继承自。集合总体可以分为以下几类:关联/非关联型集合,顺序/随机访问集合,顺序/无序集合,泛型/非泛型集合,线程集合。原创 2024-01-07 12:45:33 · 1061 阅读 · 0 评论 -
大端和小端传输字节序
在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定,可以通过sizeof来获取不同类型在内存中占用的字节数。例如在C语言中,一个类型为int的变量n,如果其存储的首个字节的地址为0x1000,那么剩余3个字节地址将存储在0x1001~0x1003。文件的也会存储汉字,当然也要进行编码。如果在网络通讯中,涉及例如UTF16这样区分大小端的编码,除非按网络协议要求采用大端模式是,否则也要事先约定好,或者在数据包中标识好使用的字节序模式。原创 2024-01-03 10:17:34 · 1090 阅读 · 0 评论 -
简单工厂设计模式(计算器实例优化)
本文内容引用自《大话这设计模式》这本书第一章节简单工厂设计模式,供自己提高代码水平使用。案例也同样采用计算器功能实现方式展开实现功能---->封装---->继承---->多态---->面向对象巧妙的使用面向对象的封装继承和多态会让我们后期的维护节约不少时间,提高了开发的效率,当我们将代码移植到别的平台的时候,我们只需要将业务层Operation 和 OperationFactory移植即可方便调用。原创 2023-12-28 20:49:16 · 1053 阅读 · 0 评论 -
3D动态路障生成
上一篇文章介绍了Mathf.Lerp的底层实现原理,这里介绍一下跑酷类游戏的动态路障生成是如何实现的。动态路障其实比较好生成,但是难点在哪里,如果都是平面或者都是没有转弯的话还是比较好实现的,如果动态路障的实现遇到了有上坡下坡或者有转弯的地方我们如何去处理这些拐角点和上下坡的旋转和位置呢?本片文章主要讲解Mathf.Lerp()的用法,如果有不明白的可以看我上一篇文章。原创 2023-12-28 20:39:50 · 1247 阅读 · 0 评论 -
WindowForm实现下载功能,用于软件自动更新
先上图:下载完成后删除之前应用再将下载的包解压保持里面的名字都不变(有快捷方式的情况,不然名子变了就找不到了)这样就完成了更新的目的,**注意:**这里不是热更新方案,热更新指的是在程序内部将资源、逻辑替换这里用到的工具比较多,我都封装了工具类,WindowForm的控件拖拽和事件处理我就不说了,去官网可以查到点击事件和Label的案例。原创 2023-12-28 20:39:00 · 1043 阅读 · 0 评论 -
.Net FrameWork总结
针对大部分应用的开发人员来说,可能对.net framework都耳熟能详,对我来说可能一听就知道但是具体到底是个什么东西我确实不太明确,开发块两年了发现自己只是针对Unity的C#开发,实则对.Net FrameWork没有一个真正的了解,所以这里针对.Net Framework这个无数前辈的经验和基类开发出来的框架,做一个深度的学习和了解。原创 2023-12-28 20:37:13 · 1521 阅读 · 0 评论 -
深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第六节 理解垃圾回收GC,提搞程序性能
虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。这一节我们将介绍垃圾回收机制GC以及一些提搞程序性能的技巧。一些良好的操作可以提高程序的性能:1.清理。不要打开资源而不关闭它。关闭所有你打开的连接。尽可能快的清理所有非托管资源。一般规则:使用非托管对象,初始化越晚越好,清理越早越好。2.不要过度引用。合理使用引用对象。原创 2023-12-27 10:05:29 · 575 阅读 · 0 评论 -
深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复
虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。这一节我们将介绍引用类型变量在堆中存储时会产生的问题,同时介绍怎么样使用克隆接口ICloneable去修复这种问题。在实际工作中,当我们需要复制引用类型变量时,我们最好让它实现ICloneable接口。这样可以让引用类型模仿值类型的使用,从而防止意外的错误产生。原创 2023-12-27 10:04:48 · 520 阅读 · 0 评论 -
深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 2
虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。继续上篇未完成的“参数传递对堆栈的影响”。我们已经演示了参数传递是怎么在内在中处理的。在接下来的文章里,存储在栈中的引用变量会产生什么情况以及怎么解决对象复制带来的问题。原创 2023-12-27 10:04:15 · 467 阅读 · 0 评论 -
深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1
虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。这篇文章我们将介绍一些方法参数传递行为在堆与栈中的影响。前几节我们介绍了堆与栈的基本工作原理,程序执行时值类型与引用类型在堆栈中的存储。另外,我们已经介绍了一些关于指针的基本知识。这一节中参数传递对堆栈的影响很重要,下面会慢慢道来。原创 2023-12-27 10:03:39 · 502 阅读 · 0 评论 -
深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型
虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。本文将介绍值类型与引用类型在堆栈里的基本存储原理。希望这篇文章能帮助你更好的理解值类型变量与引用类型变量的不同,同时理解什么是指针,什么时候用到指针。以后的文章里会更深入的介绍C#内存管理并详细阐述方法参数。原创 2023-12-27 10:02:54 · 630 阅读 · 0 评论 -
深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理
虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。这一节介绍栈的基本工作原理。栈可以想像成一个严格顺序执行的序列,不允许跳跃穿插访问。栈有自我清理功能。本文以执行一个简单C#方法为例阐述了栈的基本工作原理。下一节继续介绍堆栈工作原理以及一个更复杂一些的例子。原创 2023-12-27 10:02:20 · 490 阅读 · 0 评论 -
深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈
Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。堆与栈,并且他们都会帮助我们更好的运行程序。堆与栈寄存在电脑的操作内存中,并包含我们需要的信息使整个程序运行正常。原创 2023-12-27 10:01:33 · 505 阅读 · 0 评论 -
字符串用法总结
在 C# 中,您可以使用字符数组来表示字符串,但是,更常见的做法是使用 string 关键字来声明一个字符串变量。string 关键字是 System.String 类的别名。上面的方法列表并不详尽,请访问 MSDN 库,查看完整的方法列表和 String 类构造函数。String 类有许多方法用于 string 对象的操作。原创 2023-12-26 09:44:41 · 1063 阅读 · 0 评论 -
dynamic与反射补充
get;set;get;set;Age = age;} } [ InfoAttribute("英雄类名" , 255) , InfoAttribute("英雄装备" , 1024) ] public class HeroInfo {原创 2023-12-26 09:44:06 · 386 阅读 · 0 评论 -
C#索引器
就像属性(property),您可使用 get 和 set 访问器来定义索引器。但是,属性返回或设置一个特定的数据成员,而索引器返回或设置对象实例的一个特定值。换句话说,它把实例数据分为更小的部分,并索引每个部分,获取或设置每个部分。当您为类定义一个索引器时,该类的行为就会像一个 虚拟数组(virtual array) 一样。索引器声明的时候也可带有多个参数,且每个参数可以是不同的类型。C# 允许索引器可以是其他类型,例如,字符串类型。索引器定义的时候不带有名称,但带有 this 关键字,它指向对象实例。原创 2023-12-26 09:43:28 · 878 阅读 · 0 评论 -
C# 委托(Delegate)
一旦声明了委托类型,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。一个合并委托调用它所合并的两个委托。上面的委托可被用于引用任何一个带有一个单一的 string 参数的方法,并返回一个 int 类型变量。下面的实例演示了委托的声明、实例化和使用,该委托可用于引用带有一个整型参数的方法,并返回一个整型值。委托声明决定了可由该委托引用的方法。原创 2023-12-26 09:42:50 · 434 阅读 · 0 评论 -
C# 事件(Event)
事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。其他接受该事件的类被称为 订阅器(subscriber) 类。在发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)。发布器(publisher)类的对象调用这个事件,并通知其他的对象。上面的代码定义了一个名为 BoilerLogHandler 的委托和一个名为 BoilerEventLog 的事件,该事件在生成的时候会调用委托。在类的内部声明事件,首先必须声明该事件的委托类型。原创 2023-12-26 09:42:08 · 407 阅读 · 0 评论 -
C# 不安全代码(指针)
当一个代码块使用 unsafe 修饰符标记时,C# 允许在函数中使用指针变量。不安全代码或非托管代码是指使用了指针变量的代码块。指针 是值为另一个变量的地址的变量,即,内存位置的直接地址。就像其他变量或常量,必须在使用指针存储其他变量地址之前声明指针。个人认为:在C#中当我们定义变量时,其内部构造函数已经将指针自动定义好,估计是为了防止开发人员定义出错或者分配问题。指针变量声明的一般形式为:下面是指针类型声明的实例:在同一个声明中声明多个指针时,星号 * 仅与基础类型一起写入;而不是用作每个指针名称的前原创 2023-12-26 09:40:45 · 1196 阅读 · 0 评论 -
C#多线程(补充)
但是通常来说,应当慎重使用Abort()方法,如果在当前线程中抛出该异常,其结果是可预测的,但是对于其他线程,它会中断任何正在执行的代码,有可能中断静态对象的生成,造成不可预测的结果。Task类可以获取线程的返回值,也可以定义连续的任务——在一个任务结束结束后开启下一个任务,还可以在层次结构中安排任务,在父任务中可以创建子任务,这样就创建了一种依赖关系,如果父任务被取消,子任务也随之取消。调用Task类的RunSynchronously()方法,可以实现同步调用,直接在当前线程上调用该任务。原创 2023-12-26 09:38:27 · 525 阅读 · 0 评论 -
c#多线程
总结一下同步方法和异步方法的区别:1、同步方法由于主线程忙于计算,所以会卡住界面。异步方法由于主线程执行完了,其他计算任务交给子线程去执行,所以不会卡住界面,用户体验性好。2、同步方法由于只有一个线程在计算,所以执行速度慢。异步方法由多个线程并发运算,所以执行速度快,但并不是线性增长的(资源可能不够)。多线程也不是越多越好,只有多个独立的任务同时运行,才能加快速度。3、同步方法是有序的。异步多线程是无序的:启动无序,执行时间不确定,所以结束也是无序的。原创 2023-12-26 09:36:49 · 2952 阅读 · 0 评论 -
Unity中获取时间戳、日期、时间、毫秒、秒以相互转换、自定义格式时间
这里附带一个时间戳和时间转换的网址这里其实还有很多中方式,上面知识其中的一些,基本是够用了,欢迎评论区补充。原创 2023-11-01 00:13:58 · 6992 阅读 · 0 评论 -
从两个数组中寻找相同的值
【代码】从两个数组中寻找相同的值。原创 2023-10-09 13:48:17 · 546 阅读 · 1 评论 -
C#6新特性
C#6新特性在C#6中有一个新的C#编译器。它完成源码的清理。现在自定义程序也可以使用编译器管道的特性,并使用Visual Studio的许多特性。这个新的C#编译器平台允许用许多新特性改进C#。虽然这些特性都没有LINQ或async关键字影响大,但许多改进都提高了开发人员的效率。C#6有哪些变化?0.3.1 静态的using声明C# 5using System;Console.Wr...原创 2019-11-05 16:36:13 · 727 阅读 · 1 评论 -
C#中的Attribute详解(下)
一、Attribute本质从上篇里我们可以看到,Attribute似乎总跟public、static这些关键字(Keyword)出现在一起。莫非使用了Attribute就相当于定义了新的修饰符(Modifier)吗?让我们一窥究竟吧!示例代码如下:#define Guousing System;using System.Collections.Generic;using System....原创 2019-10-10 13:37:02 · 960 阅读 · 1 评论 -
C# 反射
一、补充这里补充一个特性的知识,在之前的特性里忘记提了Obsolete这个预定义特性标记了不应被使用的程序实体。它可以让您通知编译器丢弃某个特定的目标元素。例如,当一个新方法被用在一个类中,但是您仍然想要保持类中的旧方法,您可以通过显示一个应该使用新方法,而不是旧方法的消息,来把它标记为 obsolete(过时的)。规定该特性的语法如下:[Obsolete( message)]...原创 2019-10-10 16:09:13 · 458 阅读 · 1 评论 -
dynamic动态类与反射
一、dynamicdynamic是FrameWork4.0的新特性。dynamic的出现让C#具有了弱语言类型的特性。编译器在编译的时候不在对类型进行检查,编译器默认dynamic对象支持你想要的任何特性。比如,计时你对GetDynamicObject方法返回的对象一无所知,你也可以像如下那样进行代码的调试,编译器不会报错:dynamic dynamicObject = GetDynamicO...原创 2019-10-10 18:29:35 · 1065 阅读 · 0 评论 -
C#中的Attribute详解(上)
一、Attribute是什么Attribute是一种可由用户自有定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标,修饰符(比如private、public、static、override、virtual等等)是C#语言本身的关键字。简单地说,Attribute就是一种“附着物”——就像牡蛎吸附在船底或礁石上一样。这些附着物的作用是为它们的附着体追加上一些额外的信息(这些信息...原创 2019-10-10 13:27:36 · 2547 阅读 · 1 评论