|
Ограничить присваимые значения типу int на этапе компиляции.
|
|||
---|---|---|---|
#18+
Привет. Туплю что-то. Мне нужно позволить чтобы в свойство можно было ввести только число от 1 до 5. Хочется чтобы это проверялось не в рантайме а прямо при разработке. На ум приходит только такая тупая конструкция. Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Числа имен не имеют. Т.е. я не могу их обозвать как то по умному. Просто от 1 до 5. PS. В Дельфи есть возможность создать свой тип на основе int, ограничив допустимые значения. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2015, 21:49 |
|
Ограничить присваимые значения типу int на этапе компиляции.
|
|||
---|---|---|---|
#18+
а чем не нравится этот вариант? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2015, 21:56 |
|
Ограничить присваимые значения типу int на этапе компиляции.
|
|||
---|---|---|---|
#18+
ProBiotek, Код: 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. 189. 190. 191.
думаю автору нужно, что то вроде этого. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2015, 23:22 |
|
Ограничить присваимые значения типу int на этапе компиляции.
|
|||
---|---|---|---|
#18+
ProBiotek, можно использовать Code Contracts. Во всяком случае, можно задать требуемое поведение для свойств, а вот для полей - не уверен. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2015, 23:29 |
|
Ограничить присваимые значения типу int на этапе компиляции.
|
|||
---|---|---|---|
#18+
petalvik, для полей можно создать структуру где задать нужное поведение. вот только не пойму одного. для структуры int16 IDE проверяет значение. то есть Int16 a = 10000; сообщает об ошибке, хоть оператор присвоения перегружен для типа int. не очень понятно, как заставить его проверять свою структуру ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2015, 23:34 |
|
Ограничить присваимые значения типу int на этапе компиляции.
|
|||
---|---|---|---|
#18+
Всё-таки можно и для поля задать инвариант с помощью метода, помеченного атрибутом ContractInvariantMethod. Всё никак не проштудирую эти контракты как следует. Удручает скорость проверки. Скорость компиляции намного дольше с включенными контрактами. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 00:00 |
|
Ограничить присваимые значения типу int на этапе компиляции.
|
|||
---|---|---|---|
#18+
Roman Mejtes, Ох жеж. Сколько кода то ))) Но оно же не будет работать в дезайн-тайме ! В рантайме я и так могу сам все проверить. Ибо это свойство (в которое я хочу сохранять числа) принадлежит классу. А класс я буду валидировать. Просто захотелось чего-то странного, под вечер не_пятницы. Я подумал. И решил, что пожалуй оставлю свой вариант с enum. Буду просто и использовать прямо его (а не int вообще), а уже при сохранении в БД и буду преобразовывать. Для чего мне вообще это нужно. У меня есть показатели характеристики товара. Их 10 штук. Каждое из них - это оценка типа "удобство носки", "прочность". Все они могут принимать оценку от 1 до 5. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 11:35 |
|
Ограничить присваимые значения типу int на этапе компиляции.
|
|||
---|---|---|---|
#18+
ProBiotek, нет желания попробовать Code Contracts? Новомодная фича от MS. Можно сразу прослыть крутым прогером :). Так ограничиваем диапазон значений свойству: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Так задаём инвариант значений полю класса: Код: c# 1. 2. 3. 4. 5. 6. 7.
Если теперь в свойствах проекта на вкладке Code Contracts поставить галочку Perform Static Contract Checking, снять галочку Check in background и поставить галочку Fail build on warnings - проект не скомпилируется, если будут заданы не подходящие значения. Ошибки будут указаны привычным способом. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 18:36 |
|
Ограничить присваимые значения типу int на этапе компиляции.
|
|||
---|---|---|---|
#18+
petalvikЕсли теперь в свойствах проекта на вкладке Code Contracts поставить галочку Perform Static Contract Checking, снять галочку Check in background и поставить галочку Fail build on warnings - проект не скомпилируется, если будут заданы не подходящие значения. Ошибки будут указаны привычным способом. что то у меня нет в 2012 такой вкладки, только в 2013 есть или включить где то надо? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 18:41 |
|
Ограничить присваимые значения типу int на этапе компиляции.
|
|||
---|---|---|---|
#18+
Roman Mejtes, нужно скачать CodeContracts . И после установки перезапустить Студию (если она запущена была), чтобы она подхватила изменения. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 19:10 |
|
Ограничить присваимые значения типу int на этапе компиляции.
|
|||
---|---|---|---|
#18+
petalvik, ну всё еще пару мегабайт и я стану крутым прогером =) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 19:21 |
|
Ограничить присваимые значения типу int на этапе компиляции.
|
|||
---|---|---|---|
#18+
petalvik, Читал я давно. Дино Эспозито еще года 3-4 назад писал статьи в МСДН магазине. Кажется мне не понравилось, именно что это все не официально и, кажется, там какие-то сложности чтобы была поддержка в дизайн тайме. Помнится что-то нужно было ставить дополнительно чтобы в настройках проекта появились дезайн-тайм фичи. В общем это наверное круто, когда нет командной разработке, и пишешь свой проект. Но когда проект пишет несколько человек, придется им всем устанавливать и настраивать этот компонент. Плюс как-то обеспечивать чтобы новый участник, временно подключившийся к проекту, тоже быстро поставил эту штуку - а это не так просто, нужно сколько то телодвижений. Еще, наверное, нужно будет всем вместе синхронно переходить на новые версии. У нас есть проект, в котором используется EF4 (где модели edmx) и всем страшно переводить его на EF6 Code First. Там проще переписать, выпустив новую версию программы. Как только MS сами решат что технология созрела и официально включат ее в VS. Тогда можно будет использовать. Но до тех пор, пока продукт еще в развитии, его удел это мелкие проекты, которые легко поддерживать и быстро переписать при изменении инструмента. PS. Это как с TPL. Году в 2008 был Parallel Extensions for .Net Framewok (PFX). Кто хотел, использовал на свой страх и риск (за что им спасибо, т.к. благодаря таким исследователям и развивалась технология). Потом появился TPL. Потом Async. Вот я бы подождал с контрактами в крупных проектах, пока они хотя бы не выйдут на стадию "TPL" с полноценной поддержкой в VS без бубна :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2015, 12:31 |
|
|
start [/forum/topic.php?fid=20&msg=38963341&tid=1401528]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 320ms |
total: | 460ms |
0 / 0 |