首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ImmutableArray在c#中是什么

ImmutableArray在c#中是什么
EN

Stack Overflow用户
提问于 2013-06-26 11:22:44
回答 2查看 10.1K关注 0票数 17

我看到

此包提供线程安全的集合,并保证不会更改其内容,也称为不可变集合。

但是我不明白什么是确切的,什么时候我们应该使用ImmutableArray?

编辑:如今,微软的github软件包已经成为.NET生态系统的一部分。参考资料现在在这里

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-26 11:27:52

不可变数组类似,但与readonly对象不完全相同。后者可以用来阻止你改变它,但它仍然可以被别人改变。与ExpandoObject或大多数其他对象列表和C#中的其他对象不同,不可变数组保证永不更改。

这也意味着定义后不能更改值,或者可以将数组附加到其中。当使用方法更改或更新时,您将收到一个新的不可变数组。

例如:

代码语言:javascript
复制
ImmutableArray<byte> byteArray = ImmutableArray.Create(new byte[] { 0, 1, 2, 3 });

将始终具有可变数组new byte[] { 0, 1, 2, 3 }提供的值,除非再次定义它。

票数 17
EN

Stack Overflow用户

发布于 2013-06-26 11:29:25

不可变对象可以定义为其状态在创建后不能修改的对象。最广泛使用的不可变对象当然是String对象。当线程安全问题和/或必须以readonly模式访问代码之外的对象实例时,不可变对象非常有用。

优势:

  • 螺纹安全
  • 在类之外传递不可变对象的引用是安全的,而不存在更改数据的风险。

Disadvantages:

  • 内存使用
  • 更新和追加的速度是O(log )(它被实现为二叉树)

如何使用:

一般来说,您将使用ImmutableArray静态类的工厂方法,如在此描述

代码语言:javascript
复制
// open the namespace
using System.Collections.Immutable;

可以从可变数组创建不可变数组,如下所示:

代码语言:javascript
复制
var array1 = ImmutableArray.Create<byte>(new byte[] { 0, 1, 2, 3 });
var astring = ImmutableArray.Create<char>("test".ToCharArray());

或者我们可以从另一个不可变数组中创建不可变数组。

代码语言:javascript
复制
var array2 = ImmutableArray.Create<byte>(new byte[] { 0, 1, 2, 3 });
var array3 = array1 + array2;

在这种情况下,array3不会消耗更多内存。

enumeration,支持ImmutableArray,即IEnumerable<T>。因此,它可以用于如下:

代码语言:javascript
复制
foreach (byte b in array1)
    Console.Write(b + " ");

它实现了ICloneable接口:

代码语言:javascript
复制
array5 = array1.Clone();

ImmutableArray<T>还重写和实现了Equals()和'==‘和'!=’操作符。

代码语言:javascript
复制
// similar to array1 == array2
Console.WriteLine("array1 equals array2: {0}", (array1.Equals(array2)); 

到目前为止,您可以在array1 != array2! Equals()相同的情况下使用上面的代码行。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17318688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档