Страница: 1 | 2 | 3 |
Вопрос: Если Dim txt As Int32 = 0 ...
Добавлено: 18.12.06 22:59
Автор вопроса: -АлександР- | Web-сайт:
я переходящий с vb6 на vb.Net не могу понять, почему, когда мы численный тип приравниваем к нулю, он генерирует ошибку???
Заранее спасибо!
Ответы
Всего ответов: 32
Номер ответа: 1
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #1
Добавлено: 19.12.06 06:49
Не должен...
Покажи весь код, и какую именно ошибку генерирует?
Номер ответа: 2
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #2
Добавлено: 19.12.06 19:07
Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TextBox1.Select()
End Sub
Private Sub cmdMake_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdMake.Click
pctMain.Refresh()
Dim formGraphics As System.Drawing.Graphics
formGraphics = pctMain.CreateGraphics()
Dim txt As Int32 = 0 'CInt(TextBox1.Text)
Dim k As Int32 = CType(TextBox1.Text, Single)
formGraphics.DrawLine(Pens.Blue, 100, 100, CInt(TextBox1.Text), 100)
formGraphics.Dispose()
End Sub
End Class
Номер ответа: 3
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #3
Добавлено: 19.12.06 19:12
Хм... странно, то что я привел, работает...
не работает так:
pctMain.Refresh()
Dim formGraphics As System.Drawing.Graphics
formGraphics = pctMain.CreateGraphics()
Dim txt As Int32 = CInt(TextBox1.Text)
Dim k As Int32 = CType(TextBox1.Text, Single)
formGraphics.DrawLine(Pens.Blue, 100, 100, CInt(TextBox1.Text), 100)
formGraphics.Dispose()
End Sub
Если TextBox1.Text = ""
ошибка приведение строки к типу Integer строки является недопустимым.
VB6 - в таких случаях рулит. и в нем CInt("" = 0
Номер ответа: 4
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #4
Добавлено: 19.12.06 19:14
Вышел из ситуации так:
Dim txt As Int32 = CInt(TextBox1.Text)
или есть другие способы получше?
Номер ответа: 5
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #5
Добавлено: 19.12.06 19:49
CInt - это устаревшая конструкция из VB6, и желательно от нее избавляться.. В твоей ситуации целесообразнее использовать что-то типа TryParse(имхо).. потому что твой вариант пропустит обычный пробел..
Номер ответа: 6
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #6
Добавлено: 19.12.06 19:52
А вот эта строчка..
вообще порадовала!!!! )))
Зачем явно приводить к типу Single, и тут же делать из него Int32?? В чем глубокий смысл этого преобразования?
Номер ответа: 7
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #7
Добавлено: 19.12.06 19:53
Как тебе нужно реагировать на пустую строку? Интерпретировать ее как 0, или прерывать выполнение? Если интерпретировать как 0, то вот тебе код:
If PayCounter.Text = "" Then
txt = 0
Else
If Not Integer.TryParse(PayCounter.Text, txt) Then Return
End If
Номер ответа: 8
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #8
Добавлено: 19.12.06 22:04
Вполне нормальная конструкция.
Номер ответа: 9
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #9
Добавлено: 19.12.06 22:07
Хотя конечно в этом варианте нужно использовать TryParse
Номер ответа: 10
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #10
Добавлено: 19.12.06 22:08
Dim k As Int32 = CType(TextBox1.Text, Single)
вообще порадовала!!!! )))
Зачем явно приводить к типу Single, и тут же делать из него Int32?? В чем глубокий смысл этого преобразования?
Еще советую включить Option Strict On, узнаешь о своем коде очень много нового
Номер ответа: 11
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #11
Добавлено: 19.12.06 23:53
А никто и не говорил, что она не нормальная... она нормальная, но устаревшая... Лично я предпочитаю юзать более новые конструкции, и по возможности избавляться от атавизмов и рудиментов из VB6..
Номер ответа: 12
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #12
Добавлено: 20.12.06 00:37
CInt - не устаревшая
Устаревшее - это то что лежит в Microsoft.VisualBasic и оставлено исключительно для совместимости с legacy-кодом и для ламеров которые не могут изучить новую библитоеку классов.
Типа Left, FileOpen, vbCrLf
То что осталось на уровне синтаксиса - это норма.
Да, компилируется это в те же самые вызовы helper-классов из Microsoft.VisualBasic, но это не унаследования функциональность, а встроеная. Поэтому использование этих функций не является плохим стилем программирования.
Поэтому CInt не является устаревшей (тот же Int ЯВЛЯЕТСЯ).
Резюмировать это хочу цитатой из MSDN
ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_vbalr/html/d9d8d165-f967-44ff-a6cd-598e4740a99e.htm
Для тех кто учил в школе албанский.
Эти функции сделаны специально для VB-кода, с целью сделать его короче и понятнее.
Кроме того, эти функции работают именно так как они работали в Visual Basic, иногда это отличается от результатов работы встроеных функций в .NET Framework (к примеру - то самое сравнение строк, о котором я ранее говорил).
Что касается ошибочной работы CInt("" - я сам был удивлен когда столкнулся с этой проблемой. Результатом работы логически должен быть 0 а не исключение.
Номер ответа: 13
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #13
Добавлено: 20.12.06 00:44
2 EROS
Ты уже безнадежно от меня отстал ))
Posts +=1
Номер ответа: 14
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #14
Добавлено: 20.12.06 01:12
Думаю, через год Brand будет входить в тройку posts++
Номер ответа: 15
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #15
Добавлено: 20.12.06 03:00
Да ну, достаточно сделать