C#forUnity快速入门(连载12)-C#的字符串

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);
            }
        }

/// <summary>
        /// 反转字符串
        /// </summary>
        /// <param name="strOrignial">原字符串</param>
        /// <returns>反转之后的字符串</returns>
        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;
        }

/// <summary>
        /// 判断回文字符串。
        /// </summary>
        /// <param name="str">原始字符串</param>
        /// <returns>
        /// true: 是回文字符串,
        /// false; 不是
        ///  </returns>
        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
    {
        /// <summary>
        /// "=="相等性判断
        /// </summary>
        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");
            }
        }

/// <summary>
        /// "Equals"相等性判断
        /// </summary>
        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();
        }
    }



时间: 2024-12-25 09:53:35

C#forUnity快速入门(连载12)-C#的字符串的相关文章

C#forUnity快速入门(连载15)_C#委托与事件

C# for Unity编程语言快速入门教程(连载15)_C#委托与事件 C#的委托(delegate)与事件(event)  其实不是一个容易理解的技术,而且很多C#书籍作者还经常把它与"观察者设计模式"(Observer模式)放在一起进行讨论(注:因为委托与事件是"Observer"设计模式的一种很好的实现方式),其实这就进一步增加了对于C#初学者的学习难度. 所以笔者打破常规,先从讲故事的方式,先来介绍"委托". 案例故事:"老板

C#forUnity快速入门(连载11)-C#的属性

C# for Unity编程语言快速入门教程(连载11)_C#的属性    C#的"属性"是一种类字段的约束控制手段,其直接目的就是控制字段的输入合法性,以及实现对字段的快速访问. 目的:     引入属性概念是为了更合理的控制对字段的可访问性.    规则1: 属性是方法的简化版,主要是用于对字段的控制.规则2: 属性本质就是Set 与Get 方法的简化.规则3: 属性可以写成只读属性.只写属性.规则4: 属性中如果不需要对字段做控制处理,可以简化写法. 因为这个概念相对比较简单,所

C#forUnity快速入门(连载13)-C#结构体

C# for Unity编程语言快速入门教程(连载13)_C#结构体 C#的"结构体"使用Struct 关键字来定义,是与"类"."接口"并列的编程单位.其设计的主要目的是自定义"值类型",即允许用户自定义值类型. 适用范围:   结构适合一些小型的数据结构,这些结构包含的数据以创建后不修改的数据为主.也适合数据打包,一次性定义多个变量. 结构体的限制很多.1> 除非字段声明为const .static,否则无法初始化.

C# for Unity快速入门(连载14)_C#枚举类型

C# for Unity编程语言快速入门教程(连载14)_C#枚举类型 C#的枚举类型(用 "enum"关键字标识),按照笔者理解本质上是一个隐式继承了System.Enum的整形类.枚举类型的主要作用是:为了更好的识别一个变量的具体含义,且固定变量的使用"范围". 例如:形如如下定义 public enum Week{   Monday,  Tuesday,  Wenesday,  Thursday,  Friday,  Saterday,  Sunday }  

AngularJS快速入门指南12:模块

AngularJS模块定义了一个application. 模块是一个application中不同部分的容器. application中的所有控制器都应该属于一个模块. 带有一个控制器的模块 下面这个application("myApp")包含一个控制器("myCtrl"): <!DOCTYPE html> <html> <script src="http://ajax.googleapis.com/ajax/libs/angu

[易学易懂系列|rustlang语言|零基础|快速入门|(12)]

有意思的基础知识 Enums 今天我们来讲讲枚举. 在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数.这两种类型经常(但不总是)重叠. 是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY.MONDAY.TUESDAY.WEDNESDAY.THURSDAY.FRIDAY.SATURDAY就是一个枚举. 如下定义: enum Day { Sunday, Monday, Tuesday, Wednesday, Thu

AngularJS快速入门指南01:导言

AngularJS使用新的attributes扩展了HTML AngularJS对单页面应用的支持非常好(SPAs) AngularJS非常容易学习 现在就开始学习AngularJS吧! 关于本指南 本指南旨在帮助你尽可能快速而有效地学习AngularJS.通过该指南你会学习到AngularJS的一些基本特性,例如指令.表达式.过滤器.模块和控制器等.以及其它所有你需要知道的有关AngularJS的东西,如事件.DOM节点.表单.用户输入.数据验证.Http对象等. AngularJS快速入门指

AngularJS快速入门指南11:事件

AngularJS拥有自己的HTML事件指令. ng-click指令 ng-click指令定义了AngularJS的click事件. <div ng-app="" ng-controller="myCtrl"> <button ng-click="count = count + 1">Click me!</button> <p>{{ count }}</p> </div> 运

AngularJS快速入门指南13:表单

一个AngularJS表单是一组输入型控件的集合. HTML控件 HTML输入型标签标包括: input标签 select标签 button标签 textarea标签 HTML表单 HTML表单将各种HTML控件组合到一起. 一个AngularJS表单的例子 <div ng-app="myApp" ng-controller="formCtrl"> <form novalidate> First Name:<br> <inp