如何在 .net core 中实现字符串复制?

13

将一个 .NET Framework 应用程序移植到 .NET Core 应用程序时,有一些使用 String.Copy 来复制字符串的情况。但看起来这个方法已经从 .NET Core 中删除了,那么在 .NET Core 应用程序中如何复制字符串?并且它也不在 UWP 中提供。在 .NET Core 中,赋值语句 string b = a; 的含义是否与 .NET Framework 中不同?

以下代码中使用了 copy:

public DataDictionary(DataDictionary src)
        :this()
    {
        this.Messages = src.Messages;
        this.FieldsByName = src.FieldsByName;
        this.FieldsByTag = src.FieldsByTag;
        if (null != src.MajorVersion)
            this.MajorVersion = string.Copy(src.MajorVersion);
        if (null != src.MinorVersion)
            this.MinorVersion = string.Copy(src.MinorVersion);
        if (null != src.Version)
            this.Version = string.Copy(src.Version);
    }

4
为什么要使用 Copy 方法? - Patrick Hofman
3
不,这只是在两种情况下都使用一个参考副本。你知道这个应用程序为什么要使用String.Copy吗?这相当不寻常,通常比使用=更糟糕(因为它涉及创建几乎总是不必要的副本方式)。 - Jon Skeet
1
相关:在.NET中,System.String.Copy有什么用途? - Damien_The_Unbeliever
3
这并没有解释为什么要使用它。你能否问问原开发人员?可能他们不知道在.NET中字符串是不可变的。如果他们真的想确保有独立实例以便锁定它们或进行类似的操作,我建议修复这个不好的实践。 - Jon Skeet
可能是什么是在.NET中使用System.String.Copy的用途?的副本。 - Andrii Krupka
显示剩余3条评论
3个回答

18

这不如string.Copy()那么优雅,但如果出于某种原因您不想要引用相等性,请考虑使用:

string copiedString = new string(stringToCopy);

这是在谷歌上搜索“string.copy c# .net core”时的第一个搜索结果。此外,我的答案确实提供了一个解决方案,回答了“如何在.net core中执行String.Copy?”这个问题。 - Kyle Stay
问题本身不是关于直接复制,而是关于“Copy”方法。 - VMAtm
那么...我应该先问自己问题,然后再回答吗? - Kyle Stay
2
嵌入在“问题”中的是“那么你如何在 .net core 应用程序中复制字符串”。这回答了那个问题。你的负评是无效的。 - EthR
1
这个回答解决了问题,应该被接受为正确答案。 - ejcortes

6
字符串的赋值是与创建副本不同的操作。a = b 只是将两个变量的引用设置为相同的内存段。而 string.Copy 实际上是复制字符串,因此引用不再相同。
然而,我怀疑你是否需要使用 string.Copy。你为什么要有另一个引用呢?我想不出任何常见的情况下你会需要这样做(除非你正在使用非托管代码)。由于字符串是不可变的,所以在这种情况下复制是无用的。
考虑到你更新了使用 string.Copy 的代码,我认为在只使用托管代码的情况下,使用简单的赋值就可以了,不需要使用 string.Copy

请注意,与JavaScript不同,new String(new char[]{'a'}) == new String(new char[]{'a'})仍然为True - devRicher
由于字符串的内部化,我猜这就是“问题”,string.Copy解决了这个问题。 - Patrick Hofman
请记住,字符串重载了 [==] 运算符(https://msdn.microsoft.com/zh-cn/library/system.string.op_equality(v=vs.110).aspx),因此这与内插无关。 - Damien_The_Unbeliever
当然,@Damien_The_Unbeliever说得好。 (顺便问一下:为什么string.Copy不起作用呢?) - Patrick Hofman
谢谢,在代码中有些成员被分配,有些被复制,也许我会把它们全部分配并查看是否有任何测试出现问题。 - fluter
2
如下是Kyle Stay提供的正确答案:var copiedString = new string(stringToCopy.ToCharArray());。有些情况下,你需要两个不同的字符串实例来存储相同的值。例如,单元测试代码可能会操作字符串引用的内存。虽然这种情况很少见,但是它是合法的。 - Michael Brown

2

string newstring = $"{oldstring}";


1
请考虑解释您的代码及其如何帮助解决问题。 - Studocwho
复制任何对象都是一种本质上危险的行为。通常,当我想要一个字符串的副本时,我希望得到一个独立的副本;如果我不小心更改了它,我不会影响到原始字符串。使用字符串插值可以用最少的按键操作实现这一点。 - Greg Higgins
我刚刚测试了一下,新字符串仍然是与旧字符串的对象引用匹配,但是使用 string b = $"{a} ".Trim(); 有效,但空格不能去掉。 - MetaGuru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接