我知道Struct是值类型,而Class是引用类型,但是我似乎无法解决这个问题。

我有一个具有结构列表的类:

public class Basket
{
  string ID{get; set;}
  List<Fruit> fruits{get;set;}

  public struct Fruit
  {
      string Name{get;set;}
      bool IsFresh;
  }
}

当将一个类实例传递给另一个类时,我想更新Structs的IsFresh属性之一,但是代码只是跳过了它:

public class Customer
{
    public string Name{get;set;}
    public Basket Basket{get;set;}

    public Customer(string name, Basket basket)
    {
         this.Name = name;
         this.Basket = basket;
    }

    public ChangeBasket()
    {
        //CODE THAT IS NOT WORKING
        Basket.Fruits[0].IsFresh = false;
    }
}

相同的引用类正在被修改,有价值的结构应该被更新。

为什么这样不起作用?

===============>>#1 票数:3 已采纳

通常,您不应该编写可变结构。 而是分配一个全新的结构。 这里 基本上,正在发生的事情是您正在修改结构的副本,因为它是一个值类型。

===============>>#2 票数:2

首先,访问修饰符有一些问题(当您想在类\\结构之外访问代码时,请使用public)。

您的问题是由于结构是值类型的原因,因此,当您访问列表元素时,您将访问元素的副本,该副本是由列表的索引器“获取器”返回的,而不是列表本身。 这意味着,如果您尝试更新实例,则更新不会真正影响对“真实”实体的更改,而是对复制的实体的更改,这就是为什么会出现编译错误的原因。

===============>>#3 票数:0

这个basket.Fruits[0].IsFresh = false;

应该:

Basket.fruits[0].IsFresh = false;

这样可以解决吗?

===============>>#4 票数:-1

列表为结构列表时,似乎无法使用索引器。 以下代码有效:

var x = Basket.Fruits [0];

x.IsFresh = false;

  ask by Bergkamp translate from so

未解决问题?本站智能推荐:

2回复

试图了解类和结构

我今天上午一直在阅读MSDN的“ C#类和结构”,以试图更好地理解这两个概念。 类是引用类型 。 创建该类的对象时,为其分配对象的变量仅保留对该内存的引用。 当对象引用分配给新变量时,新变量引用原始对象。 通过一个变量进行的更改会反映在另一个变量中,因为它们都引用相同的数据。
5回复

无法分配从方法返回的struct的属性

我收到了以下从德语翻译的错误: 错误BC30068:表达式是一个值,不能是赋值的目标。 我正在尝试执行以下操作: 在哪里我声明Cell为: 我怎么解决这个问题? 我不希望Cell成为一个类,而是一个struct,因为否则任何访问都会在堆上创建一个新对象。 当然我可
4回复

你能在一个结构中有一个类吗?

在C#中是否可以使用具有类型类型的成员变量的Struct? 如果是这样,信息存储在哪里,堆栈,堆,或两者?
1回复

JavaScriptSerializer和ValueTypes(struct)

对于一个项目,我在C#中创建了几个struct。 probject本身是一个ASP.Net MVC 2项目。 剪断: 我创建了这个,因为我需要将char变量限制为特定数量的值。 (我本可以创建一个枚举,但这些值也在数据库中使用,然后我仍然需要转换它们) 现在我需要创建一个
2回复

Java和C#中“primitive”,“value type”,“struct”,“class”,“wrap”的定义

我一直试图理解在Java和C#中使用“原语”以及它们之间的区别(如果有的话)。 我已经提出了一系列关于SO的问题,一些答案似乎混淆了问题而不是澄清它。 一些答案(和一些MS文档)似乎提供了相互矛盾的陈述。 来自SO 什么是Java和C#中的第一类对象? Java和C#中的
3回复

将包含类实例的结构的变量分配给另一个变量

以我的理解,将结构的变量分配给相同类型的另一个变量将产生一个副本。 但是,此规则似乎如下图所示。 你能解释为什么会这样吗?
1回复

为什么使用函数时struct不会改变?

在下面的结构中,我使用函数来遵循策略模式。 这是一个简单的范围枚举器。 如果通过负数长度,它将反向枚举。 但是它没有按预期工作。 当返回_move调用时, Position保持不变。 我想我知道原因了,这是因为struct被复制到了某个地方。 但我似乎找不到复制的地方。
4回复

值得缓存成员结构吗?

我有一个像这样的属性: 我担心的是,每次调用Derived.MinDate都会构造一个新的DateTime ,因此我希望有一个仅构造一次的基础_MinDate 。 但是,既然DateTime仍然是一个结构,这是否有任何影响? 方案1: MinDate构造一个新的DateTime
3回复

我应该使用struct而不是class将项目放入int字典吗

我有一个自定义Entity类(请参见下面的代码)。 此类的对象被填充到Dictionary集合Dictionary<string, Dictionary <uint,Entity>> dt 。 有人问我使用Struct而不是Class,因为值类型不会复制到堆中。 好
1回复

结构约束的协方差

我想知道为什么这样的事情毕竟被允许吗? 如果struct是值类型,则协方差将不起作用,因为struct是值类型。 我在这里想念什么?