Существует различие между ранней оптимизацией производительности и использованием типа лучшей практики правила. Если Вы составляете новые таблицы, где у Вас всегда будет поле фиксированной длины, имеет смысл использовать CHAR, необходимо использовать его в этом случае. Это не ранняя оптимизация, а скорее реализация эмпирического правила (или лучшая практика).
т.е. - если у Вас есть 2 поля состояния буквы, используйте CHAR (2). Если у Вас есть поле с именами реального положения, используйте VARCHAR.
$ args развернут. Помните, что параметры функции обычно передаются с использованием пробела для их разделения. Когда вы передаете 1,2,3, вы передаете единственный аргумент, который представляет собой массив из трех чисел, который присваивается $ args [0]:
PS> function UnrollMe { $args }
PS> UnrollMe 1 2 3 | measure
Count : 3
Помещение результатов (массива) в выражение группировки (или часть выражения например, $ ()
) снова делает его пригодным для разворачивания, поэтому следующее разворачивает объект [], содержащий 1,2,3, возвращенный UnrollMe:
PS> ((UnrollMe 1,2,3) | measure).Count
3
, что эквивалентно:
PS> ((1,2,3) | measure).Count
3
BTW, это не ' t просто применить к массиву с одним элементом.
PS> ((1,2),3) | %{$_.GetType().Name}
Object[]
Int32
Использование подвыражения массива ( @ ()
) для чего-то, что уже является массивом, не имеет никакого эффекта, независимо от того, сколько раз вы его применяете. : -) Если вы хотите предотвратить разворачивание, используйте оператор запятой, потому что он всегда создает другой внешний массив, который разворачивается. Обратите внимание, что в этом сценарии вы на самом деле не предотвращаете развертывание, вы просто обходите развертывание, вводя внешний массив «оболочку», который развертывается вместо вашего исходного массива, например:
PS> (,(1,2,3) | measure).Count
1
Наконец, когда вы выполняете это:
PS> (UnrollMe a,b,c d) | %{$_.GetType().Name}
Object[]
String
Вы можете видеть, что UnrollMe возвращает два элемента (a, b, c) как массив и d как скаляр. Эти два элемента передаются по конвейеру отдельно, в результате получается 2.
PS> (UnrollMe a,b,c d) | %{$_.GetType().Name}
Object[]
String
Вы можете видеть, что UnrollMe возвращает два элемента (a, b, c) как массив и d как скаляр. Эти два элемента передаются по конвейеру отдельно, в результате получается 2.
PS> (UnrollMe a,b,c d) | %{$_.GetType().Name}
Object[]
String
Вы можете видеть, что UnrollMe возвращает два элемента (a, b, c) как массив и d как скаляр. Эти два элемента передаются по конвейеру отдельно, в результате получается 2.
Похоже, это как-то связано с тем, как работает Measure-Object и как объекты передаются по конвейеру.
Когда вы говорите
1,2,3 | measure
, вы получаете 3 Объекты Int32, переданные в конвейер, объект измерения затем подсчитывает каждый объект, который он видит в конвейере.
Когда вы "разворачиваете его" с помощью своей функции, вы получаете один объект массива, переданный в конвейер, который считается объектом измерения как 1, он не пытается выполнить итерацию по объектам в массиве, как показано здесь:
PS C:\> (measure -input 1,2,3).count
1
Возможный обходной путь - «перевернуть» массив в конвейер с помощью foreach:
PS C:\> (UnrollMe 1,2,3 | %{$_} | measure).count
3