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