.Net学习 第2季02 C#面向对象 string类

.Net 视频学习第2季 C#面向对象

 

面向对象 string类

查找类的命名空间快捷键:alt+shift+F10

项目A中有类X,要在项目B中使用X的话,首先在项目B的引用当中添加项目A,然后在项目B的代码中添加using A;(假设项目A类X的命名空间就是A)或者在使用X时采用A.X的格式。

 

记录运行时间

Stopwatch sw = new Stopwatch();
sw.Start();
// 代码
sw.Stop();
Console.WriteLine(sw.Elapsed);

Start()和Stop()是类Stopwatch的方法,Elapsed是类Stopwatch的属性。

 

值类型的数据存储在栈中,引用类型的数据存储在堆中。

int a = 10;
string s = "123";

我自己的理解是a会映射成地址,指向栈中某位置,该位置存放的是数据10;而s同样映射成地址,指向栈中某位置,该位置存放的是另一个内存地址,此地址指向堆中某位置,该位置存放的是数据“123”。

 

int a = 10;
a = 20;
string s = "123";
s = "456";

string的不可变性:a是值类型,对a重新赋值后,在栈中的数据10会被新数据20所覆盖;s是引用类型,对s重新赋值后,在堆中的数据“123”没有被销毁,而是在堆中另外开辟了空间存放新数据“456”,并且将栈中原本指向“123”的地址更换为指向“456”的地址。因此被覆盖的都是栈中的数据。重复给string赋值,会在堆中产生大量没有被指向的数据。

 

string s1 = "123";
string s2 = "123";

对上边的代码,直观的感觉是在堆中有两块空间分别存了2个“123”,然后在栈中s1存的是指向堆中第一个“123”的地址,而s2存的是指向第二个“123”的地址。但事实是,在堆中只有一个“123”,而在栈中s1和s2存储了相同的地址内容。

 

可以将string看成是只读的char数组,所以可以用索引来访问,但不能修改(只读属性)。注意,这只是理解上的方便,实际上string不是char数组,只是string类里边提供了一个通过索引来访问元素的方法。

当然string类也的确提供了转换为char数组的方法:

string s = "123";
char[] chs = s.ToCharArray();

而将char数组转换为string可以用string类的构造方法之一:

string s = "123";
char[] chs = s.ToCharArray();
chs[0] = '0';
s = new string(chs);

这时候s="023",注意堆中依然存在数据“123”,只是栈中s存储的已经不是指向“123”的地址,而是指向“023”的地址。

 

StringBuilder sb = new StringBuilder();
string s = sb.ToString();

StringBuiler类有方法sb.Append(x);效率比重新开辟内存空间的string要高。

 

string类的一些属性和方法:

string s1 = "abc";
string s2 = "abc";

// 通过属性Length获取字符串长度
int sl = s1.Length;

// 字符串比较(C#操作符重载,支持字符串比较)
if (s1 == s2)
{
  Console.WriteLine("s1=s2");
}
else
{
  Console.WriteLine("s1!=s2");
}

// 字符串大小写转换
string s3 = s1.ToUpper();
string s4 = s1.ToLower();

// 同样是字符串比较,Equals()方法可以提供参数来控制比较方法,以下是比较s1和s2,同时忽略大小写
if (s1.Equals(s2, StringComparison.OrdinalIgnoreCase))
{
  Console.WriteLine("s1=s2");
}

string的分割,Split()方法(重载6):第一个参数是char数组,存放要remove并作为分割的字符,第二个参数StringSplitOptions,枚举类型,None会将每个分隔符用NULL代替,而RemoveEmptyEntries则直接将分隔符去掉,方法返回一个string数组。

string s = "1 2 + 345 , 6";
char[] chs = {' ', '+', ','};
string[] sa = s.Split(chs,StringSplitOptions.RemoveEmptyEntries);

上述代码实现了将s中的空格,加号和逗号去掉,并且返回string数组,共4个元素,分别是“1”,“2”,“345”和“6”。

判断string中是否含有特定字符串,Contains()方法(返回bool),替换特殊字符串用Replace()方法(返回string)

string str = "123456789";
string s = "34";
string s2 = "43";
if (str.Contains(s)) { str = str.Replace(s,s2); }

截取字符串用Substring()方法(返回string)

string str = "145978734";
string strS = str.Substring(3,5);

strS="97873",Substring()第一个参数是子字符串在原字符串的起始位置(注意从零开始计算),第二个参数是子字符串的长度,如果第二个参数不填写,则默认取到原字符串的结尾。

 

判断字符串是否以某字符串开始或以某字符串结束,用StartsWith()和EndsWith()方法,均返回bool

查找某字符/字符串在字符串中首次出现的位置(注意从零开始)用IndexOf()方法,返回int,可以加入第二个参数,限定从字符串某位置开始查找(包括该指定位置),最后出现的位置用LastIndexOf()方法。如果没有找到指定的字符,则返回-1。

string str = "9335403";
int a = str.IndexOf('3');
int b = str.IndexOf('3',1);
int c = str.IndexOf('3',2);
int d = str.LastIndexOf('3')

a = 1, b = 1, c = 2, d = 6

LastIndexOf()和Substring()配合常用语截取路径当中最后的文件(用/分割):查找最后一个/出现的位置idx,再从idx+1位置开始截取到最后。

去空格用Trim()或TrimStart()或TrimEnd()方法,第一个会将前后的空格都去掉,第二个只去掉前边的,第三个去掉后边的。

 

判断string是否为空,用IsNullOrEmpty()方法,注意此方法不是由string对象来调用,而是用类来调用,对象作为方法输入

string str = "";
if (string.IsNullOrEmpty(str))
{ Console.WriteLine("Empty String!"); }

将一个string数组中的元素以某字符串隔开的方式连接成一个string(最后一个元素后边没有分隔符),用Join()方法

string[] letters = {"abc","de","f","gh"};
string str = string.Join("|", letters);

str="abc|de|f|gh",注意调用该方法的也是string

 

summary (传智播客笔记)

1)、Length:获得当前字符串中字符的个数
2)、ToUpper():将字符转换成大写形式
3)、ToLower():将字符串转换成小写形式
4)、Equals(lessonTwo,StringComparison.OrdinalIgnoreCase):比较两个字符串,可以忽略大小写
5)、Split():分割字符串,返回字符串类型的数组。
6)、Substring():解决字符串。在截取的时候包含要截取的那个位置。
7)、IndexOf():判断某个字符串在字符串中第一次出现的位置,如果没有返回-1、值类型和引用类型在内存上存储的地方不一样。
8)、LastIndexOf():判断某个字符串在字符串中最后一次出现的位置,如果没有同样返回-1
9)、StartsWith():判断以....开始
10)、EndsWith():判断以...结束
11)、Replace():将字符串中某个字符串替换成一个新的字符串
12)、Contains():判断某个字符串是否包含指定的字符串
13)、Trim():去掉字符串中前后的空格
14)、TrimEnd():去掉字符串中结尾的空格
15)、TrimStart():去掉字符串中前面的空格
16)、string.IsNullOrEmpty():判断一个字符串是否为空或者为null
17)、string.Join():将数组按照指定的字符串连接,返回一个字符串。

posted @ 2014-12-04 10:56  Cyrus Ho  阅读(267)  评论(0编辑  收藏  举报