Интересно, почему строковые литералы все задокументированы в манифесте сборки (под User Strings токен)?
Это кажется немного избыточным, учитывая, что строковый литерал также находитсяCIL напрямую, то есть этот код C #:
public void PrintMessage()
{
string myMessage = "Hello.";
Console.WriteLine(myMessage);
}
компилируется в этот CIL
. method public hidebysig instance void PrintMessage() cil managed
{
.maxstack 1
// Define a local string variable (at index 0).
.locals init ([0] string myMessage)
// Load a string on to the stack with the value "Hello."
ldstr " Hello. "
// Store string value on the stack in the local variable.
stloc. 0
// Load the value at index 0.
ldloc. 0
// Call method with current value.
call void [mscorlib]System.Console: :WriteLine(string)
ret
}
Этот строковый литерал также будет записан в манифесте сборки примерно так (как видно из ildasm ):
**User Strings**
-------------------------------------------------------
70000001 : (11) L"Hello."
Так почему же строковый литерал в обоих местах?Для каких целей он служит?
PS Этот код любезно предоставлен Pro C # 2008 и платформой .NET