ImmutableArray<T>有什么区别.As<TOther> 和 ImmutableArr



我试图了解不可变数组结构的以下 3 种方法之间的确切区别:

  1. 静态方法ImmutableArray。演员<>
  2. 实例方法 ImmutableArray。如<托>
  3. 实例方法 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。CastUp静态方法。所以,我可以这样解决我的问题:

ImmutableArray<IFoo> fooInterfaceArray = ImmutableArray<IFoo>.CastUp(fooClassArray);

如果我理解正确,这样做就不需要重新分配底层数组:被fooClassArray包装的数组是重用的,不需要fooInterfaceArray分配全新的数组。

第一个问题:我对ImmutableArray的理解。投掷<>对吗?

通过查看ImmutableArray结构的文档,我发现了 ImmutableArray.As方法和 ImmutableArray。CastArray方法。

它们之间有什么区别?

它们的预期用途是什么?在我看来,它们都解决了相同的用例。

它们是否用于执行向下转换操作(与 ImmutableArray相对。CastUp,实际上用于执行向上投射操作)?

正如你所说,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!);
}

AsCastUp的概括,允许您也放弃,但代价是:

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

相关内容

  • 没有找到相关文章

最新更新