Согласно docs :
Измененная или параметр, значение которой никогда не изменяется после его инициализации, фактически является окончательным.
blockquote>В принципе, если компилятор обнаруживает, что переменная не появляется в назначениях за пределами ее инициализации, то переменная считается эффектно окончательной .
Например, рассмотрим некоторый класс:
public class Foo { public void baz(int bar) { // While the next line is commented, bar is effectively final // and while it is uncommented, the assignment means it is not // effectively final. // bar = 2; } }
Чтобы предложить более краткую альтернативу с оператором -split
, которая устраняет необходимость доступа к $Matches
впоследствии для извлечения чисел:
PS> 'PC1-FOO1234568', 'PC2-FOO1234567/FOO98765' -split '(?:^PC\d+-|/)FOO' -ne ''
1234568 # single match from 1st input string
1234567 # first of 2 matches from 2nd input string
98765
[ 1129] Примечание: -split
всегда возвращает массив [string[]]
, даже если возвращается только 1 строка; Строки результата из нескольких входных строк объединяются в один плоский массив.
^PC\d+-|/
соответствует PC
, за которым следуют 1 или более (+
) цифр (\d
) в начале строки (^
) или (|
) a /
char., Который соответствует PC2-FOO
в начале и /FOO
.
(?:...)
, не захватывающее подвыражение , должно использоваться для предотвращения -split
включения того, что подвыражение совпало в массиве результатов. -ne ''
отфильтровывает пустые элементы, которые являются результатом входных строк , начиная с с разделителя.
Чтобы узнать больше об операторе -split
, основанном на регулярных выражениях, и о том, как он более мощный, чем метод .NET String.Split()
, основанный на строковых литералах, см. ответ . SUP>