字符串
Person p1 = new Person();Person p2 = new Person();这两句话肯定会在堆里开辟两个空间存储string str = \"abc\";str=\"abcd\";这句话本身string 已经复制abc了,然后我又改了str的值 那先前的abc就没用了,就会进入垃圾回收机里(C#封装了看不到的)
正常的话肯定会开辟多个空间,用不到的字符串就会过段时间清除,但是经过特殊手段的字符串就不一样了
stringstr1=\"abc\";string str2=”abc\";这俩在值类型里存的地址都指向在堆里开辟的同一个,他发现因为字符串内容一样,就同时指向同一个,这样的字符串是不能更改的这种的字符串占得内存是死的
字符串可以当做字符数组使用
stringstr=\"abc\";Console.WriteLine(str[0]);//\'a\'当把字符串当做数组使用时 数据类型回事char只能读不能修改
string提供的方法(常用的)
static void Main(string[] args){//随便创建一个字符串 有大写 有小写string str = \"ABCdef\";//Compare 比较字符串内容 判断字符是否相等//这个方法是一个字符一个字符的去比较,直到比较到字符不一样的。//相等打印0,不相等的话会比较一下 Ascii 码 编号大返回1 编号小返回-1int n = string.Compare(str,\"ABCdef\");Console.WriteLine(n);}
static void Main(string[] args){//随便创建一个字符串 有大写 有小写string str = \"ABCdef\";//Contains 判断在str这个字符串里是否包含 这个\"内容\" 如果完全一样(大小也算)// 一样返回true,不一样返回falsebool b = string.Contains(\"bc\");Console.WriteLine(b);//结果false 因为大小写不一样}
static void Main(string[] args){//随便创建一个字符串 有大写 有小写string str = \"ABCdef\";//Remove 虽然他提供了删除的方法,但是他的内部也是新创了一个然后给你返回过来//删除索引//长度str = str.Remove(3,1);Console.WriteLine(str);}
static void Main(string[] args){//随便创建一个字符串 有大写 有小写string str = \"ABCdef\";//Concat 合并 这种合并相当于Console.WriteLine(\"abc\" + \"def\" + \"aaaa\");str = string.Concat(\"abc\",\"def\",\"aaaa\");Console.WriteLine(str);}
static void Main(string[] args){//随便创建一个字符串 有大写 有小写string str = \"ABCdef\";//CopyTo 拷贝 拷贝字符数组Char[] cs = new char[10];//拷贝的字符串起始索引//目标字符数组//目标索引//长度str.CopyTo(1,cs,0,3);cs[1] = \'z\'; //也可以修改Console.WriteLine(cs);}
Formatstring str1 =string.Format(\"{0:N1}\",56789);//result: 56,789.0string str2 =string.Format(\"{0:N2}\",56789);//result: 56,789.00string str3 =string.Format(\"{0:N3}\",56789);//result: 56,789.000string str8 =string.Format(\"{0:F1}\",56789);//result: 56789.0string str9 =string.Format(\"{0:F2}\",56789);//result: 56789.00string.Format(\"{0:C}\",0.2) 结果为:¥0.20 (英文操作系统结果:$0.20)string.Format(\"{0:D3}\",23) //结果为:023string.Format(\"{0:P}\", 0.24583) //结果为:24.58% (默认保留百分的两位小数)string.Format(\"{0:P1}\", 0.24583) //结果为:24.6% (自动四舍五入)
static void Main(string[] args){//随便创建一个字符串 有大写 有小写string str = \"ABCdef\";//IndexOf 查找字符串返回索引//这个查找是返回的第一个字的索引号 比如 ABC返回的就是0 因为A是0n = str.IndexOf(\"BC\");Console.WriteLine(n);//返回的数字是1}
static void Main(string[] args){//随便创建一个字符串 有大写 有小写string str = \"ABCdef\";//这个字符串当中第一次出现的//IndexOfAny 查找任意字符串返回索引n = str.IndexOfAny(new char[] {\'e\',\'B\'});//顺序不重要Console.WriteLine(n);//返回的数字是1 (B)}
static void Main(string[] args){//随便创建一个字符串 有大写 有小写string str = \"ABCdef\";//Insert 插入//索引//内容str = str.Insert(1,\"110\");Console.WriteLine(str);}
static void Main(string[] args){//String.Join 合并字符串数组//分隔符//字符串str = string.Join(\',\',new string[] {\"abc\",\"bcd\",\"def\"});Console.WriteLine(str);}
static void Main(string[] args){//随便创建一个字符串 重复的bcstring str = \"abcdebc\";//LastIndexOf 查找字符串,返回最后一次出现的索引n = str.LastIndexOf(\"bc\");Console.WriteLine(n);//结果是5}
static void Main(string[] args){//随便创建一个字符串string str = \"abcde\";//PadLeft 左侧填充空格str = str.PadLeft(10);Console.WriteLine(str);}
static void Main(string[] args){//随便创建一个字符串string str = \"abcde\";//Replace 替换str = str.Replace(\"bc\",\"00\");Console.WriteLine(str);}
static void Main(string[] args){//随便创建一个字符串string str = \"abc,def,efg\";//Split 拆分string[] strs = str.Split(\',\');Console.WriteLine(strs[1]);}
static void Main(string[] args){//随便创建一个字符串str = \"abcde\";//Substring 截取子字符串//索引//长度str = str.Substring(1,3);Console.WriteLine(str);}
static void Main(string[] args){//随便创建一个字符串 有大写 有小写str = \"ABCdef\";//ToLower 转成小写str = str.ToLower();//ToUpper 转成大写//str = str.ToUpper();Console.WriteLine(str);}
static void Main(string[] args){//随便创建一个字符串 有大写 有小写 有空白str = \" ABCdef \";//Trim 删除首位空白str = str.Trim();Console.WriteLine(str);}
StringBuilder
//使用前要引用using System.Text;命名空间//使用时需要new下,这样就在原来有的字符串上添加了StringBuilder strBuilder = new StringBuilder(\"你\");//实例化 赋初值//增加strBuilder.Append(\"好!\");//插入strBuilder.Insert(1,\"0000\");//删除strBuilder.Remove(1, 4);//替换strBuilder.Replace(\"!\", \"?\");//输出的类型不同 这两种结果都是一样的Console.WriteLine(strBuilder);Console.WriteLine(strBuilder.ToString());
重载
重载是方法名相同,参数不同,调用方法时根据你传的参数,选择它所提供的方法
参数不同是指以下几种情况:1、参数的类型不同2、参数的个数不同3、参数的个数和类型都不同
publicvoidPrint(intdata){Console.WriteLine(data);}publicvoidPrint(floatdata){Console.WriteLine(data);}publicvoidPrint(intdata,intsource){Console.WriteLine(data+source);}publicintPrint(intdata,floatdataa){return1;}
方法递归
自己(方法)调用 自己(方法)要记得给出口
方法A 调用 方法B 方法B 调用 方法A 也要记得给出口
/*斐波那契数列0,1,1,2,3,5,8,13,21,34,55,89,144 ······*///方法static void Test1(int a,int b){//前面的数加上后面的数等于c <-----核心的逻辑int c = a + b;//如果c 小于300 <-----这个是递归的出口if(c < 300){//打印Console.WriteLine(c);//调用自己 <-----自己调用自己Test1(b,c);}}static void Main(string[] args){//调用Test1Test1(0,1);}
例子
/*(1)n个桃,每过一天吃1/2+1个,7天后剩一个,原来有几个桃?(2)写一个递归方法,计算敌人满血66666每次被攻击39,几次攻击杀死敌人。*///(1)每过一天要吃1个半的桃子 第七天就剩了一个桃子 可以反着推出 7 * 1.5 + 1 = 11.5 个桃子//方法static void Test1(int day,float num){//如果天数大于0if(day > 0){ <-----这个是递归的出口//天数-1 桃子数+1.5Test1(day - 1,num + 1.5f); <-----核心的逻辑}//否则else{//打印桃子数Console.WriteLine(num);}}static void Main(string[] args){//调用Test1Test1(7,1);//第7天就剩1个桃子}————————————————————————————————————————————————————————————————————————————————————————————————————————————//(2)//计数器static int a = 0;//方法static void Test2(int hp){//声明一个临时的攻击变量int atk = 39;//如果血量大于0if(hp > 0){//计数器++a++;//递归Test2(hp - atk);}//否则else{打印结果Console.WriteLine(a);}}static void Main(string[] args){//调用Test2Test2(66666);}