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