Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么';在字符串副本上实习工作?_C# - Fatal编程技术网

C# 为什么';在字符串副本上实习工作?

C# 为什么';在字符串副本上实习工作?,c#,C#,鉴于: 这些结果意味着copiedVariable不受字符串插入的影响。为什么? 有没有一种情况下,使用不被插入的等效字符串是有用的,或者这种行为是由于某些语言细节造成的?如果您仔细想想,字符串插入是编译时在文本上触发的一个过程。这意味着: 将文字赋值/绑定到变量时,它是隐式的 复制引用时,它是隐式的(即字符串a=某个\u其他\u字符串\u变量;) 另一方面,如果您在运行时使用StringBuilder或通过复制来手动创建字符串实例,那么您必须通过调用string类的方法来明确请求对其进行内

鉴于:

这些结果意味着
copiedVariable
不受字符串插入的影响。为什么?


有没有一种情况下,使用不被插入的等效字符串是有用的,或者这种行为是由于某些语言细节造成的?

如果您仔细想想,字符串插入是编译时在文本上触发的一个过程。这意味着:

  • 将文字赋值/绑定到变量时,它是隐式的
  • 复制引用时,它是隐式的(即字符串a=某个\u其他\u字符串\u变量;)
另一方面,如果您在运行时使用StringBuilder或通过复制来手动创建字符串实例,那么您必须通过调用string类的方法来明确请求对其进行内部调用

即使在文件的备注部分中,也说明:

公共语言运行库通过维护 表,称为实习生池,其中包含对 在中以编程方式声明或创建的每个唯一文字字符串 你的节目。因此,使用 特定值在系统中只存在一次。例如,如果你 将相同的文本字符串分配给多个变量,即运行时 从intern检索对文本字符串的相同引用 池并将其分配给每个变量

String类的方法的文档说明它:

创建与指定字符串具有相同值的字符串的新实例 绳子


这意味着它不会仅仅返回对同一字符串的引用(来自实习生池)。再说一次,如果是这样的话,那就没什么用了,是吗

某些语言要求某些方法/过程的结果是副本

例如在
substring
type方法中。语义将是相同的,即使您调用
foo.substring(0,foo.length)
(以及您可能如何实现
stringcopy

注意:IIRC*,但是.NET实现的
string.Substring
并非如此。从这两个方面看都不太清楚。(见下文)

它返回:

一个字符串,其长度等于 在此实例中,从startIndex开始,如果startIndex相等,则为空 到该实例的长度,且长度为零

它注意到:

此方法不会修改当前实例的值。 相反,它返回一个新字符串,长度字符从 当前字符串中的startIndex位置

更新

我记得没错,如果
fallwayscopy
不是
false,它确实会使用
string InternalSubString(int startIndex,int length,bool fallwayscopy)进行检查
Substring
false
传递到此方法

更新2

它看起来像
string.Copy
可以使用
InternalSubString
并将
true
传递给前面提到的参数,但从反汇编来看,它似乎使用了稍微优化的版本,并且可能保存了一个方法调用

很抱歉提供了多余的信息


*我记得的原因是在为IronScheme实现
子字符串
过程时,R6RS规范要求复制该过程:)

这是所需的行为,依我看。如果您希望结果得到保留,请调用
保留
:)
        object literal1 = "abc";
        object literal2 = "abc";

        object copiedVariable = string.Copy((string)literal1);

        if (literal1 == literal2)
            Console.WriteLine("objects are equal because of interning");//Are equal

        if(literal1 == copiedVariable)
            Console.WriteLine("copy is equal");
        else
            Console.WriteLine("copy not eq");//NOT equal