Вы можете объявить свойство с только ПОЛУЧИТЬ аксессор (даже не объявляя множество аксессора, даже не частный):
private const Int16 protocol_version = 1;
public Int16 ProtocolVersion {
get { return protocol_version; }
}
Это не то же самое, как определение только константы: постоянное будет разрешено во время компиляции, поэтому, если вы обновите библиотеку без перекомпиляции зависимой программы, программа все равно увидит «старое» значение. Рассмотрим следующий пример:
// The class library
using System;
namespace MyClassLibrary {
public class X {
public const Int16 protocol_version = 1;
public Int16 ProtocolVersion { get { return protocol_version; } }
}
}
// The program
using System;
using MyClassLibrary;
class Program {
static void Main(string[] args) {
X x = new X();
Console.WriteLine("Constant : {0}", X.protocol_version);
Console.WriteLine("Getter: {0}", x.ProtocolVersion);
}
}
Теперь, скомпилируйте первый раз и выполните программу. Вы увидите
Constant : 1
Getter : 1
Затем измените protocol_version 2, и пересобрать класс только библиотеку, без перекомпиляции программы, затем поставить новую библиотеку классов в папке с программой и выполнить его. Вы увидите:
Constant : 1
Getter : 2
Дело в том, что если это просто константа, то значение заменяется во время компиляции.
Я думаю, что то, что вы на самом деле ищете является static readonly
переменное: таким образом, вы сможете избежать замен константных во время компиляции, а переменный не будут изменяемыми после инициализации:
public static readonly Int16 protocol_version = 1;
Я m довольно уверен, что это не то, что вы используете прямо сейчас, потому что ваш код не будет компилироваться. Кроме того, что-то вроде версии протокола не подходит для поля 'const', потому что оно на самом деле не является постоянным - оно может измениться в будущем. – svick
@svick Ах да, мой код на самом деле не имеет набора в нем, я должен изменить это в ответе. Это была моя первая мысль, прежде чем я попытался ее скомпилировать. – cost