C#基础精华03(常用类库StringBuilder,List<T>泛型集合,Dictionary<K , V> 键值对集合,装箱拆箱)
常用类库StringBuilder
StringBuilder高效的字符串操作
当大量进行字符串操作的时候,比如,很多次的字符串的拼接操作。
String 对象是不可变的。 每次使用 System. String 类中的一个方法时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。 在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常大。 如果要修改字符串而不创建新的对象,则可以使用 System.Text. StringBuilder 类。 例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。
StringBuilder != String//将StringBuilder转换为String.用ToString();
StringBuilder仅仅是拼接字符串的工具,大多数情况下还需要把StringBuilder转换为String.
StringBuilder sb = new StringBuilder();
sb.Append();//追加字符串
sb.ToString();//把StringBuilder转换为字符串。
sb.Insert();
sb.Replace();
List<T>泛型集合
List<T>是C#中一种快捷、易于使用的泛型集合类型,使用泛型编程为编写面向对象程序增加了极大的效率和灵活性。
1、List<T>用法
(1)创建一个List<T>泛型集合对象实例
List<T> list = new List<T>();// T 为列表中元素的类型 List<string> mlist = new List<string>();//创建了一个 string 类型的集合
(2)以一个集合作为参数创建新的泛型集合对象实例
string[] strArr ={"1","2","3","4","5"}; List<string> strList =List<string>(strArr);//把数组作为参数新建一个string类型集合
2、添加元素到List<T>
(1)添加一个元素
strList.Add("Hello");//把一个字符串添加到strList集合中
(2)添加一组元素集合
string[] strArr ={"1","2","3","4","5"}; strList.AddRange(strArr);//把数组添加到集合中,数组也可以理解为一个有限长度的集合
(3)在指定位置添加要添加的元素
Insert(int index, T item);//index 为要添加元素的位置
以下示例:
strList.Insert(1,"萨瓦迪卡");//在集合中第1个元素后面的位置插入一个元素
3、泛型集合的遍历
可以使用 foreach 循环轻松遍历 List<T> 中的所有元素,示例:
foreach(string s in strList) { Console.WriteLine(s);//输出遍历到的元素的值 }
Dictionary<K , V> 键值对集合
下面是对于Dictionary的一些常用的操作,包括遍历,添加,删除等
(1)新建一个Dictionary<Keys ,Values> 键值对集合
//新建一个键是int类型 ,值是 string类型的键值对集合 Dictionary<int,string> dictionary =newDictionary<int,string>();
(2)往键值对集合添加数据
//注意:这里的键可以是声明类型的范围的任意值,不必按照顺序,会跟stirng类型的值相对应 dictionary.Add(1,"张三"); dictionary.Add(21,"李四"); dictionary.Add(33,"王五"); dictionary.Add(4,"赵六");
(3)遍历键值对集合的Keys(键)和Values(值)
foreach(KeyValuePair<int,string> kvp in dictionary) { //输出遍历到的键值对集合元素的键和值 Console.WriteLine("key={0},value={1}", kvp.Key, kvp.Value); }
(4)遍历Keys(键)
foreach(int j in dictionary.Keys) { //输出遍历到的键值对元素的键 Console.WriteLine("key={0},value={1}", j, dictionary[j]); }
(5)遍历Values(值)
//遍历Values foreach(string item in dictionary.Values) { //输出遍历到的Values(值) Console.WriteLine("value:{0}", item); }
(5)判断键值对集合是否包含某个Keys(键)
//判断是否包含 2 这个键,返回bool类型,true则包含 if(dictionary.ContainsKey(2)) { //输出这个键所对应的值 Console.WriteLine(dict[2]); }
1.装箱、拆箱必须是: 值类型→引用类型 或 引用类型→值类型。
object,接口。值类型是可以实现接口。
Person p=new Student();//这个叫隐式类型转换,不叫装箱。
Student stu=(Student)p;//这个叫显示类型转换,不叫拆箱。
int类型为什么能装箱到object类型,但不能装箱到string类型或Person类型,
因为object类型是int类型的父类。
2.拆箱时,必须用装箱时的类型来拆箱
装箱时如果是int,拆箱必须用int,不能用double
3.方法重载时,如果具有该类型的重载,那么就不叫拆箱或装箱。
int n=10; Console.WriteLine(n);//没有发生装箱,因为方法重载。
==============================
1.以下代码进行了几次装箱?(3次装箱,1次拆箱,注意数字与字符串相加,最终调用的是string.Contact())
int n = 10;
object o = n;
n = 100;
Console.WriteLine(n + "," + (int)o);
Console.ReadKey();
//通过Reflector查看,并说明为什么?