当前位置:  开发笔记 > 编程语言 > 正文

为什么列表中的结构状态不能改变?

如何解决《为什么列表中的结构状态不能改变?》经验,为你挑选了1个好方法。

我知道这听起来很愚蠢.但我必须在这里做错事.

说,

struct lala
{
    private bool state1;

    public lala(bool state1)
    {
        this.state1 = state1;
    }

    public void SetState1ToTrue()
    {
        this.state1 = true;
    }

    public bool GetState1()
    {
        return this.state1;
    }
}

然后某个地方......

List lalas = new List();

lalas.Add(new lala(false));
lalas.Add(new lala(false));

lalas[0].SetState1ToTrue();

// Why is it False???
Console.WriteLine(lalas[0].GetState1());

是否有任何变通方法,除了将其更改为:

List lalas = new List();

lalas.Add(new lala(false));
lalas.Add(new lala(false));

lala newLala = lalas[0];
newLala.SetState1ToTrue();
lalas[0] = newLala;

// It's True, finally.
Console.WriteLine(lalas[0].GetState1());

看起来很糟糕,不优雅,浪费了2行代码.如果说1行代码中有任何Linq-ish或函数式编程方法,那将是非常棒的.



1> David M..:

问题出在这一行:

lalas[0].SetState1ToTrue();

第一部分lalas [0]从列表中检索第一个lala,并在隐式变量中作为它的新副本执行.因此,您的SetState1ToTrue在lala上运行,然后立即丢弃,并且列表中的那个保持不变.这与做到这一点是一样的:

lala newLala = lalas[0];
newLala.SetState1ToTrue();

如果你使lala成为一个类而不是一个struct,那么它就变成了一个引用类型,那么临时变量(显式或隐式)就是对列表中lala的引用.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有