范型(Generics)学习笔记

0x01引言

之前没有研究过C#中的泛型,最近在整理项目代码时发现了一些用法,这里做一个集合整理。

0x02

object(C# Reference)

object是了解泛型绕不过的一个入口,泛型的接口的参数不少都与此相关。下面是翻译MSDN上对泛型的描述:

object是.Net中对于Object的别名。在未定义的C#类型系统中,所有类型,预定义,用户定义,引用类型,值类型都是直接或间接的继承自Object。你可以将任何类型的变量赋予object。

原文:object (C# Reference)

可以把object当作是某种原生类型,当还没有确定用什么类型的时候可以使用object,这种特性非常适合在泛型当中使用。

0x03

扫描二维码关注公众号,回复: 3766915 查看本文章

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

猜你喜欢

转载自blog.csdn.net/u010832643/article/details/82429307