网站开发需要看哪些书软件开发培训机构推荐
网站开发需要看哪些书,软件开发培训机构推荐,企业注册资本代表什么,电子商务网站建设实训步骤c# 基础
值类型 引用类型
引用类型
class object array 接口、委托等
保存在堆中
clr
管理堆
.net的核心组件 管 代码执行、内存分配、垃圾回收等
object
所有类的基类
C# 中所有类型#xff08;值类型 引用类型#xff09;的最终基类#xff0c;任何类型都可以隐式转换为…c# 基础值类型 引用类型引用类型class object array 接口、委托等保存在堆中clr管理堆.net的核心组件 管 代码执行、内存分配、垃圾回收等object所有类的基类C# 中所有类型值类型 引用类型的最终基类任何类型都可以隐式转换为object接口实现接口时例如person类 Person tomnew person()tom是引用类型publicinterfaceIPerson{}publicclassPerson:IPerson{}IPersontomnewPerson();// tom是引用类型指向堆中Person实例array数组 所有数组的基类创建数组也是引用类型int[] arr1new int[2];arr1[0] 是值类型引用传递int[] arr1{1,2,3};public void play(){int[] arr1{2,3,4};Console.WriteLine(“arr1”);//2 3 4Console.WriteLine(string.Join( “, arr1)); // 输出2 3 4}Console.WriteLine(“arr1”)//Console.WriteLine(string.Join(” , arr1)); //1 2 3int arr1{1,2,3};public void play(){arr1[0]3;//arr1[0]3Console.WriteLine(“arr1[0]”);//3Console.WriteLine(“arr1”);//3 2 3Console.WriteLine(string.Join( , arr1));////3 2 3}Console.WriteLine(“arr1[0]”);//3Console.WriteLine(“arr1”);// 3 2 3usingSystem;classArrayRefDemo{// 示例1方法内重新赋值数组变量staticint[]arr1{1,2,3};// 全局数组staticvoidPlay1(){// 这里是「重新创建了一个新数组」并让方法内的arr1指向新数组int[]arr1{2,3,4};Console.WriteLine(string.Join( ,arr1));// 输出2 3 4}// 示例2方法内修改数组的元素staticvoidPlay2(){// 这里没有新建数组而是直接修改「原数组」的第一个元素arr1[0]3;Console.WriteLine(arr1[0]);// 输出3Console.WriteLine(string.Join( ,arr1));// 输出3 2 3}staticvoidMain(){// 测试示例1Play1();Console.WriteLine(string.Join( ,arr1));// 输出1 2 3原数组没变化Console.WriteLine(-----分割线-----);// 测试示例2Play2();Console.WriteLine(arr1[0]);// 输出3原数组被修改Console.WriteLine(string.Join( ,arr1));// 输出3 2 3}}值类型包含int、float、bool、char、结构体struct、枚举enum等保存在栈中 例如intint num10;num15;num变成15值传递int num15;public void play(){int num10;Console.WriteLine(“num”);//num10}Console.WriteLine(“num”);//num15装箱int num10;object t;object jnum;值类型变成引用类型int [] arr new int [2] {10, 20};object obj arr [0];intnum10;objectjnum;// 装箱栈的int → 堆的objectint[]arrnewint[2]{10,20};objectobjarr[0];// 装箱arr[0]的int值 → 堆的object拆箱object t5;int num25;int num2t;引用类型变成值类型objectt5;intnum2(int)t;// 拆箱堆的object → 栈的int必须强转数组 arrayint[] arr1new int[1];float[] arr2new float[] {1.4f,213.2f,23.1f}int[]arr1newint[1];// 声明初始化长度1默认值0float[]arr2newfloat[]{1.4f,213.2f,23.1f};// 声明初始化指定元素float[]arr3{1.4f,213.2f};// 简化写法编译器自动推断泛型 List可以存多个同类型的数据 长度可以动态变化ListintnumListnewListint();numList.Add(1);// 动态添加numList.Add(2);numList.Remove(1);// 动态删除ref out核心传 “变量本身”栈中的引用 / 值而非 “变量的值”int[] or{1,2};void Modify(int[] arr){arrnew int[] {5,6};}Modify(or);// or指向1,2void Modify2(ref int[] arr){arrnew int[] {5,6}}Modify(of);// or指向5,6ref /out 都是 “把变量本身传过去而不是把值传过去”只是规则不一样。int[]or{1,2};voidModify(int[]arr){arrnewint[]{5,6};// 改的是方法内的局部引用原数组不变}Modify(or);// or仍指向{1,2}voidModify2(refint[]arr){arrnewint[]{5,6};// 改的是原变量的引用}Modify2(refor);// or指向{5,6}refref 你必须先有我才能改void RefMethod(ref int[] arr){arr[0]10;}int orinew int[1];RefMethod(ref ori);//ori[0]:10voidRefMethod(refint[]arr){arr[0]10;// 改数组内容}int[]originalnewint[1];// 必须先初始化RefMethod(reforiginal);我在方法里改 arr[0] 直接改你外面的数组ref外面必须先初始化你先开好空间我方法里帮你赋值 / 改内容out你不用有我来给你造void OutMethod(out int[] arr){arrnew int[1];arr[0]20;}int[] result;voidOutMethod(outint[]arr){arrnewint[1];// 必须赋值arr[0]20;}int[]result;// 不用初始化OutMethod(outresult);out外面不用初始化你不用准备方法里必须给你初始化我来开空间、第一次赋值ref 是调用方法之前我自己先把数组初始化好。out 是调用之前我不用初始化但是方法里面必须把数组初始化、赋值好。声明 初始化 赋值int[] arr; → 只声明没初始化int[] arr {1,2,3}; → 声明 初始化arr[0] 10; → 这是赋值.NET框架包含类库System、System.IO等、CLR、编译器等作用C# 代码运行的基础体系屏蔽底层系统差异跨平台TaskTask 就是帮你 “后台干活” 的工具比如上位机读取串口数据可能要等设备响应用 Task 处理这个过程界面就不会卡住用户还能拖动窗口、点击按钮asyncasync 是 C# 里用来声明异步方法的关键字和 Task 配合用。比如你写一个异步读取串口数据的方法就可以加 async 修饰里面用 await 调用 Task 相关的异步操作这样方法执行到耗时步骤时不会阻塞主线程。上位机里写界面响应的方法时用 async 能让操作更流畅。// 异步读取串口数据UI不卡privateasyncvoidbtnReadSerial_Click(objectsender,EventArgse){stringdataawaitTask.Run((){// 耗时操作读取串口数据returnserialPort.ReadLine();});txtContent.Textdata;// 任务完成后更新UI}实例“实例” 可以理解为根据一个 “模板” 创建出来的具体对象。这里的ModbusSerialMaster.CreateRtu(serialPort)就是用ModbusSerialMaster这个 “模板”结合已打开的串口serialPort创建出一个能和 Modbus 设备通信的具体 “工具”这个 “工具” 就是master实例后面读取寄存器、线圈的ReadHoldingRegistersAsync等方法都是通过这个master实例来调用的// ModbusSerialMaster是类模板// master是实例具体工具能调用Modbus通信方法varmasterModbusSerialMaster.CreateRtu(serialPort);// 调用实例方法读取保持寄存器varregistersawaitmaster.Readvarvar是 “隐式类型”编译器会根据等号右边的内容自动判断它的具体类型。这里var series01 new LineSeries()右边是LineSeries所以series01实际就是LineSeries类型和写LineSeries series01 new LineSeries()效果一样只是用var写起来更简洁。三条曲线用var定义本质上都是LineSeries对象所以能被添加到图表的Series集合里最终显示成曲线。enumenum是枚举类型用来定义一组有名字的常量让代码更易读。比如你这项目如果有灯光状态可定义enum LightState { On1, Off0 }代替直接写 1 和 0别人一看就知道 On 代表开。你代码里控制灯光用bool如果状态更多enum 会更合适。