|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Добрый день, знатоки! Я всё-таки взялся за реализацию класса AnsiString, который будет соответствовать своему "тёзке" из С++. Код: 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. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66.
Теперь я могу проводить основные операции со строкой, которые мне нужны. Я могу инициализировать класс след. образом: Код: c# 1.
Вопрос: как мне сделать неявную конвертацию к строке. Т.е. я хочу выполнять след операции: Код: c# 1. 2. 3.
Ещё одна задача: Сделать, чтобы в Debug режиме, при наведении на переменную типа AnsiString, мне показывалось сразу его value. Ну т.е. как и у класса String. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 14:48 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Алексей Ку.Вопрос: как мне сделать неявную конвертацию к строке. Т.е. я хочу выполнять след операции: Код: c# 1. 2. 3.
Написать extension method в AnsiString классе. Алексей Ку.Ещё одна задача: Сделать, чтобы в Debug режиме, при наведении на переменную типа AnsiString, мне показывалось сразу его value. Ну т.е. как и у класса String. Добавить соответствующий property в AnsiString классе. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 15:00 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Алексей Ку.Вопрос: как мне сделать неявную конвертацию к строке. Аналогично. Оператор должен содержать лишь хотя б одно использование класса, в котором он объявлен, не важно какое. Код: c# 1.
Алексей Ку.делать, чтобы в Debug режиме, при наведении на переменную типа AnsiString, мне показывалось сразу его value. Ну т.е. как и у класса String. Переопределить метод ToString. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 15:14 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
AxeleronАлексей Ку.Вопрос: как мне сделать неявную конвертацию к строке. Т.е. я хочу выполнять след операции: Код: c# 1. 2. 3.
Написать extension method в AnsiString классе. Алексей Ку.Ещё одна задача: Сделать, чтобы в Debug режиме, при наведении на переменную типа AnsiString, мне показывалось сразу его value. Ну т.е. как и у класса String. Добавить соответствующий property в AnsiString классе. Со вторым вопросом всё ясно -тупанул. При попытке добавить extension public static string ToString(this AnsiString input) { //convert } получаю: Extension method must be defined in a non-generic static class Как быть? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 15:26 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Разобрался! Вот получается такой класс (мало ли кому пригодится): Код: 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. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62.
Всем спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 15:32 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Есть слабые места. Во-первых, попробуйте Код: c# 1. 2.
Наверняка будет NullReferenceException. Во-вторых, попробуйте Код: c# 1. 2. 3.
Вероятно, значение переменной isItCorrect окажется неожидаемым. Рекомендую переопределить также методы Equals и GetHashCode. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 15:43 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Алексей Ку.Разобрался! ... Всем спасибо! Да пожалукста. Теперь ещё переделай в структуру и будет почти как должно бытъ. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 16:49 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
mikronАлексей Ку.Разобрался! ... Всем спасибо! Да пожалукста. Теперь ещё переделай в структуру и будет почти как должно бытъ. А какой смысл переделывать в структуру? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 17:14 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Ilya81Есть слабые места. Во-первых, попробуйте Код: c# 1. 2.
Наверняка будет NullReferenceException. Во-вторых, попробуйте Код: c# 1. 2. 3.
Вероятно, значение переменной isItCorrect окажется неожидаемым. Рекомендую переопределить также методы Equals и GetHashCode. Действительно получаю NullReferenceException. Есть какой-то стандартный алгоритм сравнения в таких случаях? Или мне как раз придётся определить Equals и использовать его? Не совсем понял зачем мне GetHashCode, можете раскрыть чуть-чуть эту тему? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 17:16 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Не могу понять как решить эту задачку. Методы Equals у меня решарпер сам определил вот так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 17:19 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Я б написал так: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 17:29 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Алексей Ку.mikronпропущено... Да пожалукста. Теперь ещё переделай в структуру и будет почти как должно бытъ. А какой смысл переделывать в структуру? Мне кажется ответ очевиден: еффективноть. Структуры передаются по значению и не требуют доп помять в хипе. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 17:34 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Про GetHashCode. Многие классы, в т. ч. Dictionary в целях оптимизации для поиска нужного элемента не сравнивают с каждым, а сравнивают сначала только результат функции GetHashCode. И только если GetHashCode вернул одинаковое значение, вызывают функцию Equals. Рекомендую Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 17:34 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
mikronМне кажется ответ очевиден: еффективноть. Структуры передаются по значению и не требуют доп помять в хипе. И в результате сравнимый объем данных держат на стеке. Плюс - сразу же возникнет много нюансов, связанных с боксингом/анбоксингом. Я уже молчу про то, что единственное поле состояния в данном случае - класс, и лежать оно всё равно будет в хипе. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 18:24 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныmikronМне кажется ответ очевиден: еффективноть. Структуры передаются по значению и не требуют доп помять в хипе. И в результате сравнимый объем данных держат на стеке. Плюс - сразу же возникнет много нюансов, связанных с боксингом/анбоксингом. Я уже молчу про то, что единственное поле состояния в данном случае - класс, и лежать оно всё равно будет в хипе. mikron уже давно пытается всех нас вышколить, чтобы поменяли философию на его ('правильную'). А пойти почитать, что Struct имеет смысл и эффективность для примитивных типов данных (value type типа int, double), а никак не reference (string, классы) ленится. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 18:30 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныmikronМне кажется ответ очевиден: еффективноть. Структуры передаются по значению и не требуют доп помять в хипе. И в результате сравнимый объем данных держат на стеке. Плюс - сразу же возникнет много нюансов, связанных с боксингом/анбоксингом. Я уже молчу про то, что единственное поле состояния в данном случае - класс, и лежать оно всё равно будет в хипе. А спала Вера Павловна плохо и часто мучалась кошмарами. Проверка фактов: Код: c# 1. 2.
В случае с классом имеем: 2 обьекта в хипе и один референс на стеке. В случае со структурой: 1 обьект в хипе и опять-ж референс на стеке. Сравниваем, что было-бы если бы использовалась нативная имплементация: 1 обьект в хипе и опять-ж референс на стеке. Боксинг / унбоксинг вообще не нужен: т.к. структура не несёт никакой доп информации кроме референса на стринг, при передаче обьекта всегда передавать стринг. Если кому не понятно, обьясняю на пальцах: Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2015, 14:34 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
mikron, Код: c# 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2015, 14:38 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Axeleron, Отбой, пропустил что во второй строке нет .Value ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2015, 14:39 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Axeleronmikron уже давно пытается всех нас вышколить, чтобы поменяли философию на его ('правильную'). Давай я сам за себя скажу. Я пытаюсь донести до некоторых, что если недостоток в понимания материала вы пытаетесь заменить правилам, то разберитесь хоть в правилах и неверьте каждому написаному на заборе слову. AxeleronА пойти почитать, что Struct имеет смысл и эффективность для примитивных типов данных (value type типа int, double), а никак не reference (string, классы) ленится. "Чеку из гранаты не вынимать" ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2015, 14:47 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
MSDNDo not define a structure unless the type has all of the following characteristics: It logically represents a single value, similar to primitive types (integer, double, and so on). It has an instance size smaller than 16 bytes. It is immutable. It will not have to be boxed frequently. А теперь навскидку из основ C# - является ли System.String immutable? И почему майкрософтовские идиоты решили создавать System.String как класс, а не структуру? Уверен, у Вас есть достойный ответ. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2015, 14:56 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Основной недостаток класса с точки зрения производительности - boxing/unboxing при обращении к вложенным value type. Основной недостаток структуры с точки зрения производительности - передача копии всей структуры при каждом вызове метода (если он не за'inline'ен). А дальше смотрим, что в среднем случается делать чаще. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2015, 14:57 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
Запутал сам себя. Получается, что можно и Struct, если не будет проводиться боксинг/анбоксинг объекта AnsiString. Соглашаюсь с mikron. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2015, 15:04 |
|
Класс AnsiString
|
|||
---|---|---|---|
#18+
AxeleronMSDNDo not define a structure unless the type has all of the following characteristics: It logically represents a single value, similar to primitive types (integer, double, and so on). It has an instance size smaller than 16 bytes. It is immutable. It will not have to be boxed frequently. А теперь навскидку из основ C# - является ли System.String immutable? И почему майкрософтовские идиоты решили создавать System.String как класс, а не структуру? Уверен, у Вас есть достойный ответ. "А пойти почитать, что Struct имеет смысл и эффективность для примитивных типов данных (value type типа int, double), а никак не reference (string, классы) ленится." 1. Вот вы сами процетировали правило а про реферс я тут и не вижу. Доппридумывали? 2. Сделать структут immutable я бы тоже рекомендовал. Делу не помешает. 3. Вопрос не по адрессу. обратитесь с ним в микрософт. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2015, 15:10 |
|
|
start [/forum/topic.php?fid=20&fpage=91&tid=1401801]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 144ms |
0 / 0 |