C#意外的属性行为[重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#意外的属性行为[重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
我无法理解这段小代码的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。
为了解决这个问题我可以
- 宣布
Item
为class
而不是struct
- 将
public Item Item { get; set; }
转换为public Item Item;
你能解释为什么会出现这种情况以及为什么上述“解决方案”能解决问题?
答案
你不应该使用可变结构,他们可以有奇怪的行为。更改结构值没有任何好处,因为你会立即更改它们copy.Struct是值类型,这就是为什么你的代码没有按预期工作,因为你有设置属性,每次更改它时你实际上改变了副本不是原始值(结构不是引用类型)。
潜在解决方案
- 重构属性(因为使用副本)
- 使struct成为类
- 使你的结构不可变(使用readonly,例如有关更多详细信息,请参阅此topic)
另一答案
我认为这可能是同样的问题https://stackoverflow.com/a/1747702/1199090
你也可以在这里阅读详细信息:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/
以上是关于C#意外的属性行为[重复]的主要内容,如果未能解决你的问题,请参考以下文章