在程序编写的工程中,需要消耗内存,需要进行数据的储存,在定义变量的时候,将会在内存中开辟储存空间,不同的类型的变量所储存的地方是不同的,这里主要分析的是两种变量,一种是引用类型的变量,另一种是值类型的变量,该两种变量被储存的地址是不同的,引用类型的变量主要包括: 字符串类型、自定义类,值类型的变量主要包括:int 、double、decimal、struct、enum、char类型。对于引用类型的变量主要储存在堆中、值类型的变量主要储存在栈中,(栈中的数据遵行的是先入后出的循序)
代码:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _04字符串的不可变性
{class Program
{
static void Main(string[] args)
{
//1.字符串具有不可变性,虽然s1、s2是不同的变量,但是他们指向的堆中地址是相同的,栈中的地址不同
//2.调试方式,使用调试-》窗口-》即时,可以进行调试
//3.字符串是引用变量,将内容储存再堆中的,栈中储存的是堆中的地址
//4.字符串的不可变性:当字符串变量被重新弄赋值的时候,将会在堆中开辟新的空间,储存新的变量原来的变量将会作为垃圾处理,使用是GC,否则将会出现内存泄露的情况。
string s1 = "张三";
string s2 = "张三";
//字符串可以看作是一个只读的char类型的数组
string s3 = "abcdefg";
Console.WriteLine(s3[0]);
// s3[0] = 'b'; 这样的方式对字符串进行改变是不行的,因为字符串只能看作可读的字符数组
//可以将字符串转化成为真正的字符数组
char[] chs=s3.ToCharArray(); //将字符串转化称为一个char类型的数组
chs[0]= 'b';
// 再将char类型的数组转换成为新的字符串
s3= new string(chs); //通过函数将字符类型的数组转换成为字符串,重新赋值给s3字符串变量,同时在堆中开辟了新的空间,这里的s3所指向的堆中的地址已经发生了改变,不再是储存abcdefg的地址
Console.WriteLine(s3[0]);
StringBuilder sb = new StringBuilder(); //在进行字符串的累加的时候,没有重新的开辟新的空间,这样大量的节约了时间,需要注意的是空间的开辟是需要栈中时间的,在进行大量的空间的开辟的时候,可能将会导致程序的”卡顿现象“
Stopwatch sw = new Stopwatch(); //创建计时对象
sw.Start();//开始计时
for (int i = 0; i <1000; i++){
sb.Append(i);
sw.Stop(); //停止计时
Console.WriteLine(sw.Elapsed); //打印记录的时间的长度
string str = sb.ToString(); //将其转化成为字符串
Console.WriteLine(str);
Console.ReadKey();
}
}
}
运行结果:
字符串之间的比较:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _05字符串的处理
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入你喜欢的课程");
string lessonOne = Console.ReadLine();
Console.WriteLine("请输入你喜欢的课程");
string lessonTow = Console.ReadLine();
Console.WriteLine("第一个课程的长度:{0},第二个课程的长度:{1}", lessonOne.Length, lessonTow.Length);
#region 字符串比较的第一种方式
//if (lessonOne == lessonTow) //判断两个字符串是否相同
//{
// Console.WriteLine("喜欢的两个课程相同");
//}
//else {
// Console.WriteLine("喜欢的两个课程不同");
// lessonOne= lessonOne.ToUpper(); //将字符串中的字符转换成为大写的形式
// lessonTow = lessonTow.ToUpper();
// Console.WriteLine("转换后的第一个结果:{0},转换后的第二个结果:{1}",lessonOne,lessonTow);
// lessonOne=lessonOne.ToLower(); //将字符串中的字符全部转换成为小写的形式
// lessonTow = lessonTow.ToLower();
// Console.WriteLine("第二次转换后的结果,第一个结果:{0},第二个结果{1}",lessonOne,lessonTow);
//}
#endregion
if (lessonOne.Equals(lessonTow, StringComparison.OrdinalIgnoreCase)) //通过两个字符串的值就行比较,第二个参数表示比较的方式,这里是忽视大小写的比较
{
Console.WriteLine("两个课程是相同的");
}
else
{
Console.WriteLine("两个课程是不同的");
}
Console.ReadKey();
}
}
}
字符串的截取:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _06字符串的分割
{
class Program
{
static void Main(string[] args)
{
//分割2008-09-10
string s = "2008-09-10";
char[] cha = { '-' }; //需要删除的字符使用一个char类型的数据进行储存
string [] str= s.Split(cha ,StringSplitOptions.RemoveEmptyEntries); //注意这里用于接收的是字符串数组,字符串中的字符被移除以后,将会生成一个字符串数组。
//Split函数进行字符串中字符的筛选,第一个参数表示需要筛选的字符数组,筛选以后的结果是对应的位置的字符将会被去除,但是用空标志进行占位。
//使用了第二个参数以后,可以将空占位符号进行删除,使得返回的字符串数组是连续的。
Console.WriteLine("{0}年{1}月{2}号",str[0],str[1],str[2]);
Console.ReadKey();
}
}
}‘运行结果:
字符串的综合历程:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 字符串练习
{
class Program
{
static void Main(string[] args)
{
#region 读取计算机中的文件的内容
// string path1 = @"D:\桌面转移\1.txt";//将文件的路径放在一个字符串中,复制这里的路径的时候需要注意,不要直接进行复制,需要找到真正的路径,在资源管理器中寻找文件的路径
// string[] str1 = File.ReadAllLines(path1);// 阅读文件的所有的行
//// Console.WriteLine("{0},{1},{2}", str1[0], str1[1], str1[2]);
// for (int i = 0; i < str1.Length; i++)
// {
// string[] str2=str1[i].Split(new char[] { ' ' },StringSplitOptions.RemoveEmptyEntries); //删除字符串中的空格
// Console.WriteLine((str2[0].Length>8?str2[0].Substring(0,8):str2[0])+'|'+str2[1]);
// }
// Console.ReadKey();
#endregion
#region 字符串的反转
//string str = "abcdefg"; //定义字符串
//char[] cha = str.ToCharArray();//将字符串转换转换成为数组
//char temp;
//for (int i = 0; i <= cha.Length / 2 - 1; i++)
//{
// temp = cha[i];
// cha[i] = cha[cha.Length - 1 - i];
// cha[cha.Length - 1 - i] = temp;
//}
//str = new string(cha); //将字符数组转化成为字符串,注意这里进行了字符串对象的创建,并且在进行初始化,最后再对str进行赋值
//Console.WriteLine(str);
//Console.ReadKey();
#endregion
#region 实现 字符串中的单词的反转
// string str = "hello C sharp";
//string[] newStr =str.Split(new char[] { ' '},StringSplitOptions.RemoveEmptyEntries); //删除字符串中的空格,new char[]{ }表示创建一个char;类型的数组对象,并且进行初始化。,返回的是一个字符串类型的数组
// for (int i = 0; i < newStr .Length; i++)
// {
// Console.Write("{0}",newStr[i]); //遍历字符串数组
// }
// Console.WriteLine(); //进行换行处理
// //交换字符换数组中的元素的循序
// for (int i = 0; i < newStr.Length/2; i++)
// {
// string strTemp = newStr[i];
// newStr[i] = newStr[newStr.Length-1-i];
// newStr[newStr.Length -1- i] = strTemp;
// }
// for (int i = 0; i <newStr.Length; i++)
// {
// Console.Write("{0}", newStr[i]); //字符产数组转换以后进行遍历
// }
// Console.WriteLine();
// // 将字符串数组中的元素使用特定的分隔符号进行连接
// str=string.Join(" ",newStr); // 将字符串数组中的元素使用空格进行连接,返回连接以后的字符串
// //将连接后的字符串进行打印
// Console.WriteLine(str);
// Console.ReadKey();
#endregion
#region 字符串的截取,截取任意长度的字符串,通常是要找到字符换字符串的坐标位置
//string email = "232234234@qq.com";
//int index = email.IndexOf( '@'); //获取字符串中某一字符的位置坐标,记住这里的函数Index()
//string Namestr = email.Substring(0, index); //截取用户名,这里是从初始位置到指定坐标的位置,记住这里的函数Substring()截取字符串中的内容
//string yuStr = email.Substring(index + 1); //截取域名,这里是从指定位置到最后
//Console.WriteLine(Namestr);
//Console.WriteLine(yuStr);
//Console.ReadKey();
#endregion
#region 检索字符串中的需要的需要的内容的坐标,可以检索一个字符同时也可以检索字符串
//string str = "ahsjdhjehdjshedjfehejsed";
//int index = str.IndexOf('e'); //检索字符出串中e的位置的坐标,如果检索到指定的内容将会返回对应内容的索引,使用index()进行检索,如果没有检索到内容,其返回值为-1。
//int count = 0;
//while (index != -1) {
// count++;
// Console.WriteLine("第{0}次出现e的位置坐标{1}", count, index);
// index = str.IndexOf('e',index+1);
//}
//Console.ReadKey();
#endregion
#region 检索某一个字符换中的子字符串,使用的函数是contains(),替换字符串中的元素,使用的是replace()函数
//string str = "C#语言的学习是一件无聊的事情";
//Console.WriteLine(str);
//bool a=str.Contains("无聊"); //检索字符串中的子元素,返回的是一个布尔类型的元素
//if (a) {
// str = str.Replace("无聊","有趣");
//}
//Console.WriteLine(str);
//Console.ReadKey();
#endregion
#region 将字符串数组进行连接,转化成为字符串再进行切割,去掉空字符
//string[] str = { "张三", "李四", "王五" };
//string str1 =string.Join("|",str ); //将字符串数组中的元素使用|符号进行连接,返回值是一个字符串
//str=str1.Split(new char[] { '|'},StringSplitOptions.RemoveEmptyEntries); //这里需要非常的注意
//for (int i = 0; i <str.Length; i++)
//{
// Console.WriteLine("{0}个索引的元素是{1}", i, str[i]);
//}
//Console.ReadKey();
#endregion
#region 字符串的比较,compare()函数,两个字符串相等则返回0,前者大返回1,前者小返回-1;
string str1 = "你好C#";
string str2 = "好好学习";
string str3 = "ABCDEF";
string str4 = "abcdef";
Console.WriteLine(string.Compare(str1, str2));
Console.WriteLine(string.Compare(str3, str4, true));
Console.ReadKey();
#endregion
}
}
}