【问题标题】:Why does an entry in a list get changed when I set a variable to that entry and change the variable? [closed]当我为该条目设置变量并更改变量时,为什么列表中的条目会更改? [关闭]
【发布时间】:2020-12-28 17:31:47
【问题描述】:

我的代码看起来像这样;

public ObservableCollection<ParamViewModel> ListOfPhrases{
   get => _listOfPhrases;
   set => SetProperty(ref _listOfPhrases, value);
}

public class ParamViewModel : ObservableObject
{

    bool _selected;
    int _id;
    string _name;
    string _state;

    public bool Selected { get => _selected; set => SetProperty(ref _selected, value); }
    public int Id { get => _id; set => SetProperty(ref _id, value); }
    public string Name { get => _name; set => SetProperty(ref _name, value); }
    public string State { get => _state; set => SetProperty(ref _state, value); }
}

private void OnPhraseTapped(string btnText)
{
   ListOfPhrases.ForEach(x => x.Selected = false);
   var first = ListOfPhrases.FirstOrDefault(x => x.Name == btnText);
   if (first != null) first.Selected = true;

所以当 btnText 是 ABC 时,它首先填充 ListOfPhrases 列表中的一个元素。然后将first的值设置为true。

我的问题是。为什么更改 First 的 Selected 值会更改 ListOfPhrases 中的条目?

If I create this code:

var a = "ABC";
var b = a;
b = "x"

那么我相信更改b 不会更改a 的值

【问题讨论】:

  • 请提供List&lt;Phrase&gt;ListOfPhrases所涉及的类型的详细信息。
  • 正如 Wyck 所暗示的,Phrase 可能是一个引用类型。你对 C# 中的引用了解了多少?
  • ListOfPhrases 几乎肯定包含引用类型对象。基本上所有“指向”实例的变量都将指向同一事物。然而,字符串是不可变的。
  • 所以你的意思是 first 仍然是列表的一部分,如果我用 = 获得对它的引用,那么我可以更改它并且列表中的值也会改变?
  • 重新定义变量(=)和修改成员.Selected = )是有区别的。

标签: c#


【解决方案1】:

参考文献。

长话短说;对象由 REFERENCE 分配。而值类型是自包含在它们自己的内存空间中的。

例子:

// assume the constructor argument assigns to the public property Value
var listOfObjects = new List<SomeObject>() {
  new SomeObject(1),
  new SomeObject(2)
}

var a = listOfObjects[0];
var a.Value = 3;

// will print out 3 instead of 1
Console.WriteLine(listOfObjects[0].Value);

你会想读一些关于这个的。这是在面向对象编程和 C# 中理解的一个非常重要的概念。

要理解这一点,我强烈建议您阅读以下内容:

https://jonskeet.uk/csharp/references.html

【讨论】:

    猜你喜欢
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2015-07-14
    • 2022-11-13
    • 2016-04-04
    相关资源
    最近更新 更多