Constants in PowerShell

Does PowerShell treat ReadOnly variables differently? That is, is there a performance difference in declaring a New-Varibable -Option ReadOnly versus just a regular variable assignment?

ReadOnly variables are essentially constants. Once created, you can’t change them - “Read Only.” The purpose isn’t performance related; it’s to establish something that cannot be changed later. They exist for the same reason that constants exist alongside variables in most programming languages - mainly to provide a named version of a value (e.g., $ACCOUNT_LOCKED instead of 5 or something).

Technically, PowerShell supports both ReadOnly variables and Contstant variables. The difference is that you can still change a Read-Only variable by passing the -Force switch to the various cmdlets. Constants, once defined, are there for the entire session. You can’t change or delete them without closing PowerShell.

PS C:\Source\temp> New-Variable -Name 'CONST' -Value 'Constant' -Option Constant
PS C:\Source\temp> New-Variable -Name 'READONLY' -Value 'ReadOnly' -Option ReadOnly

PS C:\Source\temp> Set-Variable -Name 'READONLY' -Value 'NewValue' -Force
PS C:\Source\temp> Set-Variable -Name 'CONST' -Value 'NewValue' -Force

Set-Variable : Cannot overwrite variable CONST because it is read-only or constant.
At line:1 char:1
+ Set-Variable -Name 'CONST' -Value 'NewValue' -Force
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (CONST:String) [Set-Variable], SessionStateUnauthorizedAccessException
    + FullyQualifiedErrorId : VariableNotWritable,Microsoft.PowerShell.Commands.SetVariableCommand

PS C:\Source\temp> $READONLY

PS C:\Source\temp> $CONST

Kind of a hair-split. Point being, no, there’s not a performance difference. And, if you think you might want to change the ReadOnly variable, don’t make it ReadOnly :). They’re constants for all intents and purposes; “-Option Constant” was added a bit later in the development cycle as a kind of syntax sugar and a “more read-only than read-only.”

So while there’s a technical functional difference, the intent of the two is basically the same. One is more or less a leftover.

Performance, no perceptible difference between either of them and a standard variable that you simply avoid making changes to.