首页 > 解决方案 > 递归中未修改字符串值

问题描述

我正在尝试修改递归中的字符串。这是代码:-

using System;


public class Program
{
    public static void Main()
    {
        string s = "abcdc";
        string added = "";
        checkIfPalindrome(s , added);
        Console.WriteLine( added);
    }

    public static void checkIfPalindrome(string s ,  string added)
    {
        //Console.WriteLine(added);
        if(s.Length < 2)
        {
            return;
        }
        if(s[0] == s[s.Length -1])
        {           
            checkIfPalindrome(s.Substring(1,s.Length-2) , added);       
        }
        else
        {           
            added = s[0] + added;           
            checkIfPalindrome(s.Substring(1,s.Length-1), added) ;
        }

    }
}

这是相同的小提琴:-

<iframe width="100%" height="475" src="https://dotnetfiddle.net/Widget/u4119h" frameborder="0"></iframe>

我期望添加在递归内部进行修改,并作为函数调用外部和 main 方法内部的结果出现,因为 string 是引用类型。但是 addedliteral 的值是空字符串。尽管当递归遇到基本情况时,它具有ba价值。

ref当关键字用于传递时,也会反映正确的值added

我的理解错了吗?

标签: c#stringreference

解决方案


在最顶部,您正在为函数中的added本地分配一个值Main。但是你永远不会改变那个值。你只是在改变点的论点checkIfPalindrome。这对本地addedin没有影响Main除非您通过引用使用传递它ref

引用类型具有引用语义,是的。但这并不意味着对引用类型的引用具有相同的属性。如果你修改了 的值added,你会得到你期望的行为——但你只会替换参数的引用——将它指向其他地方。当然,.NET 中的字符串是不可变的,因此您实际上无法更改 的值-added您唯一的选择是通过引用传递字符串(或者更好的是,将其设为返回值,这无论如何都会使递归更加清晰)。


推荐阅读