【问题标题】:How to update a field of a class when a list of the class gets modified in C#?在 C# 中修改类列表时如何更新类的字段?
【发布时间】:2011-07-21 14:29:21
【问题描述】:

我知道这里的东西是值类型,没有被引用,所以当我更新列表时字段 _num 不会被修改。但我的问题是当我修改包含它的列表时如何更新字段 _num 被修改?

class Foo
{
    public List<object> mylist;

    private int _num;

    public int num
    {
        get
        {
            return _num;
        }
        set
        {
            this._num = value;
            mylist[0] = value;
        }

    }

    public Foo()
    {
        mylist = new List<object>();
        mylist.Add(_num);
    }
}


class Program
{
    static void Main(string[] args)
    {
        Foo my = new Foo();
        my.num = 12;
        my.mylist[0] = 5;
        Console.WriteLine("" + my.mylist[0] + " " + my.num);    ==> output is "5 12"
        Console.ReadLine();
    }
}

可以进行哪些更改以使列表和字段同步?就像我的输出应该是“5 5” 感谢您的帮助!

【问题讨论】:

  • 因为我们刚刚帮助回答了一个包含此特定代码的问题,所以这开始有点像家庭作业的味道。是吗? =)
  • 为什么需要在两个地方存储相同的值?
  • 没有。这是我工作的一部分。我正在实现一些需要此功能的东西。
  • 所以我可以用索引访问它。
  • 也许如果您解释您的设计意图,我们可以以更好的方式帮助您。

标签: c# list field


【解决方案1】:

这可能是也可能不是您想要的...我仍然不确定是否需要按索引修改字段,但是如果您真的想这样做,您是否考虑过为您的类型使用索引器?也就是说,索引器会像这样替换您的列表:

class Foo
{
    public int num;
    public string name;
    public bool isIt;

    public object this[int index]
    {
        get
        {
            switch(index)
            {
                case 0:
                    return num;
                case 1:
                    return name;
                case 2:
                    return isIt;
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }
        set
        {
            switch(index)
            {
                case 0:
                    num = (int) value;
                    break;
                case 1:
                    name = (string) value;
                    break;
                case 2:
                    isIt = (bool) value;
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }
    }
}

那么你可以说:

var foo = new Foo();
foo.num = 13;  // either works
foo[0] = 13;  // either works

【讨论】:

  • 是的,这不是最优雅的,但如果用户真的想要一种直接或通过索引引用属性的方法,它就可以完成这项工作。
  • 确实如此。也消除了管理两组值的需要。对于给定的约束,它很优雅。
  • 这只是您所做的更长的实现,但是以多种方式访问​​它是轻而易举的事。最后是一个非常简单、漂亮和干净的解决方案。谢谢你。非常感激! :)))
  • 它有效,但它完全太聪明了一半。如果我在生产代码中看到这一点,我会有一个想法。
  • @Justin:我不同意这有点像“技巧”,并且随着新字段的添加/删除/等而难以维护。但是,如果用户需要这种双重访问/更新能力,那就可以了。
猜你喜欢
  • 1970-01-01
  • 2013-08-15
  • 2017-09-03
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多