C# for Unity编程语言快速入门教程(连载12)_C#的字符串


“C#字符串”是一个重要的知识点,对于C#初学者来说有很多重要知识点需要进行学习,总体归纳有三个大的方面:


知识点一:  字符串的常用方法与属性

属性:
     Length:           得到字符串的长度
   
方法:    
IsNullOrEmpty()   表示空字符串:
IndexOf()  :           查找指定字符(子字符串)。
SubString():          字符串截取(得到子字符串)
Split():                   截断字符串。(返回字符串数组)
Format():              格式化方法
Join():                   (静态方法)连接字符串。
Format():              (静态方法)格式化字符串
Replace():             替换方法。
Trim();                  剔除字符串两边的空格。
parse();                字符串转换基本数据类型
tryParse();            字符串转换基本数据类型(带异常处理,更安全)
                         (备注:目前常用字符串与基本数据类型的转换用Convert 更多一些)

Remove():          删除字符串
                 


                 
知识点二: 字符串的“相等性”判断
   判断 Equals()  与 ==  的区别。
   1>  "=="  比较时
       A) 如果比较的是值类型,则比较两个对象的值。
       B) 如果比较的是引用类型,则比较两个对象的引用是否相同(堆地址是否相同)。
  

   2> "Equals"比较时
       A) 此方法是Object 里面的一个虚方法,默认是用==进行比较。
       B) 但是,大部分微软的类,及用户自定义的类,都重写了该虚方法。
   



知识点三: 字符串的“驻留性”(不变性、恒定性)
     字符串的“驻留性”意思是字符串一旦定义好,则会在内存连续开辟一个区域, 当我们用连接操作符("+"),对字符串做“连接”操作时,则旧的字符串不会发生变化,而是再新开辟一个区域,把旧的字符串与新的字符串进行连接后,存储在新的字符串中。
    以上就是字符串“驻留性”的基本原理,我们从这个原理中会自然推导出: 如果大量的字符串做连接,则势必会造成内存空间的大量浪费! 如何解决这个问题呢,微软公司给我们提供了一个专门处理大量字符串连接的类:StringBuilder




针对以上知识点,提供如下示例,供大家参考。

知识点一(字符串常用方法与属性)部分习题与参考答案:

   class Demo1
    {

        //题目1: 输入若干个字符,然后按照相反的次序输出,
        //例如输入: Hello everyone ,输出 enoyreve olleH
        public void Test1()
        {
            string str = "Hello everyone";

            //for (int i = 0; i < str.Length; i++)
            for (int i = str.Length-1; i>=0; i--)
            {
                string strTemp=str.Substring(i,1);
                Console.Write(strTemp);
            }
        }

        ///


        /// 反转字符串
        ///

        /// 原字符串
        /// 反转之后的字符串
        private string ReverseString(string strOrignial)
        {
            string strResult=null;                         //返回之后的返回字符串

            for (int i = strOrignial.Length - 1; i >= 0; i--)
            {
                string strTemp = strOrignial.Substring(i, 1);
                strResult = strResult + strTemp;           //字符串的串联。
            }
            return strResult;
        }


        ///
        /// 判断回文字符串。
        ///

        /// 原始字符串
        ///
        /// true: 是回文字符串,
        /// false; 不是
        /// 

        private bool JudgeCircleString(string str)
        {
            //反转之后的结果
            string strReverseResult = null;           

            strReverseResult = ReverseString(str);
            if (strReverseResult == str)
            {
                return true;
            }
            else
            {
                return false;
            }        
        }


        //题目2: 判断回文字符串。
        //例如: rotor 就是回文字符串。
        public void Test2()
        {
            string str = "AbcdcbA";
            string strReverseResult = null;                //反转之后的结果

            strReverseResult=ReverseString(str);
            if (strReverseResult == str)
            {
                Console.WriteLine("是回文字符串");
            }
            else {
                Console.WriteLine("不是回文字符串");
            }
        }

        //题目3: 请找出1-256中所有的回文数。
        public void Test3()
        {
            for (int i = 1; i <=256; i++)
            {
                bool boolResult=JudgeCircleString(i.ToString());
                if (boolResult)
                {
                    Console.WriteLine(i);
                }
            }  
        }

        //题目4:  写一个方法,对给定的Emall 字符串做检验。
        //   要求: 1)要求字符串中包含“@”字符与“.”字符。
        //          2)要求字符串中@ 字符在 . 字符之前。
        public bool JudgeEmall(string emall)
        {
            bool boolJudgeResult = false;                  //判断结果
            int intIndexPosionAt = -1;                     //@字符在字符串的位置
            int intIndexPosionDot = -1;                    //"."字符在字符串中的位置

            intIndexPosionAt = emall.IndexOf("@");
            intIndexPosionDot = emall.IndexOf(".");

            if (intIndexPosionAt != -1 && intIndexPosionDot!=-1)
            {
                if (intIndexPosionAt < intIndexPosionDot)
                {
                    boolJudgeResult = true;
                }
            }

            return boolJudgeResult;
        }


        public static void Main()
        {
            Demo1 obj = new Demo1();
            bool boolResult=obj.JudgeEmall("[email protected]");
            if (boolResult)
            {
                Console.WriteLine("合法Emall");
            }else{
                Console.WriteLine("不合法");
            }
        }
    }


