C#
文章平均质量分 63
AI高工
程序员,AI工程师,分享人工智能、机器学习、大模型、软件工程、游戏开发、网络、云计算
展开
-
C#知识体系
C#知识体系原创 2020-04-11 19:02:16 · 1194 阅读 · 1 评论 -
python元类与C#、Java中的反射
Python的元类和C#中的反射在概念上有一定的相似性,但它们的目的和使用方式有所不同。Python的元类:C#中的反射:相似之处:不同之处:总的来说,虽然Python的元类和C#中的反射在概念上有一定的相似性,但它们解决的问题和使用方式有所不同。元类是Python中一种强大的特性,但应该谨慎使用;反射是C#中一个实用的工具,广泛应用于各种编程场景。理解它们的区别和适用场景,可以帮助你更好地利用这些特性来解决实际问题。原创 2024-05-11 22:09:07 · 296 阅读 · 1 评论 -
Unity 打包前,通过代码对 AndroidManifest 增删改查
需要在Unity打包前,通过代码自动修改 AndroidManifest.xml 文件的内容,实现自动化一键生成,减少了生成 android studio 工程后再修改的麻烦。为了实现不同Android渠道,采用不同的 AndroidManifest 配置。首先,Unity 提供了打包前和打包后调用的接口(interface)其次,C# 提供了修改 XML 文件的库 System.Xml。最后,为了实现灵活配置,采用了 Json 文件作为配置文件。独立的 Json 文件便于管理,保存在工程特定目录。原创 2024-01-03 16:08:05 · 760 阅读 · 0 评论 -
C# 的yield return机制与用法:数据集合按需生成
通过本文我们介绍了c#中的语法,并探讨了由它带来的一些思考。我们通过一些简单的例子,展示了的使用方式,知道了迭代器来是如何按需处理大量数据。同时,我们通过分析foreach迭代和语法的本质,讲解了它们的实现原理和底层机制。好在涉及到的知识整体比较简单,仔细阅读相关实现代码的话相信会了解背后的实现原理,这里就不过多赘述了。当你遇到挑战和困难时,请不要轻易放弃。无论你面对的是什么,只要你肯努力去尝试,去探索,去追求,你一定能够克服困难,走向成功。记住,成功不是一蹴而就的,它需要我们不断努力和坚持。原创 2023-07-12 09:48:48 · 1647 阅读 · 0 评论 -
深入理解Unity的asmdef
在Unity项目的开发过程中,我们经常需要使用各种第三方库,而这些库常常在构建时会导致无法正常编译。为了避免这种问题,Unity引入了asmdef,来解决依赖管理问题。本文将从多个方面来深入阐述asmdef的使用。原创 2023-06-13 17:48:36 · 5595 阅读 · 1 评论 -
Unity串口通信、接受和发送数据、C#
1、串口简介串行接口(串口)通常指COM接口,是采用串行通信方式的扩展接口。串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。特别适用于远距离通信。查看串口:右键 我的电脑-管理-设备管理器-端口选择一个端口,双击查看属性。这里通过串口属性,可以知道以下数据:波特率:这是一个衡量符号传输速率的参数。数据位:这是衡量通信中实际数据位的参数。停止位:用于表示单个包的最后一位。原创 2023-03-30 14:50:44 · 5719 阅读 · 3 评论 -
重装系统打开Unity编辑器弹窗:sentinel key not found(h0007)
3、进入Unity安装路径;操作方法:右键Unity图标,打开文件所在位置,复制地址,回到Cmd,输入*cd *粘贴地址,回车。2、打开Cmd(Win+R键,输入cmd回车),进入Unity安装所在盘符(例如D盘,则输入D: 回车)1、删除以下路径文件:C:\ProgramData\SafeNet Sentinel。4、输入命令行:hasp_update.exe u unity-sl.v2c 回车。5、问题解决,重启Unity即可。原创 2023-02-02 14:59:43 · 902 阅读 · 0 评论 -
Socket简单学习之UDP通信
/将数据发送到这个地址上去。3:ReceriverForm(date ref point)接收二进制数据,用point 记录发送数据过来的端口和ip。2:ReceriverForm(date ref point)接收二进制数据,用point 记录发送数据过来的端口和ip。4:SentTo(date ,point) 向point地址的客户端发送数据。3:SentTo(date ,point) 向point地址的客户端发送数据。2:利用sent(date,int ,point)向point地址发送数据。原创 2023-02-01 19:10:31 · 1794 阅读 · 1 评论 -
C# 装箱和拆箱
C#语言中的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool等等,就是说所有的事物都是对象。值类型包括(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚举(enum)、结构(struct),装箱 和拆箱 是C#类型系统的核心概念,通过装箱和拆箱操作,可以轻松的实现值类型与引用类型的互相转换。拆箱就是将一个引用型对象转换成任意值型!原创 2023-01-13 17:38:09 · 2685 阅读 · 0 评论 -
源码阅读的技巧和误区
普遍存在如下几种现象: 对待工作中所使用的技术不需要阅读源码,只需在开发过程中能够熟练运用就行 看源码太费时间,而且容易忘记,如果从实际使用过程中出现的问题出发,针对性的阅读源码,其学习效率会更高效,所以平时无需看源码。 对此我有着不同的理解,容我慢慢道来。本文将从如下4个角度进行剖析: 源码阅读的必要性 源码阅读技巧 源码阅读的三种境界 源码阅读的误区 01源码阅读必要性1.1 通用型基础技术应该深入源码研究在 JAV..原创 2021-02-19 12:37:16 · 278 阅读 · 0 评论 -
Unity3d 多线程get_gameObject can only be called from the main thread
用代理封装要执行的方法。由Unity Update调用。子线程调用了主线程才可以调用的方法。原创 2022-12-14 21:15:44 · 472 阅读 · 0 评论 -
Unity线程安全:CompareBaseObjectsInternal can only be called from the main thread
在unity中我们使用多线程时。用子线程调用主线程时。用到unity的东西时就会报如下的错误。CompareBaseObjectsInternal can only be called from the main thread.Constructors and field initializers will be executed from the loading thread when loading a scene.Don’t use this function in the constructor原创 2022-12-07 09:21:03 · 337 阅读 · 0 评论 -
Unity热更方案-华佗
HybridCLR将纯AOT runtime增强为完整的runtime,使得热更新代码与AOT代码无缝工作。脚本类与AOT类在同一个运行时内,可以随意写继承、反射、多线程(volatile、ThreadStatic、Task、async)之类的代码。不需要额外写任何特殊代码、没有代码生成,也没有什么特殊限制。执行高效。实现了一个极其高效的寄存器解释器,所有指标都大幅优于其他热更新方案原创 2022-08-23 16:44:27 · 3056 阅读 · 0 评论 -
Unity 的资源加载管理方案对比
Unity资源加载管理方案对比原创 2022-08-23 16:19:48 · 1356 阅读 · 0 评论 -
游戏中的语音聊天方案
游戏中的语音聊天方案原创 2022-08-23 15:54:06 · 1931 阅读 · 0 评论 -
简述unity的模型动画功能
理解和简单使用unity的模型动画功能,以及插件。以FBX与Generic类型的骨骼蒙皮动画为主要叙述。原创 2022-06-23 09:00:52 · 1061 阅读 · 0 评论 -
Unity 设置Material、Shader的方法
设置控制materil 和 shader的几种基本方法转载 2022-06-22 13:35:52 · 5283 阅读 · 0 评论 -
内存溢出与内存泄漏
内存溢出是什么情况?内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序.原创 2022-05-15 13:15:44 · 338 阅读 · 0 评论 -
Unity编辑器扩展与本地序列化配置
编辑器扩展常用方法:using UnityEngine;using UnityEditor; public class Mybianyi : EditorWindow{ string PasswordField = ""; string m_textArea = ""; float sliders = 0; int slidera = 0; string BeginToggleGroup = "BeginToggleGroup"; bool ..原创 2022-05-06 19:57:24 · 950 阅读 · 0 评论 -
编程思想的演进
从上个世纪五十年代冯·诺依曼创造第一台计算机开始,一直到现在只有短短70年时间,从第一门计算机语言FORTRAN,到现在我们常用的C++,JAVA,PYTHON等,计算机语言的演进速度远超我们所使用的任何一门自然语言。从最早的面向机器,再到面向过程,到演化为现在我们所使用的面向对象。不变的是编程的宗旨,变化的是编程的思想。1 面向机器计算机是01的世界,最早的程序就是通过这种01机器码来控制计算机的,比如0000代表读取,0001代表保存等。理论上这才是世界上最快的语言,无需...原创 2022-05-06 09:15:09 · 497 阅读 · 0 评论 -
Unity C# using的三种用法
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/using微软官方文档,using关键字有三个主要用途:1.强制资源清理using 语句定义一个范围,在此范围的末尾将释放对象。提供可确保正确使用 IDisposable 对象的方便语法。注意使用前提:该对象必须继承了IDisposable接口,功能等同于try{}Finally{}。·2.创建别名usi..原创 2022-04-29 18:08:14 · 3317 阅读 · 0 评论 -
C#问号运算符之 可空, 三元 和 空合并
1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。例如:string str=null; 是正确的,int i=null; 编译器就会报错。为了使值类型也可为空,就可以使用可空类型,即用可空类型修饰符"?"来表示,表现形式为"T?"例如:int? 表示可空的整形,DateTime? 表示可为空的时间。T? 其实是System.Nullable(泛型结构)的缩写形式,也就意味着当你用到T?时编译器编译 时会把T?编译成System.Nullable的形.原创 2022-04-26 09:41:16 · 486 阅读 · 0 评论 -
Unity C# 和 Mono简史
一般Unity游戏开发,都使用C#作为主要开发语言。虽然Unity本身支持Unity(一种Java的扩展)和Boo(一种受Python启发的语言),但是在正常生产实践中,还是会使用C#作为主要开发语言。什么是C#?C# 是微软推出的一种基于 .NET 框架的、面向对象的高级编程语言。微软在 2000 年发布了这种语言,希望借助这种语言来取代Java,更多详细的介绍可以参看C#Wiki。为什么是C#?因为C#的跨平台特性可以解决Unity引擎的跨平台支持问题。其实确切的说,跨平台的并不是C原创 2022-04-12 23:07:16 · 5600 阅读 · 0 评论 -
C# 判空检查 Null空值传播运算符(?.)
“空值传播运算符”,《C# 本质论》中翻译为null条件操作符。在调用值为null的方法时,运行时都会抛出一个System.NullReferenceException的异常,通常以此表明程序逻辑上存在错误。考虑到在调用成员之前进行null值检查这一模式的频率很高,C# 6.0 引入了一种更为简化的null条件操作符(null-condition operator) ?.。null条件操作符在调用方法或属性之前检查操作数是否为null,如果为null,则不执行方法组。 private bo原创 2022-04-02 14:28:58 · 2095 阅读 · 0 评论 -
多线程、异步导致的时序逻辑Bug
在实际开发程序的过程中,经常会遇到一些由于时序的先后顺序,导致产生一些奇奇怪怪的问题,很多是由于多线程、异步等导致的时序逻辑Bug, 比如:消息A先到达,消息B后到达,消息A处理完成后,再处理消息B,程序就正常运行(即达到我们我们预想的结果);然而如果消息A没有处理完,就开始处理消息B,程序可能会出现我们不期望的结果。 为了避免上面问题的出现,我们可以采取将同一类消息按先后到达顺序放在同一个队列中,然后有同一个线程来处理,这样就能保证按照时序处理。...原创 2022-03-11 09:41:21 · 1125 阅读 · 0 评论 -
C#数据处理LINQ语言集成查询
(Language Intergated Query)也就是语言集成查询为什么要使用LINQ?在工程中我们少不了要定义类或者结构去储存数据,这些数据将被临时地储存在内存中,现在我们想要对其完成一些类似于查找、过滤等等常见的任务的时候,我们该如何去做呢? 我们可以自己写代码去对集合中的每个对象进行遍历,检查变量的每个字段看其是否满足条件。这样的故事已经发生太多次了,微软怎么可能容忍在C#里发生如此弱智的事情呢?于是,C#的设计者决定在C#中集成查询的语法,以最大限度地减少程序员书写类似代码的情况。原创 2022-03-10 23:18:23 · 378 阅读 · 0 评论 -
C#语法糖 可变参数 params
适用场景同一个词语可以添加多个近义词传递一个一维数组类型的参数当集合参数个数不确定的时候是使用可变参数的最佳场景举例其它string.Format也是基于params实现的,毕竟Format具体的参数依赖于前面声明的字符串的占位符个数。在翻看相关代码的时候还发现了一个ParamsArray这个类,用来包装params可变参数,简单的来说就是便于快速操作params注意:params修饰在参数的前面且参数类型得是一维数组类型params修饰的参数默认是可原创 2022-03-10 09:20:52 · 879 阅读 · 0 评论 -
C# List.Sort排序
C#中,List.Sort() 不仅为我们提供了默认的排序方法,还为我们提供了4种自定义排序的方法,通过默认排序方法,我们无需重写任何Sort()方法的实现代码,就能对单参数类型的List数据进行单一规则的排序,如果通过对这些方法进行改进我们可以轻松做到对多参数、多规则的复杂排序。默认排序排序Sort,倒序Reverse//默认是元素第一个字母按升序list.Sort();//将List里面元素顺序反转list.Reverse();//从第二个元素开始,反转4个元素//结果list.原创 2022-03-08 09:03:19 · 16976 阅读 · 1 评论 -
IEnumerator , IEnumerable 枚举器接口
IEnumerator是枚举器的意思,IEnumerable是可枚举的意思。这两个都是个接口foreach是一种语法糖,用来简化对可枚举元素的遍历代码。而被遍历的类通过实现IEnumerable接口和一个相关的IEnumerator枚举器来实现遍历功能。public class MyList : IEnumerable{ public int[] _data = new int[10] { 1, 5, 7, 9, 7, 8, 7, 8, 7, 4 }; public int原创 2022-02-17 10:30:11 · 565 阅读 · 0 评论 -
ECS双端C#游戏框架ET6:客户端的初始运行指南
搭建启动环境,启动服务器和客户端。服务端:客户端:打开范例场景init.unity,场景层级如下:init.cs首先加载UILoading界面,其加载流程大致是这样启动流程时序图:加载初始界面的几个步骤:...原创 2022-02-11 06:37:54 · 3539 阅读 · 0 评论 -
C# foreach的用法
在foreach语句中有两个限制,第一不能修改枚举成员,其次不要对集合进行删除操作。也就是如下两种方式都是错误的。 // Use "foreach" to loop an arraylist foreach( int i in arrInt ) { i++;//Can't be compiled Debug.WriteLine( i.ToString() ); } //...原创 2022-02-10 18:52:13 · 7315 阅读 · 0 评论 -
C# string split
using System.Collections;using System.Collections.Generic;using UnityEngine;public class StringSplit : MonoBehaviour{ void Start() { string str = "aaajbbbjccc"; string[] sArray = str.Split('j'); foreach (string i in ..原创 2022-02-10 15:35:23 · 432 阅读 · 0 评论 -
MongoDB在C#中的基本操作
需要说明的一点,对象保存为文档时,private成员不会保存,public和protected成员会被保存,可以添加[BsonIgnore]标签忽略掉。using System;using System.Collections.Generic;using System.Linq;using MongoDB.Bson;using MongoDB.Driver;namespace TestLambda{ class Program { static void Main() {原创 2022-02-02 07:40:09 · 1207 阅读 · 1 评论 -
C# 单例和静态类
单例与静态类的相同作用1.单例与静态类只能拥有一个实例,该实例在应用程序的整个周期中用于保持应用程序的全局状态。2.单例和静态类都可以实现线程安全。单例与静态类的区别?需要记住的是, 静态是属于C#中的一种语言功能, 而单例是一种设计模式。所以两者属于不同的领域。1.无法创建静态类的实例, 但是可以创建单个类的实例, 然后重用。2.编译器编译静态类, 在内部静态类视为抽象和密封类。3.单例的构造函数始终标记私有, 我们无法从单例类外部创建实例。4.静态类是在应用程序第一次加载进行初..原创 2022-01-30 15:25:37 · 1144 阅读 · 0 评论 -
Unity中多种单例模式的实现方式
两大类,一类是普通C# 类 的单例,二类是继承Mono的单例普通C#类:1. 普通类的单例懒汉式(首次调用的时候才实例化,非线程安全) public class GameManager { private static GameManager instance; //单例对象,全局唯一 public static GameManager GetInstance //获取接口,也可以写成函数形式 {原创 2022-01-30 15:18:25 · 3706 阅读 · 0 评论 -
关于“空”string字符串
string a = "";string b = "";string c = string.Empty;string d = string.Empty;string e = null;string f = null;等运行完后在即时窗口中用&命令查看这些变量的地址然后发现,所有变量的栈地址都不同(废话),赋值null的未分配堆空间,所以无堆地址,其他无论赋值""还是赋值string.Empty堆地址都完全一样。最终结论:赋值null不会分配堆空间,赋值""和stri.原创 2022-01-30 12:18:49 · 1094 阅读 · 0 评论 -
Rider对删除委托/事件时的提示Delegate subtraction has unpredictable result
当我们为一个委托/事件写-=的时候,ReSharper 会提示“Delegate Subtraction Has Unpredictable Result”,即“委托的减法可能出现非预期的结果”。不用担心! ReSharper警告的第一部分只适用于删除委托的列表。在你的代码中,你总是在删除一个单独的委托。第二部分是关于删除重复委托后的委托顺序。一个事件并不保证其订阅者的执行顺序,所以它也不会真正影响你。ReSharper之所以发出这个警告,是因为多播委托减法会有一些问题,它并不是完全谴责这种语言..原创 2022-01-30 12:06:21 · 218 阅读 · 0 评论 -
内存管理与GC垃圾回收机制
内存管理和 Rust 所有权 - rgb-24bit - 博客园原创 2022-01-28 09:44:44 · 573 阅读 · 0 评论 -
C#语法糖 (?) null空合并运算符对UnityEngine.Object类型不起作用
Unity对 == 运算符做了一些自以为是的反人类特殊处理。目的一:当一个MonoBehaviour有字段时,仅在编辑器中[1],我们不会将这些字段设置为 "真正的null",而是设置为 "假null "对象。我们的自定义==操作符能够检查某些东西是否是这些假空对象之一,并采取相应的行为。虽然这是一个奇特的设置,但它允许我们在假空对象中存储信息,当你对它调用一个方法时,或者当你向该对象询问一个属性时,可以给你更多的上下文信息。如果没有这个技巧,你只会得到一个NullReferenceExcepti.原创 2022-01-28 00:27:42 · 2046 阅读 · 0 评论 -
C# 将集合拆分为多个相等块
您是否有时会遇到需要将集合拆分为多个相等块的情况?以前,您必须创建自定义方法来实现此目的。在图片的第一个示例中可以看到一个简单的实现。但是,从 .NET 6 开始,有一个新的 LINQ 扩展方法可以做到这一点!您如何看待 .NET 6 中添加的新 LINQ 方法?...原创 2022-01-17 23:42:41 · 381 阅读 · 0 评论