C#变量引用混淆

时间:2017-08-10 05:03:50

标签: c#

以下是示例代码:

pets

完整的代码可以在这里找到:https://pastebin.com/raw/uB2B7A9g

此代码的输出不是我预期的。

我原以为: 靴子 布拉德利 晶须

但实际输出是: 晶须 靴子 布拉德利

不是pets只是指针吗?

因此,如果我将petsList添加到pets,然后修改petsList[0],那么petsList[0]应该指向已修改的变量吗?

但事实并非如此,pets指向未经修改的List<List<Pet>> petsList = new List<List<Pet>>(); List<Pet> pets = new List<Pet>() { new Pet {Name = "Whiskers"}, new Pet {Name = "Boots"}, new Pet {Name = "Bradley"}, }; pets = pets.OrderBy(pet => pet.Name).ToList(); petsList.Add(pets); foreach (Pet pet in petsList[0]) { Console.WriteLine("{0}", pet.Name); } 变量。

解决此问题的唯一方法是:

<input type="text" ng-model="Amount"/>

app.directive("editor", function(){
 return {
        restrict: "A",
        require: 'ngModel',
      link: function (scope, element, attrs) {
        element.onblur('blur', function (e) {
             alert('as')
             // i want text box value here 
             return (value).toFixed(2);
        });
   }


        }
    };
});

2 个答案:

答案 0 :(得分:2)

问题不在于Add()之后引用的相等性。 如果您为参考平等添加此检查,您将看到问题所在:

petsList.Add(pets);
Console.WriteLine(object.ReferenceEquals(petsList[0],pets)); // true
pets = pets.OrderBy(pet => pet.Name).ToList();
Console.WriteLine(object.ReferenceEquals(petsList[0], pets)); // false

当您撰写pets = pets.OrderBy(pet => pet.Name).ToList();时,您正在更改pets被绑定的引用,之后petsList[0]和pets不再等于引用。因此,您还需要将petsList[0]设置为该新引用。

答案 1 :(得分:2)

  

不是宠物只是指针吗?

是的,pets是引用类型

  

所以,如果我将宠物添加到petsList,然后修改宠物,那么   petsList [0]应该指向修改后的变量?

如果您“修改宠物”,请更正 但是行pets.OrderBy(pet => pet.Name).ToList();不会修改现有的集合,而是会返回List<Pet>的新实例。

因此,在您的示例中petsList[0]仍将引用原始集合,其中pets在订购后将引用新集合。

要修改现有集合,可以使用List.Sort方法,但由于集合是Pet类型的集合 - 您需要为此类型创建自定义比较器。没有自定义比较器项目将按引用进行排序。