0x01引言
之前没有研究过C#中的泛型,最近在整理项目代码时发现了一些用法,这里做一个集合整理。
0x02
object(C# Reference)
object是了解泛型绕不过的一个入口,泛型的接口的参数不少都与此相关。下面是翻译MSDN上对泛型的描述:
object是.Net中对于Object的别名。在未定义的C#类型系统中,所有类型,预定义,用户定义,引用类型,值类型都是直接或间接的继承自Object。你可以将任何类型的变量赋予object。
可以把object当作是某种原生类型,当还没有确定用什么类型的时候可以使用object,这种特性非常适合在泛型当中使用。
0x03
Activator.CreateInstance
直接抄代码:Activator.CreateInstance 方法 (Type)
static void Main(string[] args)
{
//CreateInstance-1
System.Object obj = Activator.CreateInstance(typeof(StringBuilder)); // 生成了一个StringBuilder实例
StringBuilder sb = (StringBuilder)obj; // 将object转化为StringBuilder
sb.Append("Hello, there.\n");
Console.WriteLine(sb);
//CreateInstance-2
string[] instances = instanceSpec.Split(';');
Array instList = Array.CreateInstance(typeof(object), instances.Length); // object作为其他类型的基类,可以当作type传递给CreateInstance
System.Object item;
for (int i = 0; i < instances.Length; ++i)
{
Console.WriteLine("Creating instnce of {0}", instances[i]);
item = Activator.CreateInstance(Type.GetType(instances[i])); // 创建instanceSpec中各个类型的实例
instList.SetValue(item, i); // 这些实例的类型都继承自object
}
Console.WriteLine("\nObjects and their default values:\n");
foreach (object o in instList)
{
Console.WriteLine("Type: {0}\nValue: {1}\nHashCode:{2}\n",
o.GetType().FullName, o.ToString(), o.GetHashCode());
}
System.Console.Read();
}
0x04
default(T)
当T为数值类型时,default(T) = 0
当T为引用类型时,default(T) = null
当T为结构类型时,default(T) 返回初始化为零或空的每个结构成员
继续抄代码:What does default(object); do in C#?
class Foo
{
public string Bar { get; set; }
}
struct Bar
{
public int FooBar { get; set; }
public Foo BarFoo { get; set; }
}
static void Main(string[] args)
{
int n = default(int);
Foo f = default(Foo);
Bar b = default(Bar);
Console.WriteLine(n); // 值类型 = 0
Console.WriteLine(f == null); // 引用类型 = null
Console.WriteLine(b.FooBar); // 结构中的值类型 = 0
Console.WriteLine(b.BarFoo == null); // 结构中的引用类型 = null
System.Console.Read();
}
还有一篇文章写的很好:C# Default(T) In Generics