泛型是C# 2.0版本才有的语言特性,是具有参数类型占位符的类、结构、接口和方法。这些占位符是类、结构、接口和方法所存储或使用的一个或多个占位符。简单来说,就是变量类型的参数化。

以下是详细demo:

    #region 泛型的约束

    /// <summary>
/// 1.0基类约束
/// </summary>
/// <typeparam name="T">约束成了将来调用的时候只能传入Pig本身或者其子类</typeparam>
public class House<T> where T:Pig
{ } /// <summary>
/// 2.0 引用类型约束
/// </summary>
/// <typeparam name="T">约束成了将来调用的时候只能传入引用类型参数</typeparam>
public class House1<T> where T:class
{ } /// <summary>
/// 3.0值类型约束
/// </summary>
/// <typeparam name="T">约束成了将来调用的时候只能传入值类型参数</typeparam>
public class House2<T> where T:struct
{ } /// <summary>
/// 4.0接口约束
/// </summary>
/// <typeparam name="T">约束成了将来调用的时候只能传入Ipig本身或者Ipig的实现类型参数</typeparam>
public class House3<T>where T:IPig
{ } /// <summary>
/// 5.0构造器约束
/// </summary>
/// <typeparam name="T">约束成了将来调用的时候只能传入 构造器参数</typeparam>
public class House4<T>where T:class ,new()
{
T t;
public House4()
{
t = new T();
}
} /// <summary>
/// 多个参数约束
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="V"></typeparam>
public class House6<T, V>
where T : class
where V : struct
{ } #endregion #region 泛型的继承
public class DogHouse6 : House6<Dog, int>
{ } public class DogHouse61<X, Y> : House6<X, Y>
where X : class
where Y : struct
{ } public class DogHouse62<X, Y> : House6<Pig, decimal>
{ } #endregion #region 泛型方法
/// <summary>
/// 泛型方法 有下列任何一项 均构成重载:
/// 1.泛型方法的参数个数不一致
/// 2.参数类型不一致
/// 3.类型占位符个数不一致
///
///
/// 泛型方法的类型占位符个数一致,但名字不一样 不会构成重载
/// </summary>
public class UserInfoBll
{
public T Get<T>(T t)
{
return t;
} public string GetName<T>(T t, int num)
{
T tt = t;
return "某一个参数类型为泛型,返回值为string";
} public string GetName<T, V>(T t, int num)
{
T tt = t;
return "返回值";
} public T GetName<T>(string str)
{
return default(T);
} public string GetName<T>(T t)
{
T tt = t;
return "返回值";
}
} public class UserInfoBll1<T>
{
T tt;
public T GetT(T t)
{
tt = t;
return tt;
}
}
#endregion #region 泛型方法的重写
public abstract class Father
{
public abstract T SayHi<T, U>(T t, U u) where U : T; // U必须继承于T public abstract T Think<T>(T t) where T : Pig;
} /// <summary>
/// 子类重写父类中的抽象泛型方法的时候,不需要单独再将类型占位符 重新添加约束
/// </summary>
public class Son : Father
{
public override T SayHi<T, U>(T t, U u)
{
return t;
} public override T Think<T>(T t)
{
return default(T);
}
}
#endregion

使用泛型进行缓存管理:

  public   class CacheMgr<T>
{
public static T Get(string cacheKey)
{
return (T)HttpRuntime.Cache[cacheKey];
} public static void Add<TT>(string cacheKey,TT value)
{
HttpRuntime.Cache[cacheKey] = value;
}
}

C#之泛型的更多相关文章

  1. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  2. .NET面试题系列[8] - 泛型

    “可变性是以一种类型安全的方式,将一个对象作为另一个对象来使用.“ - Jon Skeet .NET面试题系列目录 .NET面试题系列[1] - .NET框架基础知识(1) .NET面试题系列[2] ...

  3. C#4.0泛型的协变,逆变深入剖析

    C#4.0中有一个新特性:协变与逆变.可能很多人在开发过程中不常用到,但是深入的了解他们,肯定是有好处的. 协变和逆变体现在泛型的接口和委托上面,也就是对泛型参数的声明,可以声明为协变,或者逆变.什么 ...

  4. 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)

    建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...

  5. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  6. C#泛型详解(转)

    初步理解泛型: http://www.cnblogs.com/wilber2013/p/4291435.html 泛型中的类型约束和类型推断 http://www.cnblogs.com/wilber ...

  7. C# 泛型

    C# 泛型 1.定义泛型类 在类定义中包含尖括号语法,即可创建泛型类: class MyGenericClass<T> { //Add code } 其中T可以遵循C#命名规则的任意字符. ...

  8. java8中lambda表达式的应用,以及一些泛型相关

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...

  9. java 泛型

    1.Student stu =tool.getObj();右边得到的是Object类型,需要向下转型,强转换. 2. 3. 4.泛型方法不能被静态修饰这样写 5.如果想定义定义静态泛型方法,只能这样写 ...

  10. Java泛型的历史

    为什么Java泛型会有当前的缺陷? 之前的章节里已经说明了Java泛型擦除会导致的问题,C++和C#的泛型都是在运行时存在的,难道Java天然不支持“真正的泛型”吗? 事实上,在Java1.5在200 ...

随机推荐

  1. Spring整合activiti-modeler5.16遇到的小问题

    接上一篇整合activiti-modeler并成功创建model:Spring整合activiti-modeler5.16   之后,我尝试运用自定义的model部署流程,但是在部署的过程中又遇到了一 ...

  2. C#全角和半角转换

    在计算机屏幕上,一个汉字要占两个英文字符的位置,人们把一个英文字符所占的位置称为"半角",相对地把一个汉字所占的位置称为"全角".在汉字输入时,系统提供&quo ...

  3. onNewIntent调用时机

    在IntentActivity中重写下列方法:onCreate onStart onRestart  onResume  onPause onStop onDestroy  onNewIntent 一 ...

  4. MVC 模型

    dbcontent var ALLALBUMS=from album in db.albums orderby album.title ascending select album; storeman ...

  5. json字符串相关转换方法

    /** json转换为Map * @param jsonStr json * @return map集合 */ public static HashMap<String, String> ...

  6. ERP_基于Oracle ADF的定制化企业级IT系统解决方案

    2014-12-31 Created By BaoXinjian

  7. OAF_MDS系列1_OAF页面元数据结构MDS的解析(概念)

    2014-06-06 Created By BaoXinjian

  8. 转--Invalidate和postInvalidate的更新view区别

    Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用. Android提供了Inva ...

  9. css针对(各大浏览器、各版本)调兼容

    ie6\ie7\firefox之下各自识别的CSS符号 #1 { color: #333; } /* firefox */ * html #1 { color: #666; } /* IE6 */ * ...

  10. ubuntu 关机,重启,注销命令

    1关机命令 shutdown 好像ubuntu的终端中默认的是当前用户的命令,只是普通用户,因此在终端器中可以使用sudo -sh 转换到管理员root用户下执行命令. 1)shutdown –hel ...