C#高级编程 第二章 泛型 /**/
//字符串是引用类型 引用类型 : object string
//装箱 拆箱
{
装箱
→→→
值类型 引用类型
←←←
拆箱
引用类型放在堆中
值类型放在栈中
装箱: 栈 堆
............................ 1、先在堆中分配一个空间
. . ...... . 2、栈将堆中的内容复制
. . .空间. . 3、将栈的内容指向堆
. . ...... .
. O →→→10 .
............................
int a = 10
object O = a
拆箱: int b = (int) O 1、先检查堆上空间是否存在值类型
2、将值类型复制至栈中
}
//泛型:将类型参数化得数据类型
↑
将数组和集合的优点结合{
数组的优点是类型强,声明时即指定类型
集合的优点是长度不固定
}
//补充 : override 是重写object 类的方法 {
public override string Tostring()
{
return "车手名"+ a + .......
}
}
//类型为object类型的弊端
{
1、object 类在编译期间是没有类型安全性的(可以通过编译器最后却出错)
2、值类型使用object类会有性能损失(拆装箱) /*是赋值的20倍性能损耗、是强制转换的4倍性能损耗!*/
}
//泛型的命名空间: System.Collections.Gemeric /*Gemeric: 类的*/
//泛型类:
{
Class 名 <T> /*命名规则: 只有一个泛型时 :只用T;有多个泛型时:用T加形容词 如:TKey、TValue */
{
private T a;
Public 名 (T b)
{
a = b;
}
属性→ Public T A
{
get{return a};
set{a = value};
}
}
/Main 下/
实例化→ 名 <string> temp1 = new 名<string>();
}
泛型数组→ List <类名> myracer = new List<类名>();
↑ ↑
↑ 或 string 或 int.....
可以替代ArrayList 赋值:myracer.Add(123....); 取值:myracer[0]
//泛型方法:
{
public void sway<T>(ref T a, ref T b)
{
T c;
c = a;
a = b;
b = c;
}
/*使用*/
实例化 → Class3 cls3 = new Class3();
↑
不是泛型类但包含泛型方法
s1、s2已赋值→ cls3.swap(ref s1,ref s2);
↑
类型随便
}
//泛型优点:
{
1、提高性能避免拆箱装箱
2、安全:如果有赋值错误在编译阶段就能发现
3、提高代码的重用性
}
//补充: 关于 DataGridView
dataGridView1.DataSource = myList //source : 来源
↑ ↑ //grid : 格子
数据绑定 泛型数组 //view : 视野
列名可将属性名改成相应的汉语或用dataGridView1.Colums.HeaderText="...";