Как обновить поле класса, когда список классов изменяется в C #? - PullRequest
0 голосов
/ 21 июля 2011

Я понимаю, что здесь есть типы значений, на которые нет ссылок, поэтому поле _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" Спасибо за помощь!

1 Ответ

3 голосов
/ 21 июля 2011

Это может или не может быть тем, что вы хотите ... и я все еще не уверен, что вижу необходимость изменения полей по индексу, но если вы действительно хотите это сделать, рассматривали ли вы индексатор для вашего типа? То есть индексатор заменит ваш список следующим образом:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...