C#中与NSMutableArray和NSArray相当的是什么?

15

什么是 NSMutableArrayNSArray 在 C# 中的等效物?

C# 是否有可变和不可变类型?我注意到默认情况下 string 是可变的。

作为额外奖励,我如何快速填充 C# 中的数组?

3个回答

17
如果你考虑了NSMutableArrayNSArray的弱类型特性,那么在C#中(至少对于.NET 2.0及以上版本),对应的分别是ArrayListobject[]。例如,在Objective-C代码中如果只有NSString对象在NSMutableArray中,你可以使用List<string>,而如果它们在NSArray中,则应使用指定大小的string[]
为了快速初始化和填充C#中的列表或数组,可以使用所谓的集合初始化器
List<string> list = new List<string> { "foo", "bar", "baz" };
string[] array = { "foo", "bar", "baz" }; // Shortcut syntax for arrays
在C#中,string是不可变的,就像Foundation框架中的NSString一样。每次你将一个新字符串分配给一个变量时,你只是把变量指向或引用另一个对象。

没有意识到关于字符串的问题。谢谢。 - Ethan Allen
快速问题……我怎样创建一个弱类型的列表?你的例子展示了一个强类型的列表。 - Ethan Allen
你不应该再使用弱类型集合了,但如果需要的话,可以使用非泛型的 ArrayList - BoltClock
1
一个 NSArray 是完全不可变的:你不能替换数组中已有的成员,所以它并不完全等同于 object[]。据我所知,.NET Framework 中没有与 NSArray 完全相等的东西(但这也不是什么大问题)。 - zneak
@zneak:啊,是的……我知道我漏掉了什么。谢谢你指出来。 - BoltClock
有人应该创建一个ImmutableList<>,它的元素只能在创建时设置。否则我们就继续过我们的生活吧... - Jonny

6
List<String> stringList = new List<String>();
stringList.Add("Test");

C#中的字符串是不可变的。相当于NSMutableString的类是StringBuilder。

C#与Objective-C不同,方法名称并不能清晰地表示其意图。

例如,String和StringBuilder两个类都有一个名为Replace的方法,你可能会认为它们都是用来替换字符的。

但实际上,String.Replace替换并返回新的字符串,而StringBuilder.Replace则进行就地替换。

大多数类中的大多数方法在C#(以及Java)中也是如此运作的。

在Obj-C中,命名约定很明确,要么是:

[NSString stringByReplacing...]
[NSMutableString replace...]

-2

对于使用C#的Xamarin.iOS:

string[] pickerItemsArray;

pickerItemsArray = new string[]{"Item 1", "Item 2", "Item 3", "Item 4", "Item 5"};

使用 string[] 而不是 ListArrayList 意味着该对象在内存中仍然是不可变的。 - Chad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接