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

[深入学习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 >)称为构造的类型。

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

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