在switch语句中作为返回值的字符串会被驻留吗?
问题:switch语句返回的字符串是否会被驻留?
我编写了一个返回值为字符串的switch语句,想知道返回的字符串是否会被驻留(因为它们可能被多次引用)。
假设我们有一个名为DogBreed的枚举,代码如下:
private static string DogBreedToString(DogBreed dogBreed) { return dogBreed switch { DogBreed.GoldenRetriever => "golden_retriever", _ => throw new InvalidOperationException($"Breed ({dogBreed}) is unsupported"), }; }
换句话说,如果从代码的不同部分两次调用该方法,两处代码是否会接收到同一个"golden_retriever"实例的引用?
回答
在C#中,编译时确定的字符串字面量会自动被字符串驻留。你代码里的"golden_retriever"属于编译期就能确定的字面量,会被加入CLR的字符串池。所以不管多少次调用DogBreedToString方法并命中这个分支,返回的都是同一个字符串实例的引用。
而异常分支里的插值字符串$"Breed ({dogBreed}) is unsupported"是运行时动态生成的,这类字符串不会自动被驻留,每次触发这个分支时都会创建新的字符串实例。
内容的提问来源于stack exchange,提问作者Tea
相关产品推荐
相关产品推荐

