我有一个结构,我放在一个List<T>
我想在一个特定的位置,以编辑在结构一定的价值。 这是未做结构的复制,编辑复制,并替换在列表中的条目在所有可能的?
Answer 1:
不,是能够做到这一点,你需要参考未提供内部数组的元素List
/ IList
。
如果你有,你可以做到这一点不安全的代码和数组。
Answer 2:
从J.Richter的第三版“通过C#CLR”:
值类型应该是一成不变的:那就是他们不应该限定修改任何类型的实例字段的任何成员。 事实上,我建议值类型有他们的田地被标记为只读,这样编译器会发出错误的,你应该小心写试图修改字段的方法。
...
只要记住,值类型和引用类型有非常不同的行为取决于如何使用它们。
考虑以下代码:
public interface IChangeStruct
{
int Value { get; }
void Change(int value);
}
public struct MyStruct : IChangeStruct
{
int value;
public MyStruct(int _value)
{
value = _value;
}
public int Value
{
get
{
return value;
}
}
public void Change(int value)
{
this.value = value;
}
}
和它的用法:
static void Main(string[] args)
{
MyStruct[] l = new MyStruct[]
{
new MyStruct(0)
};
Console.WriteLine(l[0].Value);
l[0].Change(10);
Console.WriteLine(l[0].Value);
Console.ReadLine();
}
输出是:
0 10
所以它你需要什么。
但是同样不会对工作List<T>
我想通过的原因,由阿列克谢Levenkov提及。 所以,我强烈建议你改变struct
,以class
,如果有问题的类型不是每个实例一成不变的。
Answer 3:
最好的办法可能是让你的结构直接暴露自己的领域,然后用这样的代码:
var temp = myList[3]; temp.X += 4; myList[3] = temp;
我认为.NET未能提供到位是在.NET中显著弱点更新列表项的任何手段,但仍然会考虑在外露场结构为远优于案件的任何替代方案,其中一个希望代表小基团,其不应该被“附接”至任何其它这样的基团的正交值(例如在一个点的坐标,一个矩形的原点和大小等),其结构应是“不可改变”的概念已被重复口头禅很长一段时间,但是,这并不意味着它是很好的建议。 这样的概念从两件事情主要是源于:
- 该修改结构`this`在它们的构造以外的任何成员都离奇。 用这样的怪癖(在一定程度上仍然这样做),适用于物业制定者,而不是结构简单地直接暴露自己的领域。 由于Microsoft包裹所有结构域的特性,这意味着,虽然可变的结构可以有合理的语义,如果他们愿意过曝领域,他们结束了古怪的语义; 微软则归咎于事实,即结构是可变的,而不是与属性的字段的不必要的缠绕古怪的语义。
- 有些人喜欢模拟.NET只具有一种类型的对象,而不是让值类型和引用类型为不同的实体。 所谓的“不可改变的”值类型的行为是足够接近引用类型,他们可以假装他们是同样的事情,而易于可变的值类型的行为是完全不同的。 在现实中,它更容易理解曝光场值类型的行为比了解所有的角落情况下,所谓的“不可改变的”值类型和引用类型不同的行为,并了解后者不理解前者是不可能的。 请注意,虽然值类型可以假装是不可改变的,有现实作为一个不变的值类型没有这样的事情。 唯一的区别是那些可以方便地突变和那些只能笨拙突变之间。
在现实中,如果类型应该代表一小群正交值的,露出的场结构是一个完美的结合。 即使一个具有使用笨重的代码等,以上显示的更新的项目的字段List<structType>
它比使用类类型或所谓的“不可改变”结构的任何替代更好。 知道myList
是一个结构具有暴露场X
将足以完全理解上面的代码。 如果一个使用一个类或“不可改变的”结构将是唯一的远程体面替代myList[3] = myList[3].WithX(myList[3].X + 4);
,但是这将需要所讨论的类型提供一个WithX
(大概的方法WithWhatever()
对每个场法)。 这种方法会增加许多倍,一个代码量将不得不读,找出某些东西的方法实际上会做(有人可能会想到 WithX
会返回一个新的实例,它是相同的旧的,除了值X
但人们不会知道,直到一个阅读所有相关代码;相比之下,知道X
是结构型的外露场就足以知道上面的代码会做。