字符串
Person p1 = new Person();
Person p2 = new Person();
这两句话肯定会在堆里开辟两个空间存储
string str = "abc";
str = "abcd";
这句话本身string 已经复制abc了,然后我又改了str的值 那先前的abc就没用了,就会进入垃圾回收机里(C#封装了看不到的)
正常的话肯定会开辟多个空间,用不到的字符串就会过段时间清除,但是经过特殊手段的字符串就不一样了
string str1 = "abc";
string str2 = ”abc";
这俩在值类型里存的地址都指向在堆里开辟的同一个,他发现因为字符串内容一样,就同时指向同一个,这样的字符串是不能更改的
这种的字符串占得内存是死的
字符串可以当做字符数组使用
string str = "abc";
Console.WriteLine(str[0]);//'a'
当把字符串当做数组使用时 数据类型回事char
只能读不能修改
string提供的方法(常用的)
static void Main(string[] args){
//随便创建一个字符串 有大写 有小写
string str = "ABCdef";
//Compare 比较字符串内容 判断字符是否相等
//这个方法是一个字符一个字符的去比较,直到比较到字符不一样的。
//相等打印0,不相等的话会比较一下 Ascii 码 编号大返回1 编号小返回-1
int n = string.Compare(str,"ABCdef");
Console.WriteLine(n);
}
static void Main(string[] args){
//随便创建一个字符串 有大写 有小写
string str = "ABCdef";
//Contains 判断在str这个字符串里是否包含 这个"内容" 如果完全一样(大小也算)
// 一样返回true,不一样返回false
bool 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);
}
Format
string str1 =string.Format("{0:N1}",56789);//result: 56,789.0
string str2 =string.Format("{0:N2}",56789);//result: 56,789.00
string str3 =string.Format("{0:N3}",56789);//result: 56,789.000
string str8 =string.Format("{0:F1}",56789);//result: 56789.0
string str9 =string.Format("{0:F2}",56789);//result: 56789.00
string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0.20)
string.Format("{0:D3}",23) //结果为:023
string.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是0
n = 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){
//随便创建一个字符串 重复的bc
string 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、参数的个数和类型都不同
public void Print(int data)
{
Console.WriteLine(data);
}
public void Print(float data)
{
Console.WriteLine(data);
}
public void Print(int data, int source)
{
Console.WriteLine(data + source);
}
public int Print(int data, float dataa)
{
return 1;
}
方法递归
自己(方法)调用 自己(方法)要记得给出口
方法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){
//调用Test1
Test1(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){
//如果天数大于0
if(day > 0){ <-----这个是递归的出口
//天数-1 桃子数+1.5
Test1(day - 1,num + 1.5f); <-----核心的逻辑
}//否则
else{
//打印桃子数
Console.WriteLine(num);
}
}
static void Main(string[] args){
//调用Test1
Test1(7,1);//第7天就剩1个桃子
}
————————————————————————————————————————————————————————————————————————————————————————————————————————————
//(2)
//计数器
static int a = 0;
//方法
static void Test2(int hp){
//声明一个临时的攻击变量
int atk = 39;
//如果血量大于0
if(hp > 0){
//计数器++
a++;
//递归
Test2(hp - atk);
}//否则
else{
打印结果
Console.WriteLine(a);
}
}
static void Main(string[] args){
//调用Test2
Test2(66666);
}