21.结构体传入函数运行结果
21.1 题目
public struct Record
{
public int id;
public string name;
public int[] children;
}
public void DoSomething(Record record)
{
record.id = 6;
record.name = "Bob";
record.children[0] = 7;
}
var record = new Record();
record.name = "Alice";
record.children = new int[] { 1, 2, 3 };
DoSomething(record);
Debug.Log(string.Format("{0}-{1}-{2}", record.id, record.name, record.children[0]));
请问最终的打印结果是什么?
21.2 深入解析
0-Alice-7
考点
- 值和引用的区别
- 特殊引用类型 string
- 结构体中的引用成员
解释
按值传入时,Record 整体是副本;其中 id、name 在副本上修改不影响外部变量。string 为不可变引用类型,对 name 赋值会指向新实例,不改变原字段所指向的字符串。children 为数组引用,副本与外部共享同一数组对象,故 children[0] 的修改对外可见。
21.3 答题示例
最终打印结果为:
0-Alice-7分析:
record是一个结构体(值类型),调用DoSomething(record)时,会传入副本,修改id和name不会影响原结构体。- 但
children是一个引用类型(数组),虽然结构体是值类型,但它内部字段children仍然引用原始数组,因此修改children[0] = 7会影响原数组内容。name是 string,属于引用类型但具有不可变性(immutable),赋值时其实是新建字符串对象,不会影响原始 string。所以输出结果为:
record.id仍为默认值0;record.name仍为"Alice";record.children[0]被改成了7。
21.4 关键词联想
- C# 值类型与引用类型
- struct 行为
- 引用字段修改
- string 不可变性
- 数组引用传递
- 参数传递机制(值传递)
- 内存模型
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com