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 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity学习之C#基础18——string类型、字符串池、stringbuilder可变字符串 -> 正文阅读

[游戏开发]Unity学习之C#基础18——string类型、字符串池、stringbuilder可变字符串

1.String类型?

上一节我们复习了引用类型,而string正是其中的一个。下面我们来看一段代码:

            string str1 = "你好";
            string str2 = "你好";

            string str3 = new string("你好");
            string str4 = new string("你好");

            bool b1 = object.Equals(str1, str2);
            bool b2 = object.Equals(str3, str4);
            bool b3 = object.ReferenceEquals(str1, str2);
            bool b4 = object.ReferenceEquals(str3, str4);

上面我们创建了4个字符串,大家先猜一猜b1~b4的结果。

object.Equals是比较两个数据是否相等,而object.ReferenceEquals是比较两个数据是否相同。

很显然,b1~b2是true,而b3是true,b4却是false。那么这是为什么呢?

下面我们引入字符串池的概念:

?通过上面的一串描述,我们知道了,字符串在直接赋值的时候会调用字符串池。而上面代码中str1和str2,当str1赋值为“你好”时,字符串池中没有,故赋予了一块内存存放“你好”。当str2同样赋值为“你好”时,字符串池中有相同字符串,故将其直接指向它。而字符串池的作用也显而易见为提高内存利用率。

相反,str3和str4就不一样了,它不会调用字符串池,而是直接在堆中新建了两块地区存放字符串,故它们并不相同。

2.可变字符串

            string str1="";
            for (int i=0;i<10;i++)
            {
                str1 += i;
            }
            StringBuilder str2 = new StringBuilder();
            for (int i = 0; i < 10; i++)
            {
                str2.Append(i);
            }

?我们看上面的一串代码。之前我们说过字符串池的概念,只要是赋予了新的字符串,就会划出一块内存用于存储。而string简单拼接这样一次循环就要产生很多个垃圾。

这里我们使用stringbuilder可变字符串。

StringBuilder str2 = new StringBuilder(10);

?

可变字符串虽然可以避免产生垃圾,但是当我们的字符串录入超过原定大小时,可变字符串就会舍弃原有空间,重新复制一份到新空间,就会产生更大的垃圾。所以我们在使用可变字符串时,一般适用于频繁的对字符串进行操作。

?用法如上图,而在实例化时,我们如果知道这个字符串有多大,我们可以在括号中加入大小。

相应的一些方法,除了上面的append方法,还有:

?而我们string也有很多的方法如下:

?具体用法如下:

            string str = ",a,bc,dw,xy,z,";
            char[] strarr=str.ToCharArray();//将字符串改为单字符数组
            string str1=str.Insert(0,"PPP");//在索引为0的地方加入PPP字符串
            bool b1=str.Contains('w');//查看字符串是否包含w字符
            string strLower = str1.ToLower();//字符串大写
            string strUpper = str1.ToUpper();//字符串小写
            int strCharFind=str.IndexOf("abc");//返回找到的字串索引
            string strSub = str.Substring(2);//这里返回由索引处到结尾的子字符串
            string strRemoveComma=str.Trim(',');//去除首位的以某个字符或多个字符为目标的字串,这里我们去除‘,’,默认去除空格(在不传递任何参数时)。
            string[] strSplitArr=str.Split(',');//以逗号分割字符串为多个字符串组成的数组中
            string strReplace = str.Replace(',', '!');//用新字符代替字符串中的老字符
            string strJoin = string.Join('@',new char[] { '1','2'});//返回一串由字符数组与分割符相结合的字符串。

?根据上面所学,我们可以尝试一下上面的一些练习。

下面的代码仅供参考:

public static string findRepeatChar(string a)
        {
            char[] strToCharArr=a.ToCharArray();
            int num;
            StringBuilder strNew = new StringBuilder(a.Length);

            for(int i = 0; i < strToCharArr.Length; i++)
            {
                num = 0;
                foreach(var item in strToCharArr)
                {
                    if (strToCharArr[i] == item)
                    {
                        num++;
                    }
                }
                if (num == 1)
                {
                    strNew.Append(strToCharArr[i]);
                }
            }
            return strNew.ToString();
            
        }
        static void Main()
        {
            string str = "How are you";
            string[] strSplit=str.Split();
            Array.Reverse(strSplit);
            foreach(var item in strSplit)
            {
                Console.Write(item + " ");
            }
            Console.Write("\n");
            char[] strToChar = str.ToCharArray();
            Array.Reverse(strToChar);
            foreach(var item in strToChar)
            {
                Console.Write(item);
            }
            Console.Write("\n");
            string newstr = findRepeatChar(str);
            Console.Write(newstr);
        }

  游戏开发 最新文章
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-09-30 12:15:25  更:2021-09-30 12:16:32 
 
开发: 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年6日历 -2024/6/14 15:10:05-

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