c# - 递归中未修改字符串值
问题描述
我正在尝试修改递归中的字符串。这是代码:-
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 是引用类型。但是 added
literal 的值是空字符串。尽管当递归遇到基本情况时,它具有ba
价值。
ref
当关键字用于传递时,也会反映正确的值added
我的理解错了吗?
解决方案
在最顶部,您正在为函数中的added
本地分配一个值Main
。但是你永远不会改变那个值。你只是在改变点的论点checkIfPalindrome
。这对本地added
in没有影响Main
,除非您通过引用使用传递它ref
。
引用类型具有引用语义,是的。但这并不意味着对引用类型的引用具有相同的属性。如果你修改了 的值added
,你会得到你期望的行为——但你只会替换参数的引用——将它指向其他地方。当然,.NET 中的字符串是不可变的,因此您实际上无法更改 的值-added
您唯一的选择是通过引用传递字符串(或者更好的是,将其设为返回值,这无论如何都会使递归更加清晰)。
推荐阅读
- vue.js - Swiper.js 被窃听:它知道有多个幻灯片,但它不允许您浏览它们
- python - SpaCy Matcher 未返回匹配项
- linux - 在 AWS 上修复 jupyter notebook
- python - 使用 Matplotlib 获取全空白条形图
- android - 将两个 Flutter 模块集成到同一个 Android 项目中
- flutter - Flutter 在容器的边框上添加图标
- r - 加速故障时间建模:使用 CI-s 绘制生存概率(提供示例)
- neo4j - 密码问题,仅在与所有节点连接时才返回结果
- android - Android - 生物特征信息是否与设备上的特定用户或一般设备相关联?
- reactjs - 来自API的分页反应如何检测最后一项