|
Помогите с переводом C++ -> C#
|
|||
---|---|---|---|
#18+
Добрый день! Возникла задача перевести некоторые классы с плюсов на шарп. Я не уверен что всё делаю верно. Если кому не сложно, то прошу глянуть что у меня получается. Для начала я решил перенести header без реализаций. Метками //TODO указал для себя места с которыми не до конца всё ясно. Исходный код на плюсах: Код: plaintext 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. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93.
Что вышло на шарпе: Код: 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. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188.
Выдержка строк, которые вызвали затруднение при переносе: плюсы: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
шарп: Код: c# 1. 2. 3. 4. 5.
//__property AnsiString Version = { read = FVersion }; public string Version { get { return Assembly.GetEntryAssembly().GetName().Version.ToString(); } //TODO А точно ли Assembly.GetEntryAssembly().GetName().Version.ToString()? } //__property TLogEvent OnLog = { read = FOnLog, write = FOnLog }; //TODO __property TLogEvent OnLog = { read = FOnLog, write = FOnLog }; ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 16:25 |
|
Помогите с переводом C++ -> C#
|
|||
---|---|---|---|
#18+
Алексей Ку., "Плюсовая" версия писалась на Borland C++ Builder 6 (это имеет значение?) Забыл ещё уточнить про этот момент Правильно ли преобразовал типы? Плюсы: __property TNotifyEvent OnInput = { read = FOnInput, write = FOnInput }; __property TNotifyEvent OnOutput = { read = FOnOutput, write = FOnOutput }; Шарп: private EventHandler FOnInput; private EventHandler FOnOutput; ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 16:28 |
|
Помогите с переводом C++ -> C#
|
|||
---|---|---|---|
#18+
И ещё вот тут вопрос: Плюсы: объявление в хидере TStrings* FDuplicates; инициализация в СРР FDuplicates = new TStringList(); Какой аналог этого дела в шарпе? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 16:49 |
|
Помогите с переводом C++ -> C#
|
|||
---|---|---|---|
#18+
Алексей Ку.Правильно ли преобразовал типы? Плюсы: __property TNotifyEvent OnInput = { read = FOnInput, write = FOnInput }; __property TNotifyEvent OnOutput = { read = FOnOutput, write = FOnOutput }; Шарп: private EventHandler FOnInput; private EventHandler FOnOutput; По моему нет. Это должно быть событие или свойство где get содержит код из read, a set код из write Алексей Ку.Плюсы: объявление в хидере TStrings* FDuplicates; инициализация в СРР FDuplicates = new TStringList(); Какой аналог этого дела в шарпе? Я бы использовал List<string> ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 16:53 |
|
Помогите с переводом C++ -> C#
|
|||
---|---|---|---|
#18+
bazileАлексей Ку.Правильно ли преобразовал типы? Плюсы: __property TNotifyEvent OnInput = { read = FOnInput, write = FOnInput }; __property TNotifyEvent OnOutput = { read = FOnOutput, write = FOnOutput }; Шарп: private EventHandler FOnInput; private EventHandler FOnOutput; По моему нет. Это должно быть событие или свойство где get содержит код из read, a set код из write Тут я немного ошибся: Плюсы: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
У меня на шарпе: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
SetInput/Output ещё пока что не прописал. Так верно? авторАлексей Ку.Плюсы: объявление в хидере TStrings* FDuplicates; инициализация в СРР FDuplicates = new TStringList(); Какой аналог этого дела в шарпе? Я бы использовал List<string> Да, я тоже к нему пришёл ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 17:24 |
|
Помогите с переводом C++ -> C#
|
|||
---|---|---|---|
#18+
Алексей Ку.Так верно? Верно или нет решать тебе, но я бы написал так: Код: c# 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 17:48 |
|
Помогите с переводом C++ -> C#
|
|||
---|---|---|---|
#18+
bazileАлексей Ку.Так верно? Верно или нет решать тебе, но я бы написал так: Код: c# 1. 2.
А Вы бы не могли пояснить разницу между public event EventHandler OnInput; и private EventHandler FOnInput; ? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 17:53 |
|
Помогите с переводом C++ -> C#
|
|||
---|---|---|---|
#18+
Алексей Ку., вроде как event ожно добавить в интерфейс, а поле нельзя. А по сути, это делегат и так и сяк ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 20:09 |
|
Помогите с переводом C++ -> C#
|
|||
---|---|---|---|
#18+
Алексей Ку., разница больше семантическая. С полем типа EventHandler можно обращаться так же как с событием event EventHandler, то есть добавить несколько делегатов с помощью += и они будут выполняться. Но мое восприятие будет разным для этих случаев. Видя событие я понимаю что автор класса хотел чтобы на него подписывались. А глядя на делегат в виде поля класса мне будет непонятно что автор хотел этим сказать. Плюс C# себя немного по другому ведет при внешнем доступе к событию или делегату - событие нельзя сгенерировать извне. Поэтому использование event мне кажется более логичным в данном случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 23:12 |
|
Помогите с переводом C++ -> C#
|
|||
---|---|---|---|
#18+
bazileразница больше семантическая Разница самая что ни на есть фактическая. Код Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
в первом случае транслируется вот в такой незамысловатый IL: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
и видно, что объявленный делегат - просто обычное поле. Которому, например, можно "в лоб" присвоить null. С объявленным event'ом такой трюк не выйдет, потому как внутри там все несколько более сложно: Код: 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. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77.
Рихтер вышеприведенное под спойлером демонстрировал в виде такого псевдокода: Код: 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.
т.е. компилятор как минимум обеспечивает потокобезопасную подписку/отписку (The Interlocked Anything Pattern у того же автора). ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2015, 06:34 |
|
|
start [/forum/topic.php?fid=20&gotonew=1&tid=1401921]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
11ms |
get first new msg: |
7ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 158ms |
0 / 0 |