C# 索引被误用了吗?

C# 索引被误用了吗?,c#,.net,C#,.net,在我的C代码编写经验中,我看到了许多代码片段,其中IDictionary[index]setter用于添加新值: var dictionary = new Dictonary<long, string>(); ... dictionary[1] = "one"; //assume we want to add new value here 因此,开发人员不使用dictionary.Add1,而是通过indexer调用重写旧值(如果它存在的话),这等于AddOrUpdate操作 我认

在我的C代码编写经验中,我看到了许多代码片段,其中IDictionary[index]setter用于添加新值:

var dictionary = new Dictonary<long, string>();
...
dictionary[1] = "one"; //assume we want to add new value here
因此,开发人员不使用dictionary.Add1,而是通过indexer调用重写旧值(如果它存在的话),这等于AddOrUpdate操作


我认为当您试图将值设置为已存在的键时,字典应该抛出异常,就像您试图获取不存在的键时抛出异常一样。这是一个有争议的陈述,但我想将我的观点与你的观点进行比较。

有两个成员做完全相同的事情有什么意义

如果希望有效地将字典用作关联数组,并以与数组相同的方式进行赋值,请使用索引器。如果您想在字典中添加更安全的内容,请使用Add

将索引器抛出现有条目将使其行为与其他集合(如数组和列表)的索引器完全不同


编辑:请注意,字典索引器的行为当然已经略有不同,当您试图获取未给定值的条目时,会引发异常。在某些方面,这与访问超出范围的索引是一样的,我想…

有两个成员做完全相同的事情有什么意义

如果希望有效地将字典用作关联数组,并以与数组相同的方式进行赋值,请使用索引器。如果您想在字典中添加更安全的内容,请使用Add

将索引器抛出现有条目将使其行为与其他集合(如数组和列表)的索引器完全不同


编辑:请注意,字典索引器的行为当然已经略有不同,当您试图获取未给定值的条目时,会引发异常。在某些方面,这与访问超出范围的索引是一样的,我想…

这肯定是一个意见问题,我个人更喜欢现有的行为。没有什么能阻止您创建实现IDictionary并提供所需行为的自定义类型。

这绝对是一个意见问题,我个人更喜欢现有行为。没有什么可以阻止您创建实现IDictionary并提供所需行为的自定义类型。

为什么要这样做?对我来说,这是正常的行为。
您希望如何更新字典中的值?据我所知,开发者应该删除这个keyvaluepair,而不仅仅是在字典中添加新的keyvaluepair,不是吗?

为什么会这样?对我来说,这是正常的行为。
您希望如何更新字典中的值?据我所知,开发人员应该删除这个keyvaluepair,而不仅仅是在字典中添加新的keyvaluepair,不是吗?

这似乎是一个完全主观的问题,没有实际的理性基础。90%的情况下,当您想将某个内容放入映射时,您需要AddOrUpdate,因此我完全支持使用最简单的语法来表示该操作。顺便说一句,字典会抛出一个异常,真是糟透了。正确的API是以值的元组形式返回结果,但C会让这变得很痛苦。这似乎是一个完全主观的问题,没有实际的理性基础。90%的情况下,当您想将某个内容放入映射时,您需要AddOrUpdate,因此我完全支持使用最简单的语法来表示该操作。顺便说一句,字典会抛出一个异常,真是糟透了。正确的API是以value exists?、value的元组形式返回结果,但C会让这很痛苦。