2010-01-21 2 views
4

У меня есть класс ниже:C# Consts в общественном классе

Я хочу получить доступ к строкам этих значений по умолчанию, но компилятор C# не нравится сочетание 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); 
    } 
} 

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

Благодаря

+0

Я бы сказал, чтобы поблагодарить всех за их ответы, статическая публикация readonly string решила эту проблему. Я также использую AppSettings, поэтому я действительно хочу принять здесь все ответы? – Belliez

ответ

8

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

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

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

3

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

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

4

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

public static readonly string DataSource = ...; 

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

2

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

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

вместо;

2

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

Я бы поместил их в appSettings.

Почему? Ну, если вам нужно изменить эти значения, вам нужно будет перекомпилировать свой код. Вводя их в приложение, вы сможете просто изменить свой конфигурационный файл.

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

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

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

+1

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

1

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

0

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

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

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

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

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

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

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

+0

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

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

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

Готово.

4

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

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

+0

yup, я согласен, спасибо. – Belliez

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