[深入学习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 >)称为构造的类型。
[深入学习C#]输入输出安全性——可变类型形參列表的变化安全性的更多相关文章
- 可变与不可变类型数据,列表的copy方法
我们先来了解一下可变与不可变类型的数据 (1)可变类型:列表,字典(内存中的数据允许被修改) 不可变类型:数字,字符串,元组(内存中的数据不允许被修改) 接着我们通过一个实例来看一看可变与不可变类型数 ...
- python学习(28) 浅谈可变对象的单例模式设计
python开发,有时候需要设计单例模式保证操作的唯一性和安全性.理论上python语言底层实现和C/C++不同,python采取的是引用模式,当一个对象是可变对象,对其修改不会更改引用的指向,当一个 ...
- Python探索记(16)——Python的可变类型与不可变类型
# @Time : 2017/7/8 17:49 # @Author : 原创作者:谷哥的小弟 # @Site : 博客地址:http://blog.csdn.net/lfdfhl # @DESC : ...
- python中的不可变类型和可变类型
在python中整形,字符串,元组是不可变类型,而列表和字典都是可变类型. 对于不可变类型进行重新赋值,相当于是用以前的变量名重新指向了新的地址,这个地址中存的变量值就是重新的赋值 通过python中 ...
- len、is、==、可变于不可变类型
a="asdfghjkl;'iuygb" b="小米" c=['a','b','c'] d= {'name':1,'age':24} # len统计字符或元素的 ...
- python的可变类型和不可变类型
Python有六种数据类型:数字类型.字符串类型.列表类型.元组类型.字典类型和集合类型 其中不可变类型包括三种:数字类型.字符串类型和元组类型 剩余三种为可变类型:列表类型.字典类型和集合类型 可变 ...
- Python-可变类型与不可变类型
可变类型 可以变化的,列表和字典 利用id()函数 查看内存地址 内存地址变化即不可变类型. 内存地址不变化即可变类型 不可变类型 不可以变化的,字符串和数字 字符串内置方法 索引取值 索引切片 成员 ...
- java 不可变类型
1. java不可变性初探 我们先看下面一个例子:代码如下: import java.math.BigInteger; public class BigProblem { public static ...
- SQL反模式学习笔记6 支持可变属性【实体-属性-值】
目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需 ...
随机推荐
- oracle 行转列函数pivot和unpivot
今天接到业务部门的一个需求,需要对同一公司的不同财务指标进行排序,需要用到oracle的行转列函数unpivot. 财务报表的表结构为: 要实现业务部门的排序筛选功能,需要首先将行数据转为列数据: 使 ...
- EF 批量插入,sqlhelper 批量插入
需添加一个using System.Linq; 引用 public void BulkInsert<T>(string connection, string tableName, ILis ...
- IIS Express 错误提示汇总
在做WEB Service开发中,要经常用到IIS Express服务器,有些自己遇到的问题做一个汇总以待后续查找. 错误类型: 问题来源:直接在项目上选择调试运行. 解决方案: 1.直接找到那个文件 ...
- Spring Boot (24) 使用Spring Cache集成Redis
Spring 3.1引入了基于注解(annotation)的缓存(cache)技术,它本质不是一个具体的缓存实现方案,而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的个助攻annotatio ...
- Java&Xml教程(五)使用SAX方式解析XML文件
Java SAX解析机制为我们提供了一系列的API来处理XML文件,SAX解析和DOM解析方式不太一样,它并不是將XML文件内容一次性全部加载,而是连续的部分加载. javax.xml.parsers ...
- Hibernate中使用子查询
子查询: 子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一条SQL语句的查询结果,在Hibernate中HQL查询同样对子查询功能提供了支持. 如下面代码所示: List ...
- JavaScript的相关知识
Oject.assign() // Cloning an object var obj = { a: 1 }; var copy = Object.assign({}, obj); conso ...
- ionic2\ionic3 自定义弹窗
ionic2及ionic3没有了popup及 其templateUrl属性 那我们如何对弹窗里加入自定义元素 从而达到自定义弹窗样式 那么就可以通过写h5页面来实现 自定义弹窗效果: 写个H5的弹窗及 ...
- python 之 sqlite3
# -*- coding: utf-8 -*- ''' 创建数据库日志,三列为时间 身份证号和备注名''' import os import sys import sqlite3 import dat ...
- MyBatis入门3_mapper.xml优化(parameterType简写_NameSpace简写_sql片段_特殊字符处理)_动态SQL
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 优化 1.起别名(一般不用,写全方便查看类出处) 以前 ...