Утомленная вещь с делегатом (может быть, неправильный способ обратного вызова?) - PullRequest
0 голосов
/ 31 октября 2018

Я хочу изменить какой-либо текст в режиме обратного вызова, но меня смутил следующий код:

    List<Item> items = new List<Item>();
    Item item = new Item();
    item.Value = "CCC";
    item.ReturnText = () => { return item.Value + "BBB"; };
    items.Add(item);

    item = new Item();
    item.Value = "DDD";
    items.Add(item);

    // expected:
    // Value: CCC, Text: CCCBBB
    // Value: DDD, Text: AAA
    // BUT ACTUALLY THE OUTPUT IS
    // Value: CCC, Text: DDDBBB
    // Value: DDD, Text: AAA
    foreach (var i in items)
    {
        Console.WriteLine(i.ToString());
    }

    public class Item
    {
        public Item()
        {
            ReturnText = null;
        }
        public string Value { get; set; }
        public string Text
        {
            get
            {
                if (ReturnText != null) return ReturnText();
                return "AAA";
            }
            set { }
        }
        public delegate string ReturnTextCallback();
        public ReturnTextCallback ReturnText;

        public override string ToString()
        {
            return "Value: " + Value + ", Text: " + Text;
        }
    }

мой английский плохой, поэтому я хочу, чтобы код мог показать, что я хочу сделать, и, пожалуйста, кто-нибудь может объяснить мне, почему это произошло? спасибо всем

...