C#意外的属性行为

时间:2017-12-21 11:09:06

标签: c# class struct properties

我无法理解这段小代码的C#语义。

using System;

namespace Test
{
    struct Item
    {
        public int Value { get; set; }

        public Item(int value)
        {
            Value = value;
        }

        public void Increment()
        {
            Value++;
        }
    }

    class Bag
    {
        public Item Item { get; set; }

        public Bag()
        {
            Item = new Item(0);
        }

        public void Increment()
        {
            Item.Increment();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Bag bag = new Bag();
            bag.Increment();

            Console.WriteLine(bag.Item.Value);
            Console.ReadKey();
        }
    }
}

只需阅读我希望在我的控制台中读取1作为输出的代码。

不幸的是我不明白为什么控制台打印0。

要解决问题我可以

  1. Item声明为class而不是struct

  2. public Item Item { get; set; }转换为public Item Item;

  3. 您能解释一下为什么会出现这种情况以及上述“解决方案”解决问题的原因吗?

2 个答案:

答案 0 :(得分:2)

你不应该使用可变结构,他们可能会有奇怪的行为。更改结构值没有任何好处,因为您可以立即更改它们的副本。结构是值类型,这就是为什么您的代码没有按预期工作的原因,因为您已经设置了属性并且每次都有当你改变它时你实际上改变复制而不是原始值(结构不是引用类型)。

潜在的解决方案:

  1. 重构属性(因为使用副本)
  2. 将struct设为类
  3. 使您的结构不可变(使用readonly,例如有关详细信息,请参阅此topic

答案 1 :(得分:0)