知识点二(字符串的“相等性”判断)部分习题与参考答案:

    public class Person
    {
        string name;
        int age;

        public Person(string strName ,int intAge)
        {
            name = strName;
            age = intAge;
        }


        public override bool Equals(object obj)
        {
            Person anotherPer = obj as Person;
            if(this.name==anotherPer.name && this.age==anotherPer.age)
            {
                return true;
            }else{
                return false;
            }
        }
    }


    class Demo2
    {
        ///


        /// "=="相等性判断
        ///

        public void Test1()
        {
            Person p1 = new Person("小龙女",25);
            Person p2 = new Person("范冰冰", 25);
            if(p1==p2)
            {
                Console.WriteLine("p1==p2");
            }else{
                Console.WriteLine("p1!=p2");
            }
        }


        ///


        /// "Equals"相等性判断
        ///

        public void Test2()
        {
            Person p1 = new Person("小龙女", 25);
            Person p2 = new Person("小龙女", 25);
            if (p1.Equals(p2))
            {
                Console.WriteLine("p1 等于 p2");
            }
            else
            {
                Console.WriteLine("p1 不等于 p2");
            }
        }
    }


知识点三(字符串的“驻留性”)部分习题与参考答案:

    class Demo3
    {

        //学习字符串的“恒定性”
        public void Test0()
        {
            string str1 = "李冰冰";
            string str2 = "范冰冰";
            string str3 = "李冰冰";
            string str4 = "李冰冰" + "范冰冰";
            string str5 = str1 + str2;
            string str6 = "李冰冰范冰冰";

            Console.WriteLine(str1==str2);//F
            Console.WriteLine(str1==str3);//T  如何理解呢?
            Console.WriteLine(str4==str5);//T
            //比较地址引用是否相同
            Console.WriteLine(string.ReferenceEquals(str4,str5));//F
            Console.WriteLine(string.ReferenceEquals(str4, str6));//T ??
            Console.WriteLine(string.ReferenceEquals(str5, str6));//F
        } 


        //演示为什么需要学习StringBuder。 即:string 存在的问题。
        public void Test1()
        {
            string str = "大家上午";

            str=str+"好!";
            str = str + "a";
            str = str + "b";
            str = str + "c";
            Console.WriteLine("str="+str);
        }

        //StringBuider 主要就是做字符串的“串联”使用。
        public void TestStringBuilder()
        {
            StringBuilder sbu = new StringBuilder();
            sbu.Append("大家上午");
            sbu.Append("好!");
            sbu.Append("a");
            sbu.Append("b");
            sbu.Append("c");
            sbu.Insert(2,"ABC");
            Console.WriteLine(sbu.ToString());
        }

        static void Main1(string[] args)
        {
            Program obj = new Program();
            obj.TestStringBuilder();
        }
    }