IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity3D数字孪生开发笔记——代码篇 -> 正文阅读

[游戏开发]Unity3D数字孪生开发笔记——代码篇

一、数据类型

请添加图片描述

1、数据类型

1>类型分类

  • 通用类型系统CTS(Common Type System)是 .NET 框架中的一个组成部分,为所有面向 .NET 框架的语言定义了数据类型的规则;
  • 值类型:存储数据本身
  • 引用类型:存储数据的引用(内存地址)

2>类型归属

请添加图片描述

2、内存分配

1>内存

  • 是CPU与其他外部存储器交换数据的桥梁;
  • 用于存储正在执行的程序与数据,即数据必须加载到内存才能被CPU处理;
  • 通常开发人员表达的"内存"都是指内存条。

2>分配

  • 程序运行时,CLR将申请的内存空间从逻辑上进行划分;
  • 栈区:
    –空间小(1MB),读取速度快
    用于存储正在执行的方法,分配的空间兼做栈帧。栈帧中存储方法的参数以及变量等数据。方法执行完毕后,对应的栈帧将被清除。
  • 堆区:
    –空间大,读取速度慢
    用于存储引用类型的数据。

3、局部变量

  • 定义在方法内部的变量
  • 特点:
    –没有默认值,必须自行设定初始值,否则不能使用
    –方法被调用时,存在栈中,方法调用结束时从栈中清除

1>值类型与引用类型

  • 值类型:
    声明在栈中,数据存储在栈中

  • 引用类型:
    声明在栈中,数据存储在堆中,栈中存储该数据的引用

  • 理解:
    1、因为方法执行在栈中,所以在方法中声明的变量都在栈中
    2、因为值类型直接存储数据,所以数据存储在栈中
    3、又因为引用类型存储数据的引用,所以数据在堆中,栈中存储数据的内存地址

2>垃圾回收器

  • GC(Garbage Collection)是CLR中一种针对托管堆自动回收释放内存的服务;
  • GC线程从栈中的引用开始跟踪,从而判定哪些内存是正在使用的,若GC无法跟踪到某一块堆内存,那么认为这块内存不再使用,即为可回收的。

4、成员变量

  • 定义在类中方法外的变量
  • 特点:
    –具有默认值
    –所在类被实例化后,存在堆中,对象被回收时,成员变量从堆中清除
    –可以与局部变量重名

1>值类型与引用类型

  • 值类型:
    声明在中,数据存储在
  • 引用类型:
    声明在中,数据存储在的另一块空间

5、应用

1>比较

		static void Main()
        {

            int num01 = 1, num02 = 1;
            bool r1 = num01 == num02;//true,因为值类型存储的是数据,所以比较的时数据

            int[] arr01 = new int[] { 1 }, arr02 = new int[] { 1 };
            bool r2 = arr01 == arr02;//false,因为引用类型存储的时数据的引用,所以比较的是存储的引用
            bool r3 = arr01[0]== arr02[0];//ture
        }

2>赋值

		static void Main()
        {
            // 值类型                                   引用类型
            //int bool char                        string  Array

            //a在栈中   1在栈中
            int a = 1;
            int b = a;
            a = 2;
            Console.WriteLine(b);//?

            //arr在栈中存储数组对象的引用(内存地址)   1在堆中
            int[] arr = new int[] { 1 };
            int[] arr2 = arr;
            //arr2[0] = 2;//修改的是堆中的数据
            arr = new int[]{2};//修改的是栈中存储的引用
            Console.WriteLine(arr2[0]);//?

            string s1 = "男";
            string s2 = s1;
            s1 = "女";//修改的是栈中存储的引用
            //s1[0]='女';//堆中的文字  不能修改
            Console.WriteLine(s2);//?

            // o1 在栈中   数据1 在堆中
            object o1 = 1;
            object o2 = o1;//o2得到的是数据1 的地址
            o1 = 2;//修改的是栈中o1存储的引用
            Console.WriteLine(o2);//?

        }

图一

图二
图三
在这里插入图片描述

3>传参

		static void Main()
        {
            int a = 1;
            int[] arr = new int[] { 1 };
            Fun1(a,arr);//实参将 数据1/数组引用  赋值给形参
            Console.WriteLine(a);
            Console.WriteLine(arr[0]);
        }

        private static void Fun1(int a,int[] arr)
        {
            a = 2;
            //arr[0] = 2;
            arr = new int[] { 2 };
        }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6、拆装箱

