Каково различие между Преобразованием и Распаковыванием?

Короткий вариант Grep (идея заимствована из sed one):

$ echo -e "String1\nString2" | grep -zoP '^(.*)(?=.*?\n\1)'
String

Предполагается, что строка не имеет символа новой строки. Но легко можно настроить использование любого разделителя.

Обновление от 2016-10-24: в современных версиях grep вы можете получать жалобы grep: unescaped ^ or $ not supported with -Pz, просто используйте \A вместо ^:

$ echo -e "String1\nString2" | grep -zoP '\A(.*)(?=.*?\n\1)'
String
6
задан Jason Baker 9 June 2009 в 17:31
поделиться

4 ответа

Главное отличие в том, что Epression.Unbox требуется только для явной распаковки типа значения off куча. Expression.Convert - это метод, который вы хотели бы использовать для подключения к пользовательскому преобразованию (явному или неявному).

См. Expression.Convert :

If либо выражение. Тип или тип определяемый пользователем тип, который определяет неявное или явное преобразование оператор MethodInfo , представляет, что оператор является метод реализации.

, а также:

Если либо expression.Type, либо type является ссылочный тип и явный бокс, распаковка или преобразование ссылки существует из выражения. от типа к типу, метод реализации null.

3
ответ дан 10 December 2019 в 00:43
поделиться

Важным моментом при распаковке является то, что он дает вам адрес упакованного значения. Это гарантирует, что вы можете вызвать метод для распакованного значения. Если этот метод изменяет тип значения, то он изменяет упакованную версию вместо новой копии. Если бы вы просто выполнили Convert, вы бы фактически сделали копию упакованного типа значения, а затем вызов метода для него изменил бы копию, а не исходное значение.

4
ответ дан 10 December 2019 в 00:43
поделиться

Обычно бокс требует тип значения и оборачивает его в объект. При распаковке происходит обратное. Вы можете думать об этом как о боксе, который берет значение регистра или стека и помещает его в кучу, возвращая указатель на это значение. Распаковка берет объект в куче и помещает его в регистр или фрейм стека. Базовый тип данных остается прежним.

Преобразование изменяет один тип данных на другой.

2
ответ дан 10 December 2019 в 00:43
поделиться

Expression.Convert эквивалентен выполнению преобразования.

1
ответ дан 10 December 2019 в 00:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: