如何理解值传递的原理,string类型

[复制链接]
发表于 2025-6-22 21:30:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在 C# 中,参数传递的方式决定了方法内部对参数的修改是否会影响外部调用。对于 string 类型的参数,C# 使用的是按值传递(pass by value),这意味着在方法内部对 string 参数的重新赋值不会影响外部调用中的原始字符串。
详细解释:
1.按值传递(Pass by Value):

  • 对于 string 类型的参数,方法接收的是原始字符串的副本。
  • 在方法内部对 string 参数进行重新赋值,只会改变副本的值,而不会改变原始字符串的值。
2.字符串的不可变性:

  • string 在 C# 中是不可变的(immutable),这意味着一旦创建,就不能被修改。任何对字符串的操作都会创建一个新的字符串实例。
3.内存空间变化:

  • 当你在方法内部重新赋值 string 参数时,会创建一个新的字符串实例。
  • 这会占用额外的内存空间来存储新的字符串。
  • 原始字符串仍旧存在于内存中,直到没有任何引用指向它,才会被垃圾回收器(GC)回收。
代码:
  1. using System;
  2. namespace Test
  3. {
  4.         public class Demo
  5.         {
  6.                 public static void Test()
  7.                 {
  8.                         string str = "初始字符串";
  9.                         Console.WriteLine("调用前: " + str);
  10.                         Fun(str);
  11.                         Console.WriteLine("调用后: " + str);
  12.                 }
  13.                 public static void Fun(string a)
  14.                 {
  15.                         a = "新的字符串"; // 重新赋值
  16.                         Console.WriteLine("方法内: " + a);
  17.                 }
  18.                 public static void Main(string[] args)
  19.                 {
  20.                         Test();
  21.                 }
  22.         }
  23. }
复制代码
运行结果:
调用前: 初始字符串
方法内: 新的字符串
调用后: 初始字符串
如何在方法内部改变外部字符串
代码示例
1.返回值:
  1. public static string Fun(string a)
  2. {
  3.         a = "新的字符串"; // 重新赋值
  4.         return a;
  5. }
  6. public static void Test()
  7. {
  8.         string str = "初始字符串";
  9.         Console.WriteLine("调用前: " + str);
  10.         str = Fun(str);
  11.         Console.WriteLine("调用后: " + str);
  12. }
复制代码
2.使用引用传递(Pass by Reference):
  1. public static void Fun(ref string a)
  2. {
  3.         a = "新的字符串"; // 重新赋值
  4. }
  5. public static void Test()
  6. {
  7.         string str = "初始字符串";
  8.         Console.WriteLine("调用前: " + str);
  9.         Fun(ref str);
  10.         Console.WriteLine("调用后: " + str);
  11. }
复制代码
运行结果
调用前: 初始字符串
方法内: 新的字符串
调用后: 新的字符串
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表