2013-11-01 4 views
1

Эй Я новичок в C# и я написал этот кусок кода:Как сократить имена типов?

static void Main() 
{ 
    Dictionary<int, HashSet<string>> dict1 = new Dictionary<int, HashSet<string>>(); 
    Dictionary<int, HashSet<string>> dict2 = new Dictionary<int, HashSet<string>>(); 
    // ... 
    CompareDicts(dict1, dict2); 
} 

private static void CompareDicts(Dictionary<int, HashSet<string>> dict1, Dictionary<int, HashSet<string>> dict2) 
{ 
    // Blah blah 
} 

Есть ли способ, чтобы сделать этот код более читаемым (короче)?

+1

Примечание стороны: нет ничего особенно нечитаемого в вашем образце (за исключением несколько плохого имя функции - он не может реально сравнить ничего потому что он не возвращает результат, может быть, 'void EsureDictionariesAreEqual' или' int CompareDicts'). Damian Drygiel предоставил возможные способы сокращения кода, но остерегайтесь псевдонимов - трудно найти хорошие имена, а псевдонимы являются только локальными файлами, поэтому вам все равно понадобится полный тип в других местах ... –

ответ

12

Используйте тип alias и var

using AliasName = System.Collections.Generic.Dictionary<int, System.Collections.Generic.HashSet<string>>; 

namespace Progam1 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var dict1 = new AliasName(); 
      var dict2 = new AliasName(); 

      CompareDicts(dict1, dict2); 
     } 

     private static void CompareDicts(AliasName dict1, AliasName dict2) 
     { 
      // Blah blah 
     } 

    } 
} 

Но использовать var только если это ясно, какие данные она содержит:

Например, Это хорошо:

var abc = new List<int>(); 

Это Плохо:

var abc = SomeFunc(); 

... потому что вы не знаете мгновенно (при чтении кода) какие данные SomeFunc возвращается. Чтобы увидеть его, вам необходимо направить курсор мыши на var (в Visual Studio).

+1

Для удобства чтения использование 'var' _only_ было бы более уместным, на мой взгляд. Но я не знал, что директива 'use' была настолько мощной +1. –

+0

+1 для 'using' ... Если тип возвращаемой функции так непонятен из ее имени, что вы должны явно указать тип переменной, это может означать плохое имя функции. То есть 'CompareDicts' является плохим именем, потому что все другие функции' Compare ... 'возвращают какой-то результат сравнения вместо' void' ... –

+0

Значение 'var' в вашем втором случае еще больше: вы можете изменить возврат тип метода, не изменяя ваше объявление 'abc'. –

0

Иногда, когда вы имеете дело с методами с большим количеством параметров и/или параметров с длинными именами типа, это может быть полезно отформатировать их как больше, более короткие строки:

private static void CompareDicts(
    Dictionary<int, HashSet<string>> dict1, 
    Dictionary<int, HashSet<string>> dict2 
) 
{ 
    // Blah blah 
} 

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

private static void CompareDicts(
    Dictionary<int, HashSet<string>> dict1, Dictionary<int, HashSet<string>> dict2 
) 
{ 
    // Blah blah 
} 
Смежные вопросы