【问题标题】:Why do we not work on a reference when operating on a Dictionary value? [closed]为什么我们在对 Dictionary 值进行操作时不对引用进行操作? [关闭]
【发布时间】:2021-08-03 11:30:07
【问题描述】:

为什么从字典中按键检索到的对象不是引用?

我的测试代码:

class Program
{
    static Dictionary<int, Salad> test = new Dictionary<int, Salad>();
    static void Main(string[] args)
    {
        test.Add(1, new Salad() { Vegetables = Vegetables.Tomato });
        test.Add(2, new Salad() { Vegetables = Vegetables.Tomato });
        var newSalad = new Salad() { Vegetables = Vegetables.Carrot };
        test[1] = newSalad;
        var salad2 = test[2];
        salad2 = newSalad;
        Console.WriteLine(test[1].Vegetables);
        //Write: Carrot
        Console.WriteLine(test[2].Vegetables);
        //Write: Tomato
        Console.ReadLine();
    }
    
}
public class Salad
{
    public Vegetables Vegetables { get; set; }
}
public enum Vegetables
{
    Tomato,
    Potato,
    Carrot
}

【问题讨论】:

  • 我不清楚你在问什么。你期待什么不同的输出,为什么?您从Dictionary 读取的对象是引用类型(Salad 实例)。但目前尚不清楚为什么这是一个问题。
  • @David 它认为他们期望将新引用分配给salad2 也应该将其分配给test[2]
  • "为什么从字典中按键检索到的对象不是引用?" - 这是一个参考。 Salad 是一个类,所以它是一个引用类型。
  • 你应该阅读How to Ask
  • @David 我是说 juharr 写的内容

标签: c#


【解决方案1】:

您似乎对 c# 中的引用的实际工作方式有些困惑。
为引用分配新值时,您更改了引用指向的实例,但对该实例的任何其他引用仍指向同一个实例。
salad2test[2] 都以对同一个实例的引用开始,但是你有这一行:salad2 = newSalad;

此行不会更改存储在字典中的引用,它会更改 salad2 引用并使其指向 newSalad 指向的同一 Salad 实例。

test[2] 引用未更改。

如果您的代码包含salad2.Vegetables = newSalad.Vegetables,您将在两个Console.WriteLine() 调用中获得Tomato

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2010-11-22
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2012-08-26
    相关资源
    最近更新 更多