众所周知string的真身是具备值类型操作性质的引用类型,在本文中我们不去探讨它的区别,为了方便描述,统一把string作为值类型来理解。
例子都基于:
class Data { public int Id { get; set; } public string Name; public string Title { get; set; } } var obj = new Data{ Id = 1, Name = "1", Title = "data-1"};
回顾传统基础认识,如果一个对象中封装了值类型与引用类型,针对该对象的操作会统一把该对象的所有属性、字段、等等都作为引用类型对待。
var obj2 = obj;//传递引用 obj2.Id = 2; obj2.Name = "2"; obj2.Title = "title-2"; Console.WriteLine($"obj1: {obj.Id}, {obj.Name}, {obj.Title}"); Console.WriteLine($"obj2: {obj2.Id}, {obj2.Name}, {obj2.Title}"); //输出: obj1: 2, 2, title-2 obj2: 2, 2, title-2
根据以上的原理,天然的传递对象引用就可以间接解决以引用的方式操作对象内部各种成员:
static void fixProperty(Data source) { if(source.Name == "john snow") source.Name = "你也配?知道北境在哪吗?"; if(source.Title == "我想去胡建") source.Title = "龟儿子你上过几年学"; if(source.Id == 1) source.Id = 2; } obj.Id = 1; obj.Name = "john snow"; obj.Title = "我想去胡建"; fixProperty(obj); Console.WriteLine($"obj: {obj.Id}, {obj.Name}, {obj.Title}"); //得到输出:obj: 2, 你也配?知道北境在哪吗?, 龟儿子你上过几年学 //对象内部作为值类型的int和string都已经得到改变
时间: 2024-10-12 21:05:26