21.结构体传入函数运行结果

  1. 21.结构体传入函数运行结果
    1. 21.1 题目
    2. 21.2 深入解析
      1. 考点
      2. 解释
    3. 21.3 答题示例
    4. 21.4 关键词联想

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

考点

  1. 值和引用的区别
  2. 特殊引用类型 string
  3. 结构体中的引用成员

解释

按值传入时,Record 整体是副本;其中 idname 在副本上修改不影响外部变量。string不可变引用类型,对 name 赋值会指向新实例,不改变原字段所指向的字符串。children数组引用,副本与外部共享同一数组对象,故 children[0] 的修改对外可见。


21.3 答题示例

最终打印结果为:0-Alice-7

分析:

  • record 是一个结构体(值类型),调用 DoSomething(record) 时,会传入副本,修改 idname 不会影响原结构体。
  • 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

×

喜欢就点赞,疼爱就打赏