|
Расширение класса string
|
|||
---|---|---|---|
#18+
Добрый день! Занимаюсь портированием кода с C++ на C#. Возникла такая загвоздка: Методы substring, remove, indexof и т.д. для AnsiString в Borland C++ Builder используют нумерацию с 1. Менять логику в коде очень не хочется, т.к. подобного в коде достаточно много. Соответственно я выделил два варианта: - Переопределить эти методы для string и просто добавлять или вычитать единицу в зависимости от операции - Более практичный вариант: Создать класс AnsiString, который бы наследовал string и в нём переопределить эти два метода. Но класс string запечатан и все его методы не виртуальны и не могут быть переопределены. Реализовал в итоге при помощи расширений: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
В случае использования SubstringCPP проблем нету. Но это надо во всём скопированном коде изменять Substring на SubstringCPP. Если использовать расширение Substring, то используется стандартный substring. Вы можете что-то посоветовать для решения проблемы? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 15:26 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Алексей Ку.Добрый день! Занимаюсь портированием кода с C++ на C#. Вы можете что-то посоветовать для решения проблемы? Поменять текстовым поиском везде. Дать только критерий поточнее - .Substring( на .SubstringCPP( ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 15:38 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Взять декомпилированный класс String из неймспейса System, заменить стандартную имплементацию на Вашу где необходимо, скомилить в новую сборку с уникальным неймспейсом и добавить референс на сборку во всех проектах где необходимо. При использовании класса String выбирать соответствующий неймспейс (ибо будет конфликт класса String из System и Вашего неймспейса). Никаких расширений не нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 15:46 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
AxeleronВзять декомпилированный класс String из неймспейса System, заменить стандартную имплементацию на Вашу где необходимо, скомилить в новую сборку с уникальным неймспейсом и добавить референс на сборку во всех проектах где необходимо. При использовании класса String выбирать соответствующий неймспейс (ибо будет конфликт класса String из System и Вашего неймспейса). Никаких расширений не нужно. Где достать декомпилированный string? Декомпилирован он третьим лицом или исходники выложены самим MS? А есть возможность этот декомпилированный класс переименовать в ANsiString? Тогда мне в коде не надо будет менять AnsiString на strnig и конфликта наймспейсов не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 15:53 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Алексей Ку.AxeleronВзять декомпилированный класс String из неймспейса System, заменить стандартную имплементацию на Вашу где необходимо, скомилить в новую сборку с уникальным неймспейсом и добавить референс на сборку во всех проектах где необходимо. При использовании класса String выбирать соответствующий неймспейс (ибо будет конфликт класса String из System и Вашего неймспейса). Никаких расширений не нужно. Где достать декомпилированный string? Декомпилирован он третьим лицом или исходники выложены самим MS? А есть возможность этот декомпилированный класс переименовать в ANsiString? Тогда мне в коде не надо будет менять AnsiString на strnig и конфликта наймспейсов не будет. И пожелать веселых денечков программеру, который это вот ваше заумствование будет поддреживать после вас... Ах лишь бы код не менять - что за фобия? Заодно и кривулины почистили бы - которые однозначно имеются... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 15:57 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Алексей Ку. Ну в самом деле - я вот работаю со стрингом - в рамках вашего проэкта. пишу вызов функции - и вдруг она мне выдает нечто, чего я не ожидал. Не может быть, думаю я - и начинаю копаться в своем коде - где у меня ошибка - ведь не может же быть, что в стандартном классе дотнета есть такой баг... нумерация не с нуля а с единицы... оказывается, это не оригинальный стринг! Авторская работа! :-/ Поверьте, встретиться с незнакомой функцией - это одно, а догадаться, что знакомая уже не ведет себя так, как было - это совершенно другое.... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 16:05 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
D129, так потому я и спршиваю где достать декомпилированный string и можно ли его переименовать в AnsiString. Тогда не будет никому никаких сюрпризов! ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 16:31 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
D129, Фобия оправданна. Классы которые приходится портировать работают очень много со стрингами, массивами и т.п. В одном месте упустил сделать +1 или -1 и всё полетело в тартарары! Тем более эти классы постоянно развивает другая команда, а моя задача вести параллель на шарпе. Отсюда и необходимость вносить минимум изменений! ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 16:33 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Алексей Ку. никаких сюрпризов! Мне кажется, методов рассширения для этих целей - более чем достаточно. И даже эти методы - еще не писал, но уже стер из проэкта (как раз расширение string.Replace до меня свяли) подобное. В моем случае расширенный метод использовался только в одном месте программы. И мне показалось гораздо логичнее все нужные операции выполнить в специализированной функции, а не "всюду и со всеми"... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 16:37 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
D129Алексей Ку. никаких сюрпризов! ... В моем случае расширенный метод использовался только в одном месте программы. ... Вот и ответ. У меня они всюду и везде. Более того классов много и они наследуются друг от друга. Если мне надо было переделлать код в одном-двух местах, то я и не бы себе голову над этим! Вообще, не очень ясно почему запретили наследовать string... Что в этом такого? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 16:49 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
D129И пожелать веселых денечков программеру, который это вот ваше заумствование будет поддреживать после вас... Ах лишь бы код не менять - что за фобия? Заодно и кривулины почистили бы - которые однозначно имеются... Если весь проект завязан на override String класса - это допустимо и лучшее архитектурное решение, чем натыкать Extension'ов. После переписки методов поддерживать не надо - написал unit тесты для каждого overriden метода и будет Вам счастье. Вы часто меняете сборки со статическими методами, которые вряд ли когда вообще меняются? Какие проблемы-то? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 16:57 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Алексей Ку.D129пропущено... ... В моем случае расширенный метод использовался только в одном месте программы. ... Вот и ответ. У меня они всюду и везде. Более того классов много и они наследуются друг от друга. Если мне надо было переделлать код в одном-двух местах, то я и не бы себе голову над этим! Вообще, не очень ясно почему запретили наследовать string... Что в этом такого? Потому, что это типа "простой тип" - который как бы мало чем отличается от int или decimal. В чем трудность заменить во всех текстах имя метода - я тоже не понимаю. У меня бывали случаи, когда я исправлял 600 ошибок компиляции - после изменения типа на более продвинутый. Ничего со мной не случилось - сидишь себе, втыкаешь кнопочки... :-) Кстати, если вы хотите наследовать стринг - ну и напишите полностью свой класс, в котором будут обертки над стрингом (или сразу уже StringBuilder ом), переопределите операторы - уж всяко это будет лучше, чем для такого же имени методов писать другую логику... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 17:12 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
D129, Там вообще никакой другой логики нет - просто 1 к индексатору прибавить в каждом методе внимательно. Там всего-то методов 100-150 с overload'ами. И большинство из них скорее всего даже трогать не надо будет. Перепутать с System.String тоже не выйдет, так как namespace для переписанного класса будет, например, SystemPlusOne.String... Все! И нативный System.String никак не пострадал - хочешь, пользуйся в этом же проекте. Для того namespac'ы и даны в .NET. Не понимаю, в чем проблема-то? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 17:20 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
D129, А все StringBuilder'ом писать - это неэффективно во многих случаях, когда количество операций со String минимально. А в большинстве методов String их количество минимально. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 17:22 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
AxeleronD129, Там вообще никакой другой логики нет - просто 1 к индексатору прибавить в каждом методе внимательно. Там всего-то методов 100-150 с overload'ами. И большинство из них скорее всего даже трогать не надо будет. Перепутать с System.String тоже не выйдет, так как namespace для переписанного класса будет, например, SystemPlusOne.String... Все! И нативный System.String никак не пострадал - хочешь, пользуйся в этом же проекте. Для того namespac'ы и даны в .NET. Не понимаю, в чем проблема-то? Я подобное решение и описал - в предыдущем посте. Переопределение метода в родном классе - вот что меня напрягло. Имя одинаковое - а неймспейс ведь покоротится с помощью using... Хотя - вот я недавно написал класс ActionResult - правда в виндовс приложении, и он с типом из Веб не пересечется. А что недавно пересеклось - нечто под названием Membership..... Конечно разрулили - прямым использованием неймспейса, точным адресом... Но если бы дали бы этой нашей шняге некий префикс - только нашенский, то и разруливать не надо было бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 17:28 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Алексей Ку.так потому я и спршиваю где достать декомпилированный string и можно ли его переименовать в AnsiString. Тогда не будет никому никаких сюрпризов! http://referencesource.microsoft.com/#mscorlib/system/string.cs Только что вы будете делать с использованием кучи internal классов? Тоже тащить в виде исходников к себе? Или, например, с методами, которые MethodImplAttribute(MethodImplOptions.InternalCall)? Забудьте про декомпиляцию System.String вообще. Extension-методы и поиск/замена по коду. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 17:35 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
D129Я подобное решение и описал - в предыдущем посте. Мне только одному кажется, что в предыдущем посте Вы предлагали что-то совсем другое? D129Переопределение метода в родном классе - вот что меня напрягло. Ни наследований, ни переопределений я не предлагаю. Нет, родной System.String я трогать вообще не предлагаю. Мое предложение: новый неймспейс, перенос класса String из System неймспейса в новый неймспейс SystemPlus, добавить 1 к индексатору везде где нужно в методах класса SystemPlus.String. Когда нужно будет использовать метод класса String просто указать неймспейс: using String = SystemPlus.String; ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 17:38 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Точно так же как System.String их тащит ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 17:41 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Axeleron, Остаётся один вопрос. Как взять и перенести класс string вдругой namespace? Видимо придётся делать как написал Сон Веры Павловны. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 17:41 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
AxeleronСон Веры Павловны, Точно так же как System.String их тащит Я взял тупо исходник стринга. У меня огомное кол-ва иксепшенов начиная как минимум с unsafe кода! ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 17:42 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Алексей Ку., пока Вы только знакомитесь с C#, правда, делайте лучше через Extension методы. Не мучайтесь. Так проще будет - просто сделаете Replace All и подмените имена методов на нужные. Я описал способ, которым, скорее всего, пошел бы я, если проект был бы большой и методов переписывать много. Если у Вас всего 2-3 extension метода, не стоит по воробьям из пушки. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 17:50 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
AxeleronСон Веры Павловны, Точно так же как System.String их тащит Вы предлагаете перетащить в проект половину mscorlib? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 17:53 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Алексей Ку.AxeleronСон Веры Павловны, Точно так же как System.String их тащит Я взял тупо исходник стринга. У меня огомное кол-ва иксепшенов начиная как минимум с unsafe кода! Сделайте обертку. Если вам нужно "умностное" обоснование - пожалуйста: Есть два способа повторного использования кода. Один из них - наследование. В типе string оно заблокировано. Второй - композиция. Вам нужны функции стринга, но с коррекцией их поведения - ну и напишите эту самую коррекцию, перед вызовом неизменяемых функций... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 17:55 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Да я бы хотел так сделать! Но Сон веры павловны прав. Придётся тащить половину mscorlib. На первый взгляд всё выглдяит несложно, а оказывается всё наоборот. Класс string ни капельки не самостоятельный и использует половину mscorlib. Тут у меня назрел такой вопрос. А почему мой новый string2 (порождённый из исзодника string) не может использовать уже скомпилированный mscorlib, чтобы его не тащить в проект? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 17:56 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Алексей Ку., Ну уже я думаю что решение моего вопроса очевидно - extension`ы! ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 17:57 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Алексей Ку.Да я бы хотел так сделать! Но Сон веры павловны прав. Придётся тащить половину mscorlib. На первый взгляд всё выглдяит несложно, а оказывается всё наоборот. Класс string ни капельки не самостоятельный и использует половину mscorlib. Тут у меня назрел такой вопрос. А почему мой новый string2 (порождённый из исзодника string) не может использовать уже скомпилированный mscorlib, чтобы его не тащить в проект? Потому, что есть такой модификатор доступа - internal. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 17:58 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
D129Алексей Ку.Да я бы хотел так сделать! Но Сон веры павловны прав. Придётся тащить половину mscorlib. На первый взгляд всё выглдяит несложно, а оказывается всё наоборот. Класс string ни капельки не самостоятельный и использует половину mscorlib. Тут у меня назрел такой вопрос. А почему мой новый string2 (порождённый из исзодника string) не может использовать уже скомпилированный mscorlib, чтобы его не тащить в проект? Потому, что есть такой модификатор доступа - internal. А ну да... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 18:06 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Алексей Ку., Internal классы (структуры, интерфейсы, энумы, делегаты) видны только внутри сборки, в которой объявлены (если только сборка не скомпилирована с атрибутом InternalVisibleTo - но это точно не про mscorlib и ваш проект). Помнится, как-то я попытался подправить исходники класса SignedXml - не вышло нифига. Как раз из-за этих internal'ов. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 18:07 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Алексей Ку., Вам явно не нужны все методы оригинального класса String... У Вас я видел 3-5 метода для переписания (причем, на мой взгляд, элементарнейшие). Зря Вы заранее испугались, там совсем немного тащить надо. А для общего развития было бы полезно. Но смотрите сами, за Вас этого никто не сделает, но если Вас уже запугали и уверенности в собественных силах нет, делайте через Extensions - это проще и быстрее, а в Вашем случае, может, и оправданнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 18:07 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Да вообще все проще на самом деле. Просто сошлитесь на родной класс String и сделаете как-бы overraid нужных Вам методов. Даже исходников System.String не надо! Чо-то туплю я сегодня. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 18:16 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
самый простой способ переправить код на другой тип для Билдера объявите в каком нить хидере типа вот этого Код: pascal 1. 2. 3. 4.
и включите его во все модули код которых надо переводить, попутно компиля ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 18:21 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
AxeleronПросто сошлитесь на родной класс String и сделаете как-бы overraid нужных Вам методов. Родной класс System.String является sealed, если что. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 18:22 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныAxeleronПросто сошлитесь на родной класс String и сделаете как-бы overraid нужных Вам методов. Родной класс System.String является sealed, если что. Это не играет роли. Я предлагаю не наследование, а вот что: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 18:33 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
AxeleronЭто не играет роли. Я предлагаю не наследование, а вот что: Это, собственно, и есть extension-методы, про которые топикстартер писал с самого начала. Вы предлагаете ему то, что он сам себе предложил? Это во-первых. А во-вторых, с вышеприведенной сигнатурой это просто не будет работать: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Прогоните этот код с закомментаренным public static class String, и с незакомментаренным, найдите отличия. Если что - компилятор в первую очередь по сигнатуре вызова ищет инстансные методы, и только не найдя их, начинает искать extensions-методы. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 18:57 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Ваша правда! ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 19:16 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Все, убедили Вы меня - лучше всего просто Extension methods использовать без извратов. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 19:47 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Axeleron, лучше говнокод переписать ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 20:06 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
ИзопропилAxeleron, лучше говнокод переписать Ну это уже меры глобального порядка ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 20:07 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Огромное спасибо всем за помощь в этом вопросе! ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 22:27 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Алексей Ку.Тем более эти классы постоянно развивает другая команда, а моя задача вести параллель на шарпе. Отсюда и необходимость вносить минимум изменений!Может проще сибилдерную часть оформить в виде DLL или COM и подсоединить к сишарпу инвоком/интеропом? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2015, 14:47 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
Алексей К, Не, проще последовать совету Изопропила. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2015, 14:49 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
На правах не сильно продуманной идеи: Завернуть стринг в структуру и переопределить метходы работы со структурой. Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2015, 19:08 |
|
Расширение класса string
|
|||
---|---|---|---|
#18+
На самом деле делай, Алексей, класс AnsiString с внутренним членом класса String и реализуй в нём (AnsiString) только то, что используется классами, портируемыми из C++, в частности метод Substring, ещё пару-тройку каких-нибудь типа Pos и SetLength, ну и операторы +, -, =, ==, != или какие там используются... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2015, 10:55 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1401833]: |
0ms |
get settings: |
10ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 151ms |
0 / 0 |