我试图了解不可变数组结构的以下 3 种方法之间的确切区别:
- 静态方法ImmutableArray
。演员<> - 实例方法 ImmutableArray
。如<托>托> - 实例方法 ImmutableArray
。CastArray
我发现自己在研究这些方法,因为我需要将现有的ImmutableArray<TDerived>
实例转换为ImmutableArray<TBase>
实例。 我的方案类似于以下内容:
public interface IFoo {}
public sealed class Foo: IFoo {}
ImmutableArray<Foo> fooClassArray = GetFoos();
ImmutableArray<IFoo> fooInterfaceArray = // convert from fooClassArray instance
根据我的理解,有效地做到这一点的方法是使用ImmutableArray
ImmutableArray<IFoo> fooInterfaceArray = ImmutableArray<IFoo>.CastUp(fooClassArray);
如果我理解正确,这样做就不需要重新分配底层数组:被fooClassArray
包装的数组是重用的,不需要为fooInterfaceArray
分配全新的数组。
第一个问题:我对ImmutableArray
通过查看ImmutableArray
它们之间有什么区别?
它们的预期用途是什么?在我看来,它们都解决了相同的用例。
它们是否用于执行向下转换操作(与 ImmutableArray
正如你所说,CastUp
不会复制数组。只要每个元素都可以简单地转换为基类型,它就非常有效。请注意,装箱或转换不算作微不足道的铸造(即试图使用它来将int
更改为long
将失败):
public static ImmutableArray<T> CastUp<TDerived>(ImmutableArray<TDerived> items)
where TDerived : class?, T
{
return new ImmutableArray<T>(items.array);
}
CastArray
似乎只是将整个数组转换为您要求的类型。它可以与协方差一起工作,所以它应该或多或少等同于第一个函数(同样,装箱不算在内)。但是,请注意参数类型,它不是ImmutableArray
:
public ImmutableArray<TOther> CastArray<TOther>() where TOther : class?
{
return new ImmutableArray<TOther>((TOther[])(object)array!);
}
As
是CastUp
的概括,允许您也放弃,但代价是:
public ImmutableArray<TOther> As<TOther>() where TOther : class?
{
return new ImmutableArray<TOther>((this.array as TOther[]));
}
你对ImmutableArray<T>.CastUp<TDerived>
方法的理解很好。此方法返回一个新ImmutableArray<TDerived>
,该是原始ImmutableArray<T>
的副本,其中包含使用 as 运算符强制转换为 TDerived 的元素。
总之,如果要将ImmutableArray<T>
转换为 T 是基类或接口,而 TDerived 是派生类的ImmutableArray<TDerived>
,并且想要处理原始数组的元素无法通过在生成的数组中将其设置为 null 来显式转换为 TDerived 的情况,则使用CastUp<TDerived>
。
关于方法ImmutableArray<T>.As<TOther>
和ImmutableArray<T>.CastArray<TOther>
,当您要将ImmutableArray<T>
转换为ImmutableArray<TOther>
并且您确定原始数组的所有元素都可以显式转换为 TOther 时,会使用As<TOther>
。
以下是使用As<TOther>
的示例:
ImmutableArray<int> array = ImmutableArray.Create(1, 2, 3);
ImmutableArray<double> doubleArray = array.As<double>();
Console.WriteLine(doubleArray[0]); // Output: 1
当您想要将ImmutableArray<T>
转换为ImmutableArray<TOther>
并且不确定原始数组的所有元素是否可以显式转换为 TOther,并且您希望通过在生成的数组中将元素设置为 null 来处理无法转换元素的情况时,将使用CastArray<TOther>
。
以下是使用CastArray<TOther>
的示例:
ImmutableArray<object> array = ImmutableArray.Create(1, "2");
ImmutableArray<int> intArray = array.CastArray<int>();
console.WriteLine(intArray[0]); // Output: 1
console.WriteLine(intArray[1]); // Output: null