是否有可能从列表访问结构的参考 做出改变?(Is it possible to access

2019-10-17 10:21发布

我有一个结构,我放在一个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中显著弱点更新列表项的任何手段,但仍然会考虑在外露场结构为远优于案件的任何替代方案,其中一个希望代表小基团,其不应该被“附接”至任何其它这样的基团的正交值(例如在一个点的坐标,一个矩形的原点和大小等),其结构应是“不可改变”的概念已被重复口头禅很长一段时间,但是,这并不意味着它是很好的建议。 这样的概念从两件事情主要是源于:

  1. 该修改结构`this`在它们的构造以外的任何成员都离奇。 用这样的怪癖(在一定程度上仍然这样做),适用于物业制定者,而不是结构简单地直接暴露自己的领域。 由于Microsoft包裹所有结构域的特性,这意味着,虽然可变的结构可以有合理的语义,如果他们愿意过曝领域,他们结束了古怪的语义; 微软则归咎于事实,即结构是可变的,而不是与属性的字段的不必要的缠绕古怪的语义。
  2. 有些人喜欢模拟.NET只具有一种类型的对象,而不是让值类型和引用类型为不同的实体。 所谓的“不可改变的”值类型的行为是足够接近引用类型,他们可以假装他们是同样的事情,而易于可变的值类型的行为是完全不同的。 在现实中,它更容易理解曝光场值类型的行为比了解所有的角落情况下,所谓的“不可改变的”值类型和引用类型不同的行为,并了解后者不理解前者是不可能的。 请注意,虽然值类型可以假装是不可改变的,有现实作为一个不变的值类型没有这样的事情。 唯一的区别是那些可以方便地突变和那些只能笨拙突变之间。

在现实中,如果类型应该代表一小群正交值的,露出的场结构是一个完美的结合。 即使一个具有使用笨重的代码等,以上显示的更新的项目的字段List<structType>它比使用类类型或所谓的“不可改变”结构的任何替代更好。 知道myList是一个结构具有暴露场X将足以完全理解上面的代码。 如果一个使用一个类或“不可改变的”结构将是唯一的远程体面替代myList[3] = myList[3].WithX(myList[3].X + 4); ,但是这将需要所讨论的类型提供一个WithX (大概的方法WithWhatever()对每个场法)。 这种方法会增加许多倍,一个代码量将不得不读,找出某些东西的方法实际上会做(有人可能会想到 WithX会返回一个新的实例,它是相同的旧的,除了值X但人们不会知道,直到一个阅读所有相关代码;相比之下,知道X是结构型的外露场就足以知道上面的代码会做。



文章来源: Is it possible to access a reference of a struct from a List to make changes?