C# 泛型类和泛型方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var dogCage = new Cage<Dog>();
// 放进去
dogCage.Putin(new Dog("jack"));
dogCage.Putin(new Dog("job"));
// 取出来
var dog2= dogCage.Takeout();
dog2.ShowName();
}
}
public class Dog
{
private string Name;
private int age = ;
public Dog(string dname)
{
Name = dname;
}
public void ShowName()
{
Console.WriteLine("这是一条狗:{0}", Name);
}
public void ShowAge()
{
Console.WriteLine("宠物的年龄为" + age);
}
// 使用重载运算符
public static Dog operator ++(Dog dog)
{
dog.age++; // 年龄自增
return dog;
}
}
// 泛型类的使用,定义笼子
public class Cage<T>
{
T[] array; // 定义一个数组
readonly int Size; // 定义一个笼子大小
int num; // 定义现有的数量
public Cage(int n)
{
// 构造函数
Size = n;
num = ;
array = new T[Size]; // 设置数组(笼子)的大小
}
// 将宠物放到笼子里
public void Putin(T pet)
{
// 如果还没有满,将宠物放到笼子里
if (Size > num)
array[num++] = pet;
else
Console.WriteLine("宠物已经装满了...");
}
// 将宠物取出来
public T Takeout()
{
// 如果有宠物,那么取出来
if (num > )
return array[--num];
else
{
// 如果没有宠物了,那么返回空
Console.WriteLine("笼子空了!!!");
return default(T);
}
}
}
}
泛型方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// 使用泛型方法
var dog1 = new Dog("jack");
dog1.isHabby<Person>(new Person());
dog1.isHabby<int>();
}
}
public class Dog
{
private string Name;
private int age = ;
public Dog(string dname)
{
Name = dname;
}
public void ShowName()
{
Console.WriteLine("这是一条狗:{0}", Name);
}
public void ShowAge()
{
Console.WriteLine("宠物的年龄为" + age);
}
// 泛型方法
public void isHabby<T>(T target)
{
Console.WriteLine("看到 {0} 很开心!!!", target.ToString());
}
}
public class Person
{
//
}
}
使用where添加约束:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var dog = new Dog("jack");
dog.isHabby<Person>(new Person());
// 下面方法会失败,因为使用where添加了约束
//dog.isHabby<int>(3);
}
}
public class Dog
{
private string Name;
public Dog(string name)
{
Name = name;
}
public void ShowName()
{
Console.WriteLine("宠物的名字是:" + Name);
}
// where T:class 表示对该方法添加了只能够传递类的约束
public void isHabby<T>(T target) where T:class
{
Console.WriteLine("见到{0}很高兴...", target.ToString());
}
}
public class Person
{
//
}
}
使用where 还能够对特定的类进行约束:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var dog = new Dog("jack");
dog.isHabby<Cat>(new Cat());
}
}
public class Aminal
{
//
}
public class Cat : Aminal
{
//
}
public class Dog
{
private string Name;
public Dog(string name)
{
Name = name;
}
public void ShowName()
{
Console.WriteLine("宠物的名字是:" + Name);
}
public void isHabby<T>(T target) where T:Aminal
{
Console.WriteLine("见到{0}很高兴...", target.ToString());
}
}
}
泛型接口:允许我们将接口成员的参数和返回值类型设置为泛型参数的接口。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Labardor dog1 = new Labardor();
dog1.Act(new SiteDog());
}
}
public abstract class DogCmd
{
// 定义抽象方法
public abstract string GetCmd();
}
public class SiteDog : DogCmd
{
// 重写抽象方法
public override string GetCmd()
{
return "site";
}
}
// 泛型接口
public interface IDogLearn<C> where C : DogCmd
{
// 接口函数
void Act(C cmd);
}
public class Labardor : IDogLearn<SiteDog>
{
// 实现接口函数
public void Act(SiteDog cmd)
{
Console.WriteLine(cmd.GetCmd());
}
}
}
////////////////////////////////////////////////////////
另一个例子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication2
{
class Program
{
class Employee
{
protected string id;
protected string name;
protected string age;
// 无参构造函数
public Employee() { }
// 有参构造函数
public Employee(string uid, string uname, string uage)
{
this.id = uid;
this.name = uname;
this.age = uage;
}
// 使用泛型
public void printMessage(Stack<Employee> emcee)
{
foreach(Employee s in emcee)
{
Console.WriteLine("id:{0}, name:{1}, age:{2}", s.id, s.name, s.age);
}
}
}
static void Main(string[] args)
{
// 调用泛型
Stack<Employee> empl = new Stack<Employee>();
do
{
Console.Write("请输入一个id:");
string id = Console.ReadLine();
Console.Write("请输入一个name:");
string name = Console.ReadLine();
Console.Write("请输入一个age:");
string age = Console.ReadLine();
Employee e = new Employee(id, name, age);
empl.Push(e);
Console.Write("是否继续(Y/N):");
} while (Console.ReadLine().ToUpper() == "Y");
Employee a = new Employee();
a.printMessage(empl);
}
}
}
使用泛型相比于集合的好处:
1.在编译时就会报错,不需要等到编译时才报错。
2.泛型避免了集合中add添加时类型不一样的装箱和拆箱。
3.代码重用行更高。
泛型已经能够满足很多需求,但是如果要在性能上有提升可以了解一下System.Collections.Specialized
泛型委托
Func<...,out >:有返回值的泛型委托,最后一个为返回值。
Action<...>:无返回值的泛型委托。
扩展方法
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 社区学习
{
class Program
{
static void Main(string[] args)
{
#region 把集合中小于8的字符串打印出来
// 定义一个集合
List<string> strList = new List<string>()
{
"","","","",""
};
IEnumerable<string> Temps = strList.Where(delegate (string a) { return a.CompareTo("") < ; }); // 筛选,注是字符串小于8而不是字符串数值
foreach(string temp in Temps)
{
Console.WriteLine(temp);
}
#endregion
Console.WriteLine("================================");
#region 使用扩展方法
IEnumerable<string> Items = strList.MyWhere(delegate (string a) { return a.CompareTo("") < ; });
foreach (string Item in Items)
{
Console.WriteLine(Item);
}
#endregion
}
} // 定义扩展方法
public static class MyListExt
{
public static List<string> MyWhere(this List<string> list, Func<string, bool> funcWhere)
{
List<string> result = new List<string>();
foreach(string item in list)
{
if(funcWhere(item))
{
result.Add(item);
}
}
return result;
}
}
}
C# 泛型类和泛型方法的更多相关文章
- paip.自定义java 泛型类与泛型方法的实现总结
paip.自定义java 泛型类与泛型方法的实现总结 ============泛型方法 public static <atiType,retType> retType reduce ...
- 转:C# 泛型编程之泛型类、泛型方法、泛型约束
C# 泛型编程之泛型类.泛型方法.泛型约束 分类: asp.net c#2012-08-07 17:36 5998人阅读 评论(0) 收藏 举报 c#编程classobject编译器struct 泛型 ...
- JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符
JAVA之旅(二十一)--泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符 不知不觉JAVA之旅已经写到21篇了,不得不感叹当初自己坚持要重学一遍JAVA的信念,中途也算 ...
- C#动态调用泛型类、泛型方法
在制作一个批量序列化工具时遇到了如下问题,在此记录一下,仅供参考. 主程序加载另一个程序集,将其中的所有类取出,然后对这些类分别调用泛型类或泛型方法.控制台程序解决方案如下: Main工程:提供Wor ...
- JAVA——泛型类和泛型方法(静态方法泛型)
泛型类定义的泛型,在整个类中有效.如果被方法是用,那么 泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了. 为了让不同的方法可以操作不同类型,而且类型还不确定.那么 可以将泛型定义在方 ...
- 采用异步来实现重新连接服务器或者重新启动服务 C#中类的属性的获取 SignalR2简易数据看板演示 C#动态调用泛型类、泛型方法 asp .net core Get raw request. 从壹开始前后端分离[.NetCore 不定期更新] 38 ║自动初始化数据库
采用异步来实现重新连接服务器或者重新启动服务 开启异步监听,不会导致主线程的堵塞,在服务异常断开后一直检测重新连接服务,成功连接服务后通知各个注册的客户端! #region 检测断线并重连OPC服务 ...
- C# 泛型编程之泛型类、泛型方法、泛型约束
来自Hauk的文章 C# 泛型编程之泛型类.泛型方法.泛型约束 所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型. 泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为 ...
- Java 泛型-泛型类、泛型方法、泛型接口、通配符、上下限
泛型: 一种程序设计语言的新特性,于Java而言,在JDK 1.5开始引入.泛型就是在设计程序的时候定义一些可变部分,在具体使用的时候再给可变部分指定具体的类型.使用泛型比使用Object变量再进行强 ...
- Java泛型类和泛型方法
java编程思想说道: 泛型类是应用在整个类上,但同时可以在类中包含参数化方法,而这个方法所在的类可以是泛型,也可以不是泛型,也就是说是否有泛型方法,与其所在的类是否是泛型类没有关系. 泛型方法是的该 ...
- Java中的泛型类和泛型方法区别和联系
泛型的概念大家应该都会,不懂的百度或者google,在java中泛型类的定义较为简单 <span style="font-size:18px;"><span st ...
随机推荐
- golang fmt占位符
golang fmt格式"占位符" golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf. 定义示例类型和变量 type Human stru ...
- vue 首屏渲染优化 -- 这个不错
这篇文章分享了从遇到前端业务性能问题,到分析.解决并且梳理出通用的Vue 2.x 组件级懒加载解决方案(Vue Lazy Component )的过程. 初始加载资源过多 问题起源于我们的一个页面,下 ...
- 在Intellij IDEA中修改模板中user变量名称
在Intellij IDEA中的注释模板中的${user}名称是根据当前操作系统的登录名来取的,有时候登录名称和我们实际的user名称并不相同. 修改方法如下: 方法一:可以在settings的fil ...
- Diamorphine rootkit的使用
仅作LKM rootkit研究之用,滥用后果自负. 查看支持版本是否为2.6.x/3.x/4.x: uname -r 下载代码: git clone https://github.com/m0nad/ ...
- SQL注入之Sqli-labs系列第二十三关(基于过滤的GET注入)
开始挑战第二十三关(Error Based- no comments) 先尝试下单引号进行报错 再来利用and来测试下,加入注释符#,编码成%23同样的报错 再来试试--+,同样的效果 同样的,先看看 ...
- npm 包管理器的使用
1. 权限问题 Warning "root" does not have permission to access the dev dir · Issue #454 · nodej ...
- genimage.cfg.template hacking
#********************************************************************************* #* genimage.cfg.t ...
- 搜索入门_简单搜索bfs dfs大杂烩
dfs题大杂烩 棋盘问题 POJ - 1321 和经典的八皇后问题一样. 给你一个棋盘,只有#区域可以放棋子,同时同一行和同一列只能有一个棋子. 问你放k个棋子有多少种方案. 很明显,这是搜索题. ...
- pc端复制方法
dom结构如下: <div id="btn">复制</div> <input id="content" type="te ...
- nginx负载均衡、nginx ssl原理及生成密钥对、nginx配制ssl
1.nginx负载均衡 新建一个文件:vim /usr/local/nginx/conf/vhost/load.conf写入: upstream abc_com{ip_hash;server 61.1 ...