当前位置: 首页 > news >正文

C#基础(持续更新中)

一、复杂数据类型

(一)枚举

它是一个被命名的整型常量的集合,一般用来表示状态、类型等等。
1、申明枚举
命名规范 枚举名 以E或者E_开头
声明在namespace语句块中(常用),也可以在class语句中,struct语句块中
注意:枚举不能在函数语句块中申明

enum E_自定义枚举名{ 自定义枚举项名1, 自定义枚举项名2, 自定义枚举项名3, }

2、申明枚举变量
自定义的枚举类型 变量名 = 默认值;(自定义枚举类型.枚举项)

E_PlayerType playerType = E_PlayerType.Main; if(playType == E_PlayerType.Main){ Console.WriteLine("主玩家逻辑"); }else if(E_PlayType == E_PlayType.Other){ Console.WriteLine("其它玩家逻辑"); }

3、枚举的类型转换
枚举和int互转
枚举可以直接强转成int,int转枚举可以直接赋值

//枚举转int int i = (int)playType; //int转枚举 playType = 0;

枚举和string互转
Parse后 第一个参数:你要转为的是哪个枚举类型 第二个参数:用于转换的对应枚举项的字符串
转换完成后 是一个通用的类型 我们需要用括号强转成我们想要的目标枚举类型

//枚举转string string str = playType.ToString(); //string转枚举 playType = (E_PlayType)Enum.Parse(typeof(E_PlayerType),"Other");

4、枚举的作用
在游戏开发中,对象很多时候 会有很多的状态
比如一个玩家 有一个动作状态 我们需要用一个变量或标识 来表示当前玩家处于的是哪种状态
综合考虑 可能会使用int来表示他的状态
1行走 2待机 3跑步 4跳跃 ......等等
枚举可以帮助我们 清晰的分清楚状态的含义(提升代码的可读性)
5、枚举练习题

定义QQ状态枚举,并提示用户选择一个在线状态,我们接受输入数字,并将其转换成枚举类型

