Javascript与C#引用类型传参逻辑及运行结果差异求解
代码运行结果差异原因说明
核心原因:两段代码的传参逻辑完全不对等,并非C#与JavaScript引用类型定义存在差异
- JavaScript代码中传入
old函数的是person.age,属于基础数值类型
JS的基础类型(Number、String、Boolean等)均为按值传递,传入函数的是原始值的拷贝,函数内对参数的修改只会作用于这个拷贝,不会影响原对象的age属性,因此最终输出20。 - C#代码中传入
Old方法的是完整的Person对象,属于引用类型
C#的引用类型传参时,传入的是对象引用的拷贝,这个拷贝和外层的引用指向堆内存中同一个Person实例,方法内修改该实例的Age属性,实际修改的是同一个对象的属性值,因此最终输出30。
验证示例
对等逻辑的JavaScript代码(传完整对象,输出30)
class Person { constructor(age) { this.age = age; } } let person = new Person(20); const old = (p) => { p.age += 10; }; old(person); console.log(person.age); // 输出30
对等逻辑的C#代码(传Age属性值,输出20)
class Program { public class Person { public int Age; } public static void Old(int age) { age += 10; } static void Main(string[] args) { var person = new Person() {Age = 20}; Old(person.Age); Console.WriteLine(person.Age); // 输出20 } }
补充说明
两种语言的引用类型传参行为逻辑是一致的:只要传入的是引用类型的实例,修改实例的属性都会作用于原对象;如果传入的是值类型/基础类型,修改的都是值的拷贝,不会影响原值。
内容的提问来源于stack exchange,提问作者Jim_Mcdonalds
相关产品推荐
相关产品推荐

