[深入学习C#]输入输出安全性——可变类型形參列表的变化安全性

可变类型形參列表(variant-type-parameter-lists)

  可变类型形參列表(variant-type-parameter-lists )仅仅能在接口和托付类型上出现。它与普通的type-parameter-lists的差异在于,它的每一个类型形參前面能够加上变化性批注:in和out。

  假设前面的变化性批注为out,则该类型形參成为协变类型形參;假设变化批注为in。则该类型形參成为逆变类型形參;假设不存在变化批注,则称该类型形參为固定类型形參

  比如:

interface C<out x ,in y ,z>
{
    x M(x,y);
    z P{get;set;}
}

  在上面的代码中,x为协变类型形參,y为逆变类型形參,z为固定类型形參。

  

类型形參变化安全性

  类型的类型形參列表中出现变化批注会限制类型在类型声明中能够出现的位置。假设存在下面情况之中的一个。则类型 T 是输出不安全 (output-unsafe) 的:

  ● T 为逆变类型形參

  ● T 为具有输出不安全元素类型的数组类型

  ● T 为从泛型类型 S< A1,… AK > 构造的接口或托付类型 S< X1, .. XK >,当中,对于至少一个 Ai,存在下面情况之中的一个:

  ● Xi 是协变或固定的。而 Ai 是输出不安全的。

  ● Xi 是逆变或固定的。而 Ai 是输入安全的。

假设存在下面情况之中的一个。则类型 T 是输入不安全 (input-unsafe) 的 :

  ● T 是协变类型形參

  ● T 是具有输入不安全元素类型的数组类型

  ● T 为从泛型类型 S< A1,… AK > 构造的接口或托付类型 S< X1, .. XK >,当中,对于至少一个 Ai,存在下面情况之中的一个:

  ● Xi 是协变或固定的,而 Ai 是输入不安全的。

  ● Xi 是逆变或固定的。而 Ai 是输出不安全的。

  从直观上看,应在输出位置上禁止使用输出不安全类型,在输入位置上禁止使用输入不安全类型。

  类型假设不是输出不安全的。则是输出安全 (output-safe) 的,假设不是输入不安全的。则是输入安全(input-safe) 的。即输入输出的安全性不存在出于安全和不安全之外的状态。

什么是类型參数

  类定义能够通过在类名后加入用尖括号括起来的类型參数名称列表来指定一组类型參数。类型參数可用于在类声明体中定义类的成员。在下面的演示样例中, Pair 的类型參数为 TFirst 和 TSecond:

public class Pair<TFirst,TSecond>
{
    public TFirst First;
    public TSecond Second;
}

  要声明为採用类型參数的类类型称为泛型类类型。结构类型、接口类型和托付类型也能够是泛型。当使用泛型类时。必须为每一个类型參数提供类型实參:

Pair<int,string> pair = new Pair<int,string> { First = 1, Second = “two” };
int i = pair.First; // TFirst is int
string s = pair.Second; // TSecond is string

  提供了类型实參的泛型类型(比如上面的 Pair< int,string >)称为构造的类型。

时间: 2024-08-01 16:24:41

[深入学习C#]输入输出安全性——可变类型形參列表的变化安全性的相关文章

[深入学习C#]输入输出安全性——可变类型形参列表的变化安全性

可变类型形参列表(*variant-type-parameter-lists) 可变类型形参列表(variant-type-parameter-lists )只能在接口和委托类型上出现.它与普通的type-parameter-lists的差异在于,它的每个类型形参前面可以加上变化性批注:in和out. 如果前面的变化性批注为out,则该类型形参成为协变类型形参:如果变化批注为in,则该类型形参成为逆变类型形参:如果不存在变化批注,则称该类型形参为固定类型形参. 例如: interface C<o

python中的不可变类型和可变类型

在python中整形,字符串,元组是不可变类型,而列表和字典都是可变类型. 对于不可变类型进行重新赋值,相当于是用以前的变量名重新指向了新的地址,这个地址中存的变量值就是重新的赋值 通过python中提供的函数id可以看到变量在内存中存储的位置 >>> a = 10 >>> id(a) 25407616 >>> a = 6 >>> id(a) 25407712 同时,对于0-256之间的任意整形,以及稍微短一点的字符串来讲,相同的值,

len、is、==、可变于不可变类型

a="asdfghjkl;'iuygb" b="小米" c=['a','b','c'] d= {'name':1,'age':24} # len统计字符或元素的个数 >>> print(len(a)) >>> print(a[2]) 16 d >>> print(len(b)) >>> print(b[1]) 2 米 >>> print(len(c)) >>>

[Guava学习笔记]Collections: 不可变集合, 新集合类型

不可变集合 不接受null值. 创建:ImmutableSet.copyOf(set); ImmutableMap.of(“a”, 1, “b”, 2); public static final ImmutableSet<Color> GOOGLE_COLORS = ImmutableSet.<Color>builder() .addAll(WEBSAFE_COLORS) .add(new Color(0, 191, 255)) .build(); 可以有序(如ImmutableS

.net基础扫盲--可变类型(var,dynamic)

之所以要谈及var和dynamic,是因为在使用EF框架和使用MVC的时候,会很频繁的用到他们,所以不得不提他们,以便在接触EF和MVC的时候能够很好的理解和熟练的应用. 先简单说一下var,虽被称作是可变类型,但他并不是一种若类型,只不过他是通过程序推断来确定类型的. 我们可以这么写: static void Main(string[] args) { var i = 10; //经过程序的推断,i最终被推断为 int整型 var j = "10";//同样,经程序推断为字符型 Co

linux学习之路之加密类型及其相关算法

加密类型及其相关算法 随着互联网越演越烈,互联网上的各种攻击层出不穷,因此在互联网上相互传递的信息越来越不安全,因此为了防止用户在互联网上传递的数据被窃取,因此我们很有必须加强传递的数据的安全性. 数据的安全性主要包括以下三个方面: 数据的机密性:保证传递的数据不被读取 要想使传递的数据不被读取,可以对这些数据进行加密,因为默认这些数据是以明文来传递的 整个加密过程可以这么来理解: 加密:plaintext--->转换规则--->ciphertext 解密:ciphertext--->转

Java基础学习1-Java标识符及基本类型

暑假闲来无事,重新学习Java,希望能够加深自己对Java的理解与深入. 第一天,从Java标识符开始. Java标识符的命名规则 - 标识符必须以字母.下划线.美元符$开头. - 标识符其它部分可以是字母.下划线.美元符$和数字的任意组合. - Java标识符的大小写敏感,无长度限制(但是也不要太长,会变成裹脚布的(/ □ \)). - 不可以是Java的关键字(这点只要是有点基础的都会知道啦,Java的关键字还挺多的哦,小心踩到地雷呀). 下面是一个小栗子. /* *测试标识符的写法 */

java 不可变类型

1. java不可变性初探 我们先看下面一个例子:代码如下: 1 import java.math.BigInteger; 2 public class BigProblem { 3 public static void main(String[ ] args) { 4 BigInteger fiveThousand = new BigInteger("5000"); 5 BigInteger fiftyThousand = new BigInteger("50000&quo

Go语言学习笔记(二) [变量、类型、关键字]

日期:2014年7月19日 1.Go 在语法上有着类 C 的感觉.如果你希望将两个(或更多)语句放在一行书写,它们 必须用分号分隔.一般情况下,你不需要分号. 2.Go 同其他语言不同的地方在于变量的类型在变量名的后面.例如:不是,int a,而是 a int.当定义了一个变量,它默认赋值为其类型的 null 值.这意味着,在 var a int后,a 的 值为 0.而 var s string,意味着 s 被赋值为零长度字符串,也就是 "". 3.Go语言的变量声明和赋值 在Go中使