泛型

委托详解

佐手、 提交于 2020-03-06 00:18:47
委托太常见了,能灵活运用可以使你在编程中游刃有余。简单说它就是一个能把方法当参数传递的对象,而且还知道怎么调用这个方法,同事也是力度更小的“接口” 委托的简单使用 一个委托类型定义了该类型的实例能调用一类方法,这些方法含有同样的返回类型和同样参数(类型和个数相同)。委托和接口一样,可以定义在类的外部。如下定义了一个委托类型-Calculator: delegate int Calculator(int x); 此委托适用于任何有着int返回类型和一个int类型参数的方法,如: static int Double(int x){ return x * 2;} 创建一个委托实例,将该此方法赋值给委托实例: Calculator c=new Calculator(Double); 也可以简写成: Calculator c=Double; int resule=c(2); 下面是完整代码: delegate int Calculator(int x); class Program { static int Double(int x) { return x * 2; } static void Main(string[] args) { Calculator c = Double; int result = c(2); Console.Write(result); Console

Swift - 泛型

妖精的绣舞 提交于 2020-03-06 00:15:31
泛型是Swift中重要的类型之一,意为不确定的类型。我们知道带有参数的函数是必需要指定参数的类型的,举个例子观察下面有几个同名函数实现相似的功能,但参数类型不同: 一、节点泛型 func methodOne ( param : String ) { print ( " \( param ) " ) } func methodTwo ( param : Int ) { print ( " \( param ) " ) } func methodThree ( param : Float ) { print ( " \( param ) " ) } 我们可能会根据需求调用不同的函数,但是这么定义方法显得太过冗余。泛型所带来的好处就是我们可以通过定义单个函数来实现上面的功能,使用泛型作为参数的函数叫做 泛型函数 ,现在我们使用泛型来实现与上述功能相同函数定义: func method < T > ( param : T ) { print ( " \( param ) " ) } 然后给这个泛型函数传入不同类型的值: method ( param : 12 ) //输出12 method ( param : "Swift" ) //输出 "Swift" method ( param : 12.34 ) //输出 12.34 上述的泛型函数使用是参数就是一个泛型,泛型函数在声明时使用了

泛型代码中的 default 关键字

淺唱寂寞╮ 提交于 2020-03-05 20:55:30
在泛型类和泛型方法中会出现的一个问题是,如何把缺省值赋给参数化类型,此时无法预先知道以下两点: l T将是值类型还是引用类型 l 如果T是值类型,那么T将是数值还是结构 对于一个参数化类型T的变量t,仅当T是引用类型时,t = null语句才是合法的; t = 0只对数值的有效,而对结构则不行。这个问题的解决办法是用default关键字,它对引用类型返回空,对值类型的数值型返回零。而对于结构,它将返回结构每个成员,并根据成员是值类型还是引用类型,返回零或空。下面MyList<T>类的例子显示了如何使用default关键字。更多信息,请参见泛型概述。 public class MyList<T> { //... public T GetNext() { T temp = default(T); if (current != null) { temp = current.Data; current = current.Next; } return temp; } } 来源: https://www.cnblogs.com/XiaoRuLiang/p/12422308.html

运行时中的泛型

大憨熊 提交于 2020-03-05 20:51:44
当泛型类或泛型方法被编译为微软中间语言(MSIL)后,它所包含的元数据定义了它的类型参数。根据所给的类型参数是值类型还是引用类型,对泛型类型所用的MSIL也是不同的。 当第一次以值类型作为参数来构造一个泛型类型,运行时用所提供的参数或在MSIL中适当位置被替换的参数,来创建一个专用的泛型类型。[JX3] 例如,假设你的程序代码声名一个由整型构成的栈,如: Stack<int> stack; 此时,运行时用整型恰当地替换了它的类型参数,生成一个专用版本的栈。此后,程序代码再用到整型栈时,运行时复用已创建的专用的栈。下面的例子创建了两个整型栈的实例,它们共用一个Stack<int>代码实例: Stack<int> stackOne = new Stack<int>(); Stack<int> stackTwo = new Stack<int>(); 然而,如果由另一种值类型——如长整型或用户自定义的结构——作为参数,在代码的其他地方创建另一个栈,那么运行时会生成另一个版本的泛型类型。这次是把长整型替换到MSIL中的适当的位置。由于每个专用泛型类原本就包含值类型,因此不需要再转换。 对于引用类型,泛型的工作略有不同。当第一次用任何引用类型构造泛型类时,运行时在MSIL中创建一个专用泛型类,其中的参数被对象引用所替换。之后,每当用一个引用类型作为参数来实例化一个已构造类型时,就忽略其类型

泛型类

巧了我就是萌 提交于 2020-03-05 20:16:26
泛型类封装了不针对任何特定数据类型的操作。泛型类常用于容器类,如链表、哈希表、栈、队列、树等等。这些类中的操作,如对容器添加、删除元素,不论所存储的数据是何种类型,都执行几乎同样的操作。 对大多数情况,推荐使用.NET框架2.0类库中所提供的容器类。有关使用这些类的详细信息,请参见基础类库中的泛型。 通常,从一个已有的具体类来创建泛型类,并每次把一个类型改为类型参数,直至达到一般性和可用性的最佳平衡。当创建你自己的泛型类时,需要重点考虑的事项有: l 哪些类型应泛化为类型参数。一般的规律是,用参数表示的类型越多,代码的灵活性和复用性也就越大。过多的泛化会导致代码难以被其它的开发人员理解。 l 如果有约束,那么类型参数需要什么样约束。一个良好的习惯是,尽可能使用最大的约束,同时保证可以处理所有需要处理的类型。例如,如果你知道你的泛型类只打算使用引用类型,那么就应用这个类的约束。这样可以防止无意中使用值类型,同时可以对T使用as运算符,并且检查空引用。 l 把泛型行为放在基类中还是子类中。泛型类可以做基类。同样非泛型类的设计中也应考虑这一点。泛型基类的继承规则 。 l 是否实现一个或多个泛型接口。例如,要设计一个在基于泛型的容器中创建元素的类,可能需要实现类似 IComparable<T> 的接口,其中T是该类的参数。 泛型概述中有一个简单泛型类的例子。

泛型接口

跟風遠走 提交于 2020-03-05 20:05:19
不论是为泛型容器类,还是表示容器中元素的泛型类,定义接口是很有用的。把泛型接口与泛型类结合使用是更好的用法,比如用IComparable<T>而非IComparable,以避免值类型上的装箱和拆箱操作。.NET框架2.0类库定义了几个新的泛型接口,以配合System.Collections.Generic中新容器类的使用。 当一个接口被指定为类型参数的约束时,只有实现该接口的类型可被用作类型参数。下面的示例代码显示了一个从MyList<T>派生的SortedList<T>类。更多信息,请参见泛型概述。SortedList<T>增加了约束where T : IComparable<T>。 这使得SortedList<T>中的BubbleSort方法可以使用表中的元素的IComparable<T>.CompareTo方法。在这个例子中,表中的元素是简单类——实现IComparable<Person>的Person类。 using System; using System.Collections.Generic; //Type parameter T in angle brackets. public class MyList<T> { protected Node head; protected Node current = null; // Nested type is also

2020年2月笔记

徘徊边缘 提交于 2020-03-05 11:32:03
ThreadLocal原理及内存泄露预防 https://blog.csdn.net/puppylpg/article/details/80433271 JVM运行时数据区 https://puppylpg.github.io/java/jvm/2019/11/18/jvm-area.html 缓存与数据库一致性之三:缓存穿透、缓存雪崩、 key重建方案 https://www.jianshu.com/p/b126d466f01a 设计模式学习 (一):多用组合少用继承(C#) https://yq.aliyun.com/articles/606945 面试字节跳动 Android研发岗,已拿到offer,这些知识点该放出来了 https://www.jianshu.com/p/cfac5c131a9b Java泛型最详细的讲解 https://www.jianshu.com/p/469a900c96fa 深入理解 Java 泛型 https://blog.csdn.net/u011240877/article/details/53545041 Java 泛型:深入理解泛型的类型擦除 https://blog.csdn.net/Strange_Monkey/article/details/87900188 java基础—常用的GC策略,什么时候会触发YGC,什么时候触发FGC?

EF 通用数据层泛型类操作

懵懂的女人 提交于 2020-03-05 08:25:32
using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace DAL { /// <summary> /// MSSql 数据库 数据层 父类 /// </summary> /// <typeparam name="T"></typeparam> public class BaseDAL<T> where T : class, new() { /// <summary> /// EF 上下文对象 /// </summary> DbContext db = new DBContextFactory().GetDbContext(); #region 1.0 新增实体,返回受影响的行数 + int Add(T model) /// <summary> /// 1.0 新增实体,返回受影响的行数 /// </summary> /// <param name=

泛型理解,? extends T, ? super T

江枫思渺然 提交于 2020-03-05 01:23:50
注:在Java中,经常用T、E、K、V等形式的参数来表示泛型参数。 T:代表一般的任何类。 E:代表 Element 的意思,或者 Exception 异常的意思。 K:代表 Key 的意思。 V:代表 Value 的意思,通常与 K 一起配合使用。 ? 通配符类型 无边界的通配符(Unbounded Wildcards), 就是<?>, 比如List<?>    无边界的通配符的主要作用就是让泛型能够接受未知类型的数据. <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类 <? super T> 表示类型下界(Java Core中叫超类型限定), 表示参数化类型是此类型的超类型(父类型),直至Object 注意: 你可以为一个泛型指定上边界或下边界, 但是不能同时指定上下边界. 上界限定符接受 extends 后面类的本身与其子类, 下界限定符接受 super 后面类的本身与其父类。无限定通配符接受任何类。 List<?> list 可以赋值任何类型,但是不能添加具体的类型 List<Object> list 只能赋值List<Object>,但是可以添加任何类型 List<?extends Object> list 与 List<?> list没区别, 可以把List<?>类型付给List<?extends Object>类型 注意:List

泛型数组

和自甴很熟 提交于 2020-03-04 19:36:45
让我们的数据结构可以放置"任何"数据类型 不可以是基本数据类型,只能是类对象 boolean,byte,char,short,int,long,float,double 每个基本数据类型都有对应的包装类 Boolean,Byte ,Char,Short,Int,Long,Float,Double Array类 package com . company ; public class Array < E > { private E [ ] data ; private int size ; // 构造函数 , 传入数组的容量capacity构造Array public Array ( int capacity ) { data = ( E [ ] ) new Object [ capacity ] ; size = 0 ; } // 无参数的构造函数 , 默认数组的容量capacity = 10 public Array ( ) { this ( 10 ) ; } // 获取数组中元素的个数 public int getSize ( ) { return size ; } // 获取数组的容量 public int getCapacity ( ) { return data . length ; } // 判断数组是否为空 public boolean isEmpty ( ) {