c # Consts в публичном классе - PullRequest
4 голосов
/ 21 января 2010

У меня есть класс ниже:

Я хочу получить доступ к этим строкам по умолчанию, но компилятору C # не нравится комбинирование Const для создания Const.

public class cGlobals
{
    // Some Default Values

    public class Client
    {
        public const string DatabaseSDF = "database.sdf";
        public const string DatabaseDir = "database";
        public const string DatabaseFullLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
                                                       DatabaseDir);
        public const string DataSource = Path.Combine(DatabaseDir, DatabaseSDF);
    }
}

Есть ли лучший способ вместо жесткого кодирования строк? Я хочу использовать Special Folders и Path.Combine.

Спасибо

Ответы [ 9 ]

8 голосов
/ 21 января 2010

Вы должны использовать static readonly вместо const, поскольку const должна быть константой во время компиляции.

Кроме того, константы будут фактически скомпилированы в сборки, которые их используют, поэтому если вы ссылаетесь на эти поля из других сборок, вам придется их перекомпилировать, если вы изменили константы. Это не происходит с static readonly полями. Так или иначе, это лучшая идея:)

Я действительно спрашивал об этом некоторое время назад, и я бы рекомендовал прочитать его и принять ответ: Статическое чтение только против const .

4 голосов
/ 21 января 2010

Просто чтобы добавить к другим правильным ответам: константа должна логически быть чем-то, что неизменным для всех времен и мест .Такие вещи, как количество яиц в дюжине, атомный номер свинца и так далее.Значения, которые меняются со временем, например, количество стран в Европейском союзе или цена тройской унции золота в австралийских долларах, не должны моделироваться как постоянные.

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

4 голосов
/ 21 января 2010

Для объявления переменной const назначенное значение должно быть константой времени компиляции ; чтобы использовать результат вызова метода, вам нужно изменить объявление переменной:

public static readonly string DataSource = ...;

Если подумать, это не константа времени компиляции, поскольку она даст разные результаты в зависимости от того, на какой ОС вы ее запускаете. Это константа в пределах одного выполнения , но не "общая" константа.

3 голосов
/ 21 января 2010

Вы можете использовать readonly вместо const.

Вы также можете использовать app.config для хранения настроек конфигурации.

2 голосов
/ 21 января 2010

Лично я бы не стал жестко кодировать строки вообще.

Я бы положил их в appSettings.

Почему? Что ж, если вам нужно изменить эти значения, вам нужно перекомпилировать ваш код. Размещение их в качестве appSettings позволит вам просто изменить свой конфигурационный файл.

Вы все еще можете предоставить аксессор через ваш класс.

public string DatabaseSDF 
{
  get
  {
    return System.Configuration.ConfigurationManager.AppSettings["DatabaseSDF"];
  }
}

Лучшее из обоих миров, имо.

2 голосов
/ 21 января 2010

Боюсь, вам придется использовать

static public readonly string DatabaseFullLocation = Path.Combine(/* ... */);

вместо *; 1004 *

1 голос
/ 21 января 2010

типы констант должны быть определены во время компиляции, в вашем коде вы пытаясь вызвать Path.Combine в время выполнения, чтобы выяснить фактическое дорожка. И вы не можете обновить const на во время выполнения.

0 голосов
/ 21 января 2010
  1. Определите класс, скажем, GetDirectory.
  2. Сделать все методы статичными.
  3. Определить класс для констант. делить все переменные с помощью -> общедоступной статической строки только для чтения. Name_Of_Var = "Любое значение"

  4. Из методов GetDirectory - определите код для папки, к которой вам нужно получить доступ Пример: Path.Combine (GetFolderPath (Environment.SpecialFolder. «Выбрать имя папки»), имя констант)

Готово.

0 голосов
/ 21 января 2010

В настройках приложения вы можете хранить такие константы.

В свойствах проекта выберите вкладку настроек. В сетке вы можете установить свои константы.

Вы можете получить и установить эти переменные даже во время выполнения.

 Message.show(My.Settings.YourVariable); //you will get the value

и устанавливается

 My.Settings.YourVariable="Vibin";
    My.Settings.Save()

Я думаю, что это один из лучших способов.

...