清风淡然 發表於 2025-6-22 22:20:00

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

<p>在 C# 中,参数传递的方式决定了方法内部对参数的修改是否会影响外部调用。对于 string 类型的参数,C# 使用的是按值传递(pass by value),这意味着在方法内部对 string 参数的重新赋值不会影响外部调用中的原始字符串。</p>
<p><strong>详细解释</strong>:</p>
<p><strong>1.按值传递(Pass by Value):</strong></p>
<ul>
<li>对于 string 类型的参数,方法接收的是原始字符串的副本。</li>
<li>在方法内部对 string 参数进行重新赋值,只会改变副本的值,而不会改变原始字符串的值。</li>
</ul>
<p><strong>2.字符串的不可变性:</strong></p>
<ul>
<li>string 在 C# 中是不可变的(immutable),这意味着一旦创建,就不能被修改。任何对字符串的操作都会创建一个新的字符串实例。</li>
</ul>
<p><strong>3.内存空间变化:</strong></p>
<ul>
<li>当你在方法内部重新赋值 string 参数时,会创建一个新的字符串实例。</li>
<li>这会占用额外的内存空间来存储新的字符串。</li>
<li>原始字符串仍然存在于内存中,直到没有任何引用指向它,才会被垃圾回收器(GC)回收。</li>
</ul>
<p>代码:</p>
<pre><code>using System;

namespace Test
{
        public class Demo
        {
                public static void Test()
                {
                        string str = "初始字符串";
                        Console.WriteLine("调用前: " + str);
                        Fun(str);
                        Console.WriteLine("调用后: " + str);
                }

                public static void Fun(string a)
                {
                        a = "新的字符串"; // 重新赋值
                        Console.WriteLine("方法内: " + a);
                }

                public static void Main(string[] args)
                {
                        Test();
                }
        }
}
</code></pre>
<p>运行结果:</p>
<blockquote>
<p>调用前: 初始字符串<br>
方法内: 新的字符串<br>
调用后: 初始字符串</p>
</blockquote>
<p><strong>如何在方法内部改变外部字符串</strong></p>
<p>代码示例</p>
<p><strong>1.返回值:</strong></p>
<pre><code>public static string Fun(string a)
{
        a = "新的字符串"; // 重新赋值
        return a;
}

public static void Test()
{
        string str = "初始字符串";
        Console.WriteLine("调用前: " + str);
        str = Fun(str);
        Console.WriteLine("调用后: " + str);
}
</code></pre>
<p><strong>2.使用引用传递(Pass by Reference):</strong></p>
<pre><code>public static void Fun(ref string a)
{
        a = "新的字符串"; // 重新赋值
}

public static void Test()
{
        string str = "初始字符串";
        Console.WriteLine("调用前: " + str);
        Fun(ref str);
        Console.WriteLine("调用后: " + str);
}
</code></pre>
<p>运行结果</p>
<blockquote>
<p>调用前: 初始字符串<br>
方法内: 新的字符串<br>
调用后: 新的字符串</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/chenshibao/p/18639468
頁: [1]
查看完整版本: 如何理解值传递的原理,string类型