标签:
1.string
1.概念:string是引用类型,我们比较的是对象的值,而不是对象的本身。
string strA="abcde"; string strB="abc"; string strC="de"; Console.WriteLine(strA == (strB+strC));//true Console.WriteLine((object)strA == (object)(strB+strC));//false
2.string对象是不可修改的
string strA="abcde"; strA="aaaaa";
从表面上看似修改了strA的内容,事实上"abcde"没有被修改,而是从新创建了一个对象"aaaaa",然后把该对象的引用赋给strA,最后"abcde"会被作为垃圾回收。
3.string的创建
string s = new string();//false StringBuilder sb = new StringBuilder();//true string strA="abcde";//创建一个内容为abcde的string对象,然后将该对象的引用赋给strA //内部构造 char[] arr = { ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘ }; string strA = new string(arr);//这里只列举一种
注意:没有String str=new String("abcde");这样的构造,string 是 .NET Framework 中String的别名。
4.string参数传递
string是引用类型,我们试图在一个函数里改变这个值
static void Main(string[] args) { string strA = "abcde"; Deal(strA); Console.WriteLine(strA); Console.ReadLine(); } static void Deal(string str) { str = str.Substring(0, 2); }
运行结果:abcde
原因是通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值。但无法更改引用本身的值,通过ref关键字传递参数可解决该问题。
static void Main(string[] args) { string strA = "abcde"; Deal(strA); Console.WriteLine(ref strA); Console.ReadLine(); } static void Deal(ref string str) { str = str.Substring(0, 2); }
结果:ab
此时传递的是引用本身,而不是副本
扩展:ref是 有进有出,(传递的是引用本身(带值)
out是 只出不进。(传递的是引用本身(out 参数的值不会传递到 out 参数。 不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值))
class Program { static void Main(string[] args) { string tmp; //先声明,但不初始化 User _user=new User(); _user.Name(out tmp); //调用Name方法 Console.WriteLine("{0}",tmp); //这时tmp的值为“在这里面赋值了” Console.ReadKey(true); } } class User { public void Name(out string tmps) { tmps="在这里面赋值了"; } } 结果: 在这里面赋值了 ————————————————————————————————————————————————— ref的使用 ————————————————————————————————————————————————— class Program { static void Main(string[] args) { string tmp="传值之前"; //声明并初始化 这时如果输出tmp值为"传值之前" User _user=new User(); _user.Name(ref tmp); Console.WriteLine("{0}",tmp); Console.ReadKey(true); } } class User { public void Name(ref string tmps) { tmps="传值之后"; } } 结果: 传值之后
用法:
1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。
out返回多个值:
static void Main(string[] args) { //声明 int value; string strOutValue; //调用函数 //函数的参数有两个返回的值 ReturnMulValue(out strOutValue,out value); Console.WriteLine("Call ReturnMulValue(out string strOut, out int i)"); Console.WriteLine("value = {0:N}", value);//value = 1.00 Console.WriteLine("Out string value = " + strOutValue); //Out string value = out function //调用函数 http://www.cnblogs.com/roucheng/ //函数原返回值与参数中均得到返回的值 value = ReturnMulValue(out strOutValue); Console.WriteLine("Call ReturnMulValue(out string strOut)"); Console.WriteLine("value = {0:N}", value);//value = 2.00 Console.WriteLine("Out string value = " + strOutValue);//Out string value = out function 2 //声明 int[] outArr; //调用函数 //函数返回数组 ReturnMulArr(out outArr, out value); Console.WriteLine("Call ReturnMulArr(out int[] arr, out int i)"); Console.WriteLine("value = {0:N}", value);//value = 3.00 Console.WriteLine("Out arr value "); for (int j = 0; j < outArr.Length; j++) { Console.Write(outArr[j]);//12345 } } /// <summary> /// 返回多个值,原函数返回空 /// </summary> /// <param name="strOut">使用out关键字返回的字符串</param> /// <param name="i">使用out关键字返回的数值</param> static void ReturnMulValue(out string strOut, out int i) { i = 1; strOut = "out function"; } /// <summary> /// 返回多个值,原函数返回数值 /// </summary> /// <param name="strOut">使用out关键字返回的字符串</param> /// <returns>原函数直接返回的数值</returns> static int ReturnMulValue(out string strOut) { int i = 2; strOut = "out function 2"; return i; } /// <summary> /// 返回数组 /// </summary> /// <param name="arr">使用out关键字返回的数组</param> /// <param name="i">使用out关键字返回的数值</param> static void ReturnMulArr(out int[] arr, out int i) { arr = new int[5] { 1, 2, 3, 4, 5}; i = 3; } }
5.null 字符串和空字符串
null 字符串:没有分配内存;空字符串分配了内存,但内存里面没有数据.
6.方法
string strA = "abcde";//这里只列举一种 string strB = "ab";
1.string (char[]) 使用指定的字符串数组构建一个新的string对象
2.int Compare(string a,string b,bool case) 比较字符串a,b,case为true时表示不区分大小写。当a>b返回正数(1),当a<b返回负数(-1),a=b返回0,比较长度 -- int t= string.Compare(strA, strB, true); --int e= strA.CompareTo(strB);
3. bool EndsWith(string) 确定当前字符串是否以指定的字符串结尾-- bool c = strB.EndsWith("b");
4. bool StartsWith(string) 确定当前字符串是否以指定的字符串开头 --bool b = strA.StartsWith("a");
5.int IndexOf() 返回指定的字符或字符串在当前字符串中的位置
6.int LastIndexOf() 返回指定字符或字符串的最后一个匹配项位置
7.string Insert(int,string) 在当前的字符串中插入一个指定的字符串
8.string Replace(string,string) 字符串替换
9.string Remove(int,int) 从指定位置开始删除指定个数的字符
10. ToUpper() ToLower() 字符串大小写转换
11.string SubString(int,int) 返回从指定位置开始指定个数的字符串
11. strA.Trim() 去除空白字符格
12。 strA.Equals(strB); C#中的==和Equals是一样的,都是比较值,对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false。对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true。对于 string 类型,== 比较字符串的值。
13.string.Format();--拼字符串
14.string反转
string sfazhu(string str) { StringBuilder sb = new StringBuilder(str.Length); for (int i = str.Length; i > 0; i--) { sb.Append(str[i-1]); } return sb.ToString(); }
15.IsNullOrEmpty等同于 if (str == null || str.Equals(String.Empty))
IsNullOrWhiteSpace等同于 if (str == null || str.Equals(String.Empty) || str.Trim().Equals(String.Empty))
6.StringBuilder
现看如下测试代码:
string strA="abc" for(int i=0;i<10000;i++) { strA+="abc"; } Consolse.WriteLine(strA);
修改后的测试代码如下:
StringBuilder strA=new StringBuilder(); for(int i=0;i<10000;i++) { strA.Append("abc"); } Consolse.WriteLine(strA.ToString());
标签:
原文地址:http://www.cnblogs.com/wenbin891428/p/4394757.html