Re[5]: какого цвета роза, когда на нее никто не смотрит?
От: ghostrider Беларусь https://www.linkedin.com/in/andreipushkin
Дата: 04.02.03 12:53
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>Имхо, перед тем как такое советовать, следует посмотреть, что компилятор сделает с обращением к такой константе.

L>Как видишь, в IL-е никакого обращения к статической переменной нет. Вместо этого компилятор подставил строковый литерал. Поэтому, если ты измнишь в первой сборке определение CONST, и пересоберешь ее, не пересобирая сборку 2, то ничего хорошего после этого не будет (во второй сборке останется прежднее значение CONST).


собственно я уже хотел остановиться на варианте со static readonly, но заглянул в il-код который у меня получился с const и вот что я там нашел:
сборка 1 (c#)
    public class Tags
    {
        public const String PAGES = "Pages";
        public const String PARENT = "Parent";
        public const String KIDS = "Kids";
        public const String COUNT = "Count";
        public const String TYPE = "Type";
        public const String PAGE = "Page";
        public const String MEDIABOX = "MediaBox";
        public const String CONTENTS = "Contents";
    };

сборка 2 (mc++)
get_Item(PDFO::Tags::PAGES)

    IL_002c:  ldstr      bytearray (50 00 61 00 67 00 65 00 73 00 0C 50 00 61 00 72   // P.a.g.e.s..P.a.r
                                    00 65 00 6E 00 74 00 08 4B 00 69 00 64 00 73 00   // .e.n.t..K.i.d.s.
                                    0A 43 00 6F 00 75 00 6E 00 74 00 08 54 00 79 00   // .C.o.u.n.t..T.y.
                                    70 00 65 00 08 50 00 61 00 67 00 65 00 10 4D 00   // p.e..P.a.g.e..M.
                                    65 00 64 00 69 00 61 00 42 00 6F 00 78 00 10 43   // e.d.i.a.B.o.x..C
                                    00 6F 00 6E 00 74 00 65 00 6E 00 74 00 73 00 2C   // .o.n.t.e.n.t.s.,
                                    34 00 )                                           // 4.

соотв. параметром ф-ции шла строка полная мусора и все работало некорректно
для сравнения вариант со static readonly приводит к
    IL_002c:  ldsfld     string [PDFO_Interfaces]PDFO.Tags::PAGES

при этом переменная содержит корректное значение
... << RSDN@Home 1.0 beta 6a >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.