1>装箱 box

  • 值类型隐式转换为object类型或由此值类型实现的任何接口类型的过程;
  • 内部机制:
    1.在堆中开辟内存地址
    2.将值类型的数据复制到堆中
    3.返回堆中新分配对象的地址请添加图片描述

2>拆箱 unbox

  • 从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换;
  • 内部机制:
    1.判断给定类型是否是装箱时的类型
    2.返回已装箱实例中属于原值类型字段的地址

请添加图片描述

        static void Main()
        {
            int a = 1;
            //int b = a;

            //装箱操作:"比较"消耗性能("最")
            object o = a;

            //拆箱操作:"比较"消耗性能
            int b = (int)o;

			int num = 100;
            string str01 = num.ToString();//没装

            string str02 = "" + num;//装箱
            //string str02 = string.Concat("",num)  //int ==>object

        }
        //形参object类型,实参传递值类型,则装箱
        //可以通过 重载、泛型避免。

7、string

1>特性

  • 字符串常量具备字符串池特性
    1.字符串常量在创建前,首先在字符串池中查找是否存在相同文本。如果存在,则直接返回该对象引用;如果不存在,则开辟空间存储。
    2.作用:提高内存利用率
  • 字符串具有不可变性
    字符串常量一旦具有内存,就不得再次改变。因为如果在原位置改变会使其他对象内存被破坏,导致内存泄漏 。当遇到字符串变量引用新值时,会在内存中新建一个字符串,将该字符串地址交由该变量引用。
        static void Main()
        {
            string s1 = "八戒";
            string s2 = "八戒";//同一个字符串

            string s3 = new string(new char[] { '八', '戒' });
            string s4 = new string(new char[] { '八', '戒' });

            bool r1 = object.ReferenceEquals(s3, s4);

            //字符串池
            //字符串的不可变性

            //重新开辟空间 存储新字符串,再替换栈中引用
            s1 = "悟空";
            //将文本“八戒”改为“悟空”
            Console.WriteLine(s1);

            //每次修改,都是重新开辟新的空间存储数据,替换栈中引用
            object o1 = 1;
            o1 = 2.0;
            o1 = "ok";
            o1 = true;

            string strNumber = "";
            for (int i = 0; i < 10; i++)
            {
                //         ""  + "0"
                //         "0"+ "1"  每次拼接产生新的对象  替换引用 (原有的数据产生1次垃圾)
                strNumber = strNumber + i.ToString();
            }

            //可变字符串  一次开辟可以容纳10个字符大小的空间
            //优点:可以在原有空间修改字符串,避免产生垃圾
            //适用性:频繁对字符串操作(增加 替换 移除)
            StringBuilder builder = new StringBuilder(10);
            for (int i = 0; i < 10; i++)
            {
                builder.Append(i);
            }
            builder.Append("是哒");
            string result = builder.ToString();

            builder.Insert(0,"builder");
            //builder.Replace();
            //builder.Remove();

            s1 = s1.Insert(0, "s1");
        }

请添加图片描述

2>常用方法

  • ToCharArray(将字符串转为字符数组) ?????? ~~~~~~ ?????? Insert(在指定索引位置插入字符串)
    Contains(检查字符串中是否包含某个字符) ???? ~~~~ ???? ToLower(将字符串全部转为小写字母)
    ToUpper(将字符串全部转为大写字母) ????? ~~~~~ ????? IndexOf(返回某个字符的索引)
    Substring(从指定索引开始复制一个子字符串) ??? ~~~ ??? Trim(移除字符串两侧的空白字符或其他预定义字符)
    Split(以某些字符为分隔符将字符串分割成字符串数组) ?????? ~~~~~~ ?????? Replace(替换字符串中的某个字符)
    Join(将字符串数组中的字符串进行拼接,中间以某个字符分隔开)
		static void Main()
        {
            string s1 = " sda Hisc as ";
            char[] s2 = s1.ToCharArray(0, 5);
            foreach (var item in s2)
            {
                Console.WriteLine(item);
            }

            string s3 = s1.Insert(0, "abs");

            bool r1 = s1.Contains('d');

            string s4 = s1.ToLower();

            string s5 = s1.ToUpper();

            int index = s1.IndexOf('i');

            string s6 = s1.Substring(5);

            string s7 = s1.Trim();

            string[] s8 = s1.Split(new char[] { 'a' });

            string s9 = s1.Replace('a', 'b');

            string s10 = string.Join(' ', new string[] { "dsa", "ewq", "sxc" });
        }

C#字符串的处理 String和StringBuilder: 传送门.

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-08-15 15:55:11  更:2021-08-15 15:55:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 19:08:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码