[深入学习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-10-25 19:27:21

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

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

可变类型形參列表(variant-type-parameter-lists) 可变类型形參列表(variant-type-parameter-lists )仅仅能在接口和托付类型上出现.它与普通的type-parameter-lists的差异在于,它的每一个类型形參前面能够加上变化性批注:in和out. 假设前面的变化性批注为out,则该类型形參成为协变类型形參:假设变化批注为in.则该类型形參成为逆变类型形參:假设不存在变化批注,则称该类型形參为固定类型形參. 比如: interface C<

linux 可变类型与不可变类型

Python的每个对象都分为可变和不可变,主要的核心类型中,数字.字符串.元组是不可变的,列表.字典是可变的. 可变类型和不可变类型有些地方区别很大,注意区分. 对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其他变量引用原有对象的话(即引用计数为0),原有对象就会被回收). 不可变类型 以int类型为例:实际上 i += 1 并不是真的在原有的int对象上+1,而是重新创建一个value为6的int对象,i引用自这个新的对象. 可以

可变、不可变类型

不可变类型 1.数字类型 a=100 2.字符串类型 a='hello'  不可修改字符  =>a[0]='A'   ,a只是指向字符串'hello' 3.元组 可变类型 1.列表 a=[12,23,4,5] a.append(123) 2.字典 可变类型可以做为key 实质都是不可变类型 原文地址:https://www.cnblogs.com/zhuxiang1633/p/8848105.html

浅谈Python的可变与不可变类型

a=10;b=a;b=15;print(id(a))print(id(b)) 电脑给10这个对象分配了一块内存空间.它的内存地址是1766916848 然后a这个变量指向了这块内存地址. 因为b=a;所以b也指向了这块内存地址. b=15:电脑又给15这个对象分配了一块内存地址,b又指向了15的这块内存地址. 1766916848这块内存地址里面的值不会被改变.如果没有一个变量指向这块内存地址,那么这块内存地址就会被释放掉. 同理,字符串也是这样. 元组也是不可变类型.   而可变类型[列表,字

python可变和不可变类型

时长总结一下Python基础知识,动手写一写不容易忘记 * Python的数据类型可以分为可变与不可变类型两大类 可变类型:列表 ,字典 不可变类型:数值,字符,元组 * 对不可变类型进行赋值的时候其实是创建了一个新的不可变对象,并将指向原来不可变对象的变量指向这个新的不可变对象,这个时候原来的不可变对象就失去了指向它的变量 ,如果没有新的变量指向它的话,这个不可变对象就会被回收 eg: 1 i=1 2 i+=1 3 i 4 2 实际上此处的i+=1并不是真的在原来的int对象上进行加1,而是重

可变类型与不可变类型的作用和意义

Python中的变量分为可变类型和不可变类型 两种. 可变类型: 数字.字符串.元组.可变集合. 不可变类型: 列表.字典.不可变集合. 这里的可变不可变,是指内存中的那块内容(value)是否可以被改变 根据存储的内容是否可变划分为可变类型与不可变类型.如果是不可变类型,在对对象本身操作的时候,必须在内存中新申请 一块区域(因为老区域是不可变).如果是可变类型,对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连 续申请(+/-)即可,也就是它的address空间地址会保持不变,

[Python]可变类型,默认参数与学弟的困惑

一.学弟的困惑 十天前一个夜阑人静.月明星稀的夜晚,我和我的朋友们正在学校东门的小餐馆里吃着方圆3里内最美味的牛蛙,唱着最好听的歌儿,畅聊人生的意义.突然,我的手机一震,气氛瞬间就安静下来,看着牛蛙碗里三双贪婪的筷子,我犹豫了:不——我的肉…但是本着不让人久等的原则,我不舍地放下了筷子.点亮屏幕,我的眉头不禁紧锁,事情好像并不简单… 什么,还上升到了去医院的程度?现在的年轻人怎么了,怎么那么不注意安全,嗨,真是一届不如一届了,不过也好,没受伤就好…正当我沉浸在我自己的瞎想时,一张图片紧接着医院那

03 可变类型与不可变类型

'''''' ''' 不可变类型:变量的值修改后内存地址不一样 数字类型 int float 字符串类型 str 元组类型 tuple 可变类型: 列表类型 list 字典类型 dict ''' #int number = 100 print(id(number)) #1717008960 number = 111 print(id(number)) #1717009312 #float sal = 1.0 print(id(sal)) #2115946484240 sal = 2.0 prin

[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