泛型是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#之泛型的更多相关文章
-
一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
-
.NET面试题系列[8] - 泛型
“可变性是以一种类型安全的方式,将一个对象作为另一个对象来使用.“ - Jon Skeet .NET面试题系列目录 .NET面试题系列[1] - .NET框架基础知识(1) .NET面试题系列[2] ...
-
C#4.0泛型的协变,逆变深入剖析
C#4.0中有一个新特性:协变与逆变.可能很多人在开发过程中不常用到,但是深入的了解他们,肯定是有好处的. 协变和逆变体现在泛型的接口和委托上面,也就是对泛型参数的声明,可以声明为协变,或者逆变.什么 ...
-
编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)
建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...
-
6.在MVC中使用泛型仓储模式和依赖注入实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
-
C#泛型详解(转)
初步理解泛型: http://www.cnblogs.com/wilber2013/p/4291435.html 泛型中的类型约束和类型推断 http://www.cnblogs.com/wilber ...
-
C# 泛型
C# 泛型 1.定义泛型类 在类定义中包含尖括号语法,即可创建泛型类: class MyGenericClass<T> { //Add code } 其中T可以遵循C#命名规则的任意字符. ...
-
java8中lambda表达式的应用,以及一些泛型相关
语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...
-
java 泛型
1.Student stu =tool.getObj();右边得到的是Object类型,需要向下转型,强转换. 2. 3. 4.泛型方法不能被静态修饰这样写 5.如果想定义定义静态泛型方法,只能这样写 ...
-
Java泛型的历史
为什么Java泛型会有当前的缺陷? 之前的章节里已经说明了Java泛型擦除会导致的问题,C++和C#的泛型都是在运行时存在的,难道Java天然不支持“真正的泛型”吗? 事实上,在Java1.5在200 ...
随机推荐
-
Dancing Stars on Me---hdu5533(判断是否为正多边形)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5533 题意:平面图中 有n个点给你每个点的坐标,判断是否能通过某种连线使得这些点所组成的n边形为 正n ...
-
四则运算出题器(C++)-BUG修复
定制题目数量这个功能测试: (1)输入题目数为负数时: 可正确处理: (2)输入题目数量为0时: 可正确处理: (3)输入题目数量为小数时: 程序运行出错: 错误分析: 因为代码中题目数量的变量Que ...
-
string与stringbuilder的区别
1.分析string与stringbuilder的区别,我们先来看下面一段代码 首先我们使用string进行字符串的拼接 class Program { static void Main(string ...
-
简易商品信息管理系统——首个Web项目
正文之前 在学习了一段时间的Java Web的内容之后,当然需要有个项目来练练手,我相信大多数人的首选项目都是信息管理系统吧,所以我选择了商品信息管理系统 目前项目源码已全部上传至GitHub,欢迎大 ...
-
深入JavaScript类型判定
JavaScript的数据类型 基本区分方法 ECMAScript标准定义了7种数据类型 6 种 基本类型: Boolean,两种取值:true和false Null,一种取值:null Undefi ...
-
setTimeout、setInterval被遗忘的第三个参数
一.最近在看promise,惊奇的发现:原来 setTimeout不只有两个参数,我还能说什么呢?赶紧探探究竟. function multiply(input) { return new Promi ...
-
MongoDB 中数据的替换方法实现 --类Replace()函数功能
关键字: MongoDB,Replace,forEach 近日接到一个开发需求,因业务调整,需要DBA协助,将MongoDB数据库中某集合的进行替换.例如我们需要将集合A中B字段中,有关<美好& ...
-
ansible基础-加密
一 简介 注:本文demo使用ansible2.7稳定版 众所周知,ansible是很火的一个自动化部署工具,在ansible控制节点内,存放着当前环境服务的所有服务的配置信息,其中自然也包括一些敏感 ...
-
python异常提示表
Python常见的异常提示及含义对照表如下: 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是 ...
-
ES6中的函数和数组补漏
对象的函数解构 我们在前后端分离时,后端经常返回来JSON格式的数据,前端的美好愿望是直接把这个JSON格式数据当作参数,传递到函数内部进行处理.ES6就为我们提供了这样的解构赋值. let json ...