2013-09-02 1 views
1

У меня есть класс для обработки файлов конфигурации, и я хочу привести в порядок код, чтобы сделать его более читабельным и поддерживаемым. В C++ я обычно делал это с помощью typedefs, но я обнаружил, что есть способ сделать это на C#, используя ключевое слово 'using' (см. Equivalent of typedef in C#). Моя единственная проблема заключается в том, что, похоже, не существует способа их вложить. Вот что я хочу добиться:Вложенные 'using' в C# как эквивалентные typedef

using ConfigValue = System.Collections.Generic.List<System.String>; 
using ConfigKey = System.String; 
using ConfigSection = System.Collections.Generic.Dictionary< ConfigKey, ConfigValue >; 

Как я могу добиться этого без ConfigSection явно только в случае, если изменить тип ConfigKey или ConfigValue и забыть изменить ConfigSection?

Благодаря

Allan

+0

Несомненно, вы не могли «забыть», потому что в любом месте, где вы добавляете элементы в словарь, не удастся из-за того, что строго типизированное общее ограничение не выполняется. –

+0

На самом деле я считаю, что я этого не сделаю. Почему фактическое имя типа не читается? Может быть, 'ConfigValue' вместо' List 'выглядит более« читаемым », но я бы не знал фактического типа, просто прочитав код ... –

ответ

2

Вы не можете сделать это, к сожалению. Основной альтернативой C# для typedef в C/C++ обычно является вывод типа, например. с ключевым словом var, но вы все равно должны вводить общие определения во многих случаях. Причина в том, что почти все программисты на C# используют Visual Studio или другие IDE, которые не позволяют им печатать все во многих случаях.

Я бы не рекомендовал шаблон «use-as-typedef» слишком сильно, потому что я ожидаю, что он будет незнакомым и удивительным для большинства программистов на C#. Кроме того, я думаю, что факт, что вы должны включать «psuedo-typedef» в каждом файле, в любом случае значительно уменьшает его полезность.

Одна вещь, которую вы могли бы рассмотреть, - это, конечно, сделать фактические классы из вещей, которые вы хотите ввести, например. например:

public class ConfigValue : List<string> 
{ 
} 

public class ConfigKey 
{ 
    private string s; 

    public ConfigKey(string s) 
    { 
     this.s = s; 
    } 

    // The implicit operators will allow you to write stuff like: 
    // ConfigKey c = "test"; 
    // string s = c; 

    public static implicit operator string(ConfigKey c) 
    { 
     return c.s; 
    } 

    public static implicit operator ConfigKey(string s) 
    { 
     return new ConfigKey(s); 
    } 
} 

public class ConfigSection : Dictionary<ConfigKey, ConfigValue> 
{ 
} 

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

0

Вы не можете, и using x = y не предполагается использовать для создания псевдонимов типов. Предполагается, что он используется для создания псевдонимов пространства имен, для разрешения конфликтов (например, пространства имен и класса с тем же именем).

+0

Почему downvote? Поразмыслить? – dcastro

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