如何在C#中修改类的列表时更新类的字段?

如何在C#中修改类的列表时更新类的字段?,c#,list,field,C#,List,Field,我知道这里的内容是值类型,没有被引用,所以当我更新列表时,字段_num不会被修改。但我的问题是,当我修改包含字段的列表时,如何更新字段_num class Foo { public List<object> mylist; private int _num; public int num { get { return _num; } set {

我知道这里的内容是值类型,没有被引用,所以当我更新列表时,字段_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();
    }
}
class-Foo
{
公开名单;
私有整数;
公共整数
{
得到
{
返回_num;
}
设置
{
这个。_num=值;
mylist[0]=值;
}
}
公共食物(
{
mylist=新列表();
mylist.Add(_num);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
Foo my=新Foo();
my.num=12;
my.mylist[0]=5;
Console.WriteLine(“+my.mylist[0]+”+my.num);=>输出为“5 12”
Console.ReadLine();
}
}
为了使列表和字段同步,可以做哪些更改?我的输出应该是“5”
谢谢你的帮助

这可能不是你想要的。。。我仍然不确定是否有必要按索引修改字段,但是如果您真的想这样做,您是否考虑过为您的类型使用索引器?也就是说,索引器将替换您的列表,如下所示:

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

这可能不是你想要的。。。我仍然不确定是否有必要按索引修改字段,但是如果您真的想这样做,您是否考虑过为您的类型使用索引器?也就是说,索引器将替换您的列表,如下所示:

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:我不同意这是一个“把戏”,而且随着新字段的添加/删除/等等,它很难维护。但是,如果用户需要这种双重访问/更新能力,它就做到了。是的,它不是最优雅的,但是,如果用户真的想要一种直接或通过索引引用属性的方法,那么它就完成了这项工作。也无需管理两组值。对于给定的约束来说,它是优雅的。它只是实现了这一点,而您所做的时间更长了,但是通过多种方式访问它是轻而易举的事。最后是一个非常简单、漂亮、干净的解决方案。非常感谢。非常感谢这是可行的,但它太聪明了。如果我在生产代码中看到这一点,我会有一个解释。@Justin:我不同意这是一个“把戏”,而且随着新字段的添加/删除/等等,很难维护。但是,如果用户需要这种双重访问/更新能力,它会做到这一点。