using System; namespace Systeam01 { /// <summary> /// QQ状态枚举 /// </summary> enum E_QQType { /// <summary> /// QQ状态 /// </summary> Online, Leave, Busy, Invisible, } class Program { static void Main(String[] args) { Console.WriteLine("请输入QQ状态(0在线,1离开,2忙,3隐身)"); //ReadLine接收字符串类型,需要强转成int类型 int type = int.Parse(Console.ReadLine()); //int类型强转枚举类型 E_QQType qqType = (E_QQType)type; Console.WriteLine(qqType); } } }

千问给出代优码化
int.Parse 会抛出异常(如输入非数字字符串)。更安全的做法是使用 int.TryParse:

Console.WriteLine("请输入QQ状态(0在线,1离开,2忙,3隐身)"); // 定义一个变量来接收转换后的结果 int type; // 尝试转换:如果用户输入的是数字,返回 true 并赋值给 type;否则返回 false if (int.TryParse(Console.ReadLine(), out type)) { // 转换成功,进行强转枚举 E_QQType qqType = (E_QQType)type; Console.WriteLine("你选择的状态是:" + qqType); } else { // 转换失败,给用户一个友好的提示 Console.WriteLine("输入格式错误,请输入数字!"); }

(二)数组

数组是存储一组相同类型数据的集合
1、数组的申明
变量类型[ ] 数组名;
变量类型[ ]数组名 = new 变量类型[数组长度];
变量类型[ ]数组名 = new 变量类型[数组长度]{内容1,2,3,......};
变量类型[ ]数组名 = new 变量类型[ ]{内容1,2,3,......};
变量类型[ ]数组名 = {内容1,2,3,......};
2、数组的使用
数组长度:数组变量名.length
获取数组中的元素:数组中的下标和索引是从0开始的,范围时0~length - 1;
修改数组中的元素:直接赋值,注意数据类型
遍历数组:用for循环遍历
增加数组中的元素: 数组初始化后是不能够直接添加新元素的,需要新建一个数组,将原数组内容赋值给新数组。
删除数组的元素:原理同上。
查找数组中的元素:遍历数组,用if循环判断,最后返回i。

(三)二维数组

使用两个下标(索引) 行标和列标来确定元素的数组
1、二维数组的申明
变量类型[ , ] 二维数组名;
变量类型[ , ] 二维数组名 = new 变量类型 [ 行,列 ];
变量类型[ , ] 二维数组名 = new 变量类型 [ 行,列 ]{{0行内容1,2,3,...},{1行内容1,2,3,...},{2行内容1,2,3,...},...};
变量类型[ , ] 二维数组名 = new 变量类型 [ , ]{{0行内容1,2,3,...},{1行内容1,2,3,...},{2行内容1,2,3,...},...};
变量类型[ , ] 二维数组名 = {{0行内容1,2,3,...},{1行内容1,2,3,...},{2行内容1,2,3,...},...};
2、二维数组的使用
二维数组的长度:

//得到多少行 Console.WriteLine(array.GetLength(0)); //得到多少列 Console.WriteLine(array.GetLength(1));

获得二维数组的元素:第一个元素索引是0,最后一个元素索引是长度-1;
修改元素:索引位置后直接赋值;
遍历二维数组:

for(int i = 0; i < array.GetLength(0); i++){ for(int = j; j < array.GetLength(1);j++){ Console.WriteLine(array[i,j]); } }

增加或删除数组中的元素:把数据搬进新数组;
查找数组中的元素:遍历;

(四)交错数组

交错数组是数组的数组,每个维度的数量可以不同
1、交错数组的声明
变量类型[ ] [ ] 交错数组名;
变量类型[ ] [ ] 交错数组名 = new 变量类型[行数][ ];
变量类型[ ] [ ] 交错数组名 = new 变量类型[行数][ ]{一维数组1,一维数组2,......};(内部一维数组的数据类型要和交错数组数据类型相同)
变量类型[ ] [ ] 交错数组名 = new 变量类型[ ][ ]{一维数组1,一维数组2,......};
变量类型[ ] [ ] 交错数组名 = {一维数组1,一维数组2,......};
2、交错数组的使用
数组的长度:

//行数 Console.WriteLine(array.GetLength(0)); //某一行的列数 Console.Write(array[0].Length);

获取交错数组中的元素:

Console.WriteLine(array[i][j]);

修改元素:索引后赋值
变量交错数组

for(int i = 0; i < GetLength(0); i++){ for(j = 0; j < array[i].Length; j++){ Console.WriteLine(array[i][j] + " "); } Console.WriteLine(); }

二、值类型和引用类型

(一)值类型和引用类型的区别

引用类型:string, 数组, 类;
值类型:除去string和数组之外学习到的其它数据类型(int,float,...), 结构体;
1、使用上的区别
值类型 在相互赋值时 把内容拷贝给了对方 它变我不变
引用类型 的相互赋值 时 让两者指向同一个值 它变我也变
2、为什么会有区别
值类型 和 引用类型 存储的内存区域是不同的 存储方式是不同的
值类型存储在 栈空间 —— 系统分配,自动回收,小而快
引用类型 存储在 堆空间 —— 手动申请和释放,大而慢

(二)特殊引用类型string

string非常特殊 它具备 值类型的特征 它变我不变

string str1 = "123"; string str2 = str1; str2 = "321"; Console.WriteLine(str1); Console.WriteLine(str2); //输出结果: 123 321

string重新赋值时 会在堆中重新分配空间
缺点:频繁的改变string 重新赋值 会产生 内存垃圾
优化替代方案 在C#核心中进行讲解

三、函数

http://www.jsqmd.com/news/767813/

相关文章:

  • Python初学者项目练习9--对简单列表元素排序
  • 解决ZYNQ裸机网络扩展难题:为LWIP库添加自定义PHY驱动与SDK配置界面
  • Windows系统光标深度替换:INF方案实现macOS指针移植与优化
  • AI编码助手统一配置工具agent-dotfiles:告别重复配置,实现规则与技能一键同步
  • BrowserClaw:基于Puppeteer与Playwright的浏览器自动化与数据抓取实践
  • AI工具搭建自动化视频生成图像缩放
  • ChatGPT文档格式化指令:打造Google Docs无缝协作的AI写作规范
  • GRADFILTERING:基于梯度信噪比的指令调优数据筛选方法
  • 别再死记硬背async/await了!用Playwright+Python写自动化脚本,这3个坑我帮你踩过了
  • 千问 LeetCode 2127.参加会议的最多员工数 public int maximumInvitations(int[] favorite)
  • 解释器模式是行为型设计模式的一种,其核心思想是给定一个语言,定义它的文法的一种表示
  • STM32G431RBT6的HAL库避坑指南:蓝桥杯嵌入式那些CubeMX没告诉你的细节
  • 构建本地化音视频转录分析平台:Whisper+Ollama+Meilisearch实战
  • SolidGPT实战指南:基于语义搜索的代码与文档智能问答系统
  • 避坑指南:SAP固定资产配置里,记账码70和31千万别乱选!附SPRO完整路径
  • 想在Win10任务栏显示秒数?试试用StartAllBack配合注册表修改(附详细步骤)
  • 【Redis】Redis——过期键删除策略、内存淘汰8种策略、LRU/LFU实现
  • 秒级推演赋能复杂场景,镜像视界夯实工业数字根基
  • SpringBoot + Thymeleaf 实战:手把手教你从零搭建一个婚纱租赁网站(附完整源码)
  • PageIndex:基于RAG的网页智能知识库构建实战指南
  • HoRain云--超全PHP安装指南:Linux/Windows/macOS全攻略
  • MQTTX与AI助手实时交互:基于MCP与SSE的物联网协议桥接实践
  • 基于Dev Containers的标准化开发环境构建与实战指南
  • STM32定时器OPM单脉冲模式实战:从驱动蜂鸣器到生成精准PWM脉冲(以TIM4为例)
  • synchronized内存布局图(bit 精确位置)
  • Promptr:用自然语言指令自动化重构代码的AI工具实践指南
  • 在github上快速部署taotoken的python调用示例
  • 千问 LeetCode 2127.参加会议的最多员工数 Python3实现
  • AI智能体全栈开发框架解析:从核心架构到生产部署
  • 免费实时提升动漫画质:Anime4K超分辨率技术完整指南