Вводить полностью определенные имена типов в powershell? - PullRequest
3 голосов
/ 23 февраля 2020

Я хочу сократить ввод System и другие root пространства имен, например

[string] $ComputerName = [Environment]::MachineName

против

[System.String] $ComputerName = [System.Environment]::MachineName

Другой пример:

[Net.Dns]::GetHostEntry("192.168.1.1")

против

[System.Net.Dns]::GetHostEntry("192.168.1.1")

Существуют ли какие-либо причины и конкретная c ситуация, когда требуется ввод System и аналогичные родительские пространства имен?

Мне часто задается вопрос, почему существует System В конце концов, пространство имен, так как все находится внутри этого пространства имен, так что же делать с этим пространством имен? это чепуха; что в любом случае должен означать термин System? это не связано с операционной системой здесь. но ко всему в NET framework.

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

Ответы [ 2 ]

5 голосов
/ 23 февраля 2020

В некотором беспорядочном порядке:

это чепуха; какой термин System должен все равно означать?

Рассматриваемая «система» - это. NET среда выполнения и инфраструктура. Первоначальная идея, насколько я понимаю, заключалась в том, что код, который не поставляется с с . NET, попадет в разные пространства имен - но несколько компонентов, созданных Microsoft, построенных поверх. NET, имеют с тех пор использовал System родительское пространство имен - включая все API, которые составляют сам PowerShell.

Я часто задаюсь вопросом, почему все-таки существует пространство имен [a] System, поскольку все находится внутри этого пространства имен так что же делать с этим пространством имен?

Не "все" находится внутри пространства имен System, но, как уже упоминалось выше, все, что поставляется с библиотекой времени выполнения или базового класса, - именно поэтому PowerShell автоматически разрешает литералы типов, даже если вы опускаете System. в квалифицированном имени типа - PowerShell пытается помочь вам сократить ввод уже

Существуют ли какие-либо причины и указываются c Ситуация, когда требуется ввести Системные и аналогичные родительские пространства имен?

Да - когда родительское пространство имен равно * 1 028 * not System.

Первый пример, который приходит на ум, - классы-оболочки. NET для API реестра Win32 в Windows:

$HKLM = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Default)

Теперь по фактическому вопросу:

Я хочу уменьшить число набираемых System и других root пространств имен

Вы не можете добавлять пользовательские префиксы пространства имен (например, System) для метода разрешения имен PowerShell, но вы можете объявить автоматическое c разрешение имен типов в специфицированных c пространствах имен в PowerShell 5 и более поздних версиях с using namespace директива .

Без using namespace:

[System.Net.Dns]::GetHostEntry("192.168.1.1")

С using namespace:

using namespace System.Net

[Dns]::GetHostEntry("192.168.1.1")

При использовании в сценарии любые директивы using должны предшествовать чему-либо еще в файле, включая блок param. Директивы

using namespace будут работать и в интерактивном сеансе, при условии, что вы выдадите их в виде отдельного оператора:

PS> using namespace System.Net 
PS> [Dns] # still works!
1 голос
/ 23 февраля 2020

Кстати, в PowerShell есть много «ускорителей типов», таких как [datetime], можете ли вы создать свой собственный, например, [dt]: Различия между логическими и булевыми значениями?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...