Почему каждый строковый литерал задокументирован в манифесте сборки? - PullRequest
1 голос
/ 28 февраля 2011

Интересно, почему строковые литералы все задокументированы в манифесте сборки (под 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

Ответы [ 2 ]

4 голосов
/ 28 февраля 2011

Ну, вы видите дважды, но я бы ожидал , что инструкция ldstr просто ссылается на строку из таблиц строк. Это показывается в ildasm, потому что было бы довольно утомительно просто сказать «строка пользователя 7» и т. Д.

4 голосов
/ 28 февраля 2011

Полагаю, инструмент, который вы используете для отображения IL, автоматически разрешает строки и отображает их на месте?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...