2009-02-23 2 views
1

У меня есть класс-оболочка, который инкапсулирует часть информации, которая должна передаваться в виде байтового массива.Const vs protected static readonly

Таким образом, класс инкапсулирует необходимый заголовок (с полями, такими как DATA_LENGTH или MESSAGE_TYPE) в соответствующие позиции байтов. Для этого я хочу, чтобы определить позиции и длины констант, например:

HEADER_DATA_LENGTH_IX = 0; 
HEADER_DATA_LENGTH_LENGTH = 2; 

что означает DATA_LENGTH начинается с 0 и занимает два байта.

, но до сих пор я борюсь с созданием их констант или статических полей readonly. Const не может быть защищен, поэтому я не смогу получить новый класс и изменить константы, если их использовать, с другой стороны, я могу объявить новые константы в производном классе и использовать их.

Каким будет ваш подход?

+0

Какая технология это? .Сеть? Ява? –

+0

Тег не был тем, когда я впервые публиковал ответ, извините –

ответ

4

Если вы хотите изменить значение этих Params в производном классе, вы можете сделать их readonly и изменить их в конструкторе производного класса

я бы не сделать их const так или иначе, потому что они re not ...

+0

Если вы хотите установить значение в производном классе, вы не хотите, чтобы он был статичным, так как это можно установить только в статическом конструкторе –

0

Я бы не сделал их постоянными, потому что они просто не являются константами. Когда вы объявляете что-то как const, вы должны спросить себя: может ли это измениться? Длительность ваших сообщений может измениться в один день, поэтому их лучше всего читать.

+0

Они не могут измениться, ну, может быть, тогда идея состоит в том, чтобы получить новый класс для обработки изменений, поэтому для жизни класса значения будут сохраняться , будет постоянным и только там, чтобы избежать «магических чисел» –

4

Основное отличие заключается в том, когда переменная инициализируется. «readonly» устанавливается при инициализации или в contructor, а «const» устанавливается во время компиляции.

Я думаю, что большое решение - это если вы хотите наследовать класс и переопределить значение. Если вы это сделаете, перейдите только на чтение. В противном случае я не думаю, что это действительно имеет значение.

чтения C# ссылка: http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx

сопзЬ C# ссылка: http://msdn.microsoft.com/en-us/library/e6w8fe1b.aspx

0

Создайте внутренний класс с константами. Затем классы вывода могут переопределить внутренний класс и при необходимости изменить константы.

например. Базовый класс:

public class Stuff 
{ 
    public class HeaderInformation 
    { 
    public const int HEADER_DATA_LENGTH_IX = 0; 
    public const int HEADER_DATA_LENGTH_LENGTH = 2; 
    } 
} 

Тогда производный класс может это сделать:

public class DerivedStuff : Stuff 
{ 
    public new class HeaderInformation : Stuff.HeaderInformation 
    { 
    public new const int HEADER_DATA_LENGTH_IX = 10; 
    } 
} 

Таким образом, у вас есть гибкость. В DerivedStuff класс HeaderInformation имеет все константы в базовом классе Stuff.HeaderInformation, но может изменить любой из них или сохранить те, которые у него есть.

Смежные вопросы