Здравствуйте, 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 >>