轩辕kuku
论坛版主
论坛版主
  • UID14
  • 粉丝6
  • 关注1
  • 发帖数78
  • 社区居民
  • 原创写手
阅读:972回复:0

C#开发基础——泛型介绍

楼主#
更多 发布于:2016-06-04 11:02

起初接触C#开发,一直没能理解泛型是什么意思,现在也还在学习阶段。

官方的泛型解释:泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛型类型参数 T,您可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险。

通俗一点,就是当你在定义一个类的时候里面有些结构你是不确定的,不知道它是int、string或者是float等,那么这个时候你就可以用T泛型来定义。当你实例化的时候,根据自己的需要来指定类型。这样就可以让你的代码更好的重复使用。

举个例子,大家熟悉的List<T>链表中的T就是定义的泛型,所以在定义list的时候就可以很随意,比如:

List&lt;int&gt; _intlist = new List&lt;int&gt;();
List&lt;string&gt; _strlist = new List&lt;string&gt;();
List&lt;float&gt; _floatlist = new List&lt;float&gt;();

 其实在C#开发里面还有另外一种方式去定义,比如用关键字var,这样后面赋值的时候也可以根据需要赋值int、string等其他。但是这种方式存在风险。因为这样操作存在一个数据封箱和拆箱的过程。比如:

var list = new ArrayList();
//添加值 ----装箱过程
list.Add(4);
list.Add("string");
 
//取值-----拆箱过程
  
int k = (int)list[0];
string s = list[1].ToString();

不过var关键字是.net3.0的东西,在Unity3d开发中无法使用,不过Unity3d中有ArrayList,它的赋值和取值就是和上面的一样;

ArrayList list = new ArrayList(); 
 
// Use this for initialization
void Start () {
    //装箱过程
    list.Add(4);
    list.Add("string");
    //拆箱过程
    int k = (int)list[0];
    string s = list[1].ToString();
    Debug.Log(k);
    Debug.Log(s);
}

泛型在Unity3D中的使用,用一个比较常见的例子,前面提到过的单例模式应该用的比较多,U3D程序中管理类很多都采用单例,那么久存在ResourceSingleton、MessageSingleton等很多的单例类,为了方便代码复用和维护,我们可以将单例类的特点抽象出来。

public abstract class Singleton&lt;T&gt; where T : class, new() {
        protected static T _Instance = null;
        public static T Instance
        {
            get
            { 
                if (null == _Instance)
                {
                    _Instance = new T();
                }
                return _Instance; 
            }
        }
         
        protected Singleton()
        {
          
            Init ();
        }
        public virtual void Init() {}
    }
}

从上面的代码可以看到这个抽象类包含泛型,而且这个泛型有约束条件,泛型只能是类,而且还是一个有构造函数的类。有了这个抽象的类,在建立单例类的时候就可以很轻松的去继承,比如:

public class MessageSingleton:SingleTon&lt;MessageSingleton&gt;
{
      public override void Init()
      {
      }
}
 
public class ResouceSingleton:SingleTon&lt;ResourceSingleton&gt;
{
      public override void Init()
      {}
}
最后总结一下泛型的约束类型:

约束说明
where T:struct对于结构约束,T是值类型
where T:class必须为引用类型
where T:IFoo泛型必须实现接口IFoo
where T:new()泛型必须有默认构造函数
where T:T2泛型T1派生泛型T2
where T:Foo泛型T必须派生基类Foo

图片:68_14_a728a0831681809.jpg

最新喜欢:

747a747a 归海一啸归海一啸

欢迎分享

游客

返回顶部