Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 | 3 |

 

  Вопрос: Если Dim txt As Int32 = 0 ... Добавлено: 18.12.06 22:59  

Автор вопроса:  -АлександР- | Web-сайт: sham.clan.su
я переходящий с vb6 на vb.Net не могу понять, почему, когда мы численный тип приравниваем к нулю, он генерирует ошибку???

Заранее спасибо!

Ответить

  Ответы Всего ответов: 32  

Номер ответа: 1
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #1 Добавлено: 19.12.06 06:49
Не должен...
Покажи весь код, и какую именно ошибку генерирует?

Ответить

Номер ответа: 2
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #2
Добавлено: 19.12.06 19:07
Public Class MainForm

    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-сайт: sham.clan.su
 Профиль | | #3
Добавлено: 19.12.06 19:12
Хм... странно, то что я привел, работает...

не работает так:
    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 = 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-сайт: sham.clan.su
 Профиль | | #4
Добавлено: 19.12.06 19:14
Вышел из ситуации так:
        If TextBox1.Text = "" Then Exit Sub
        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
А вот эта строчка..
Dim k As Int32 = CType(TextBox1.Text, Single)

вообще порадовала!!!! :-))))
Зачем явно приводить к типу Single, и тут же делать из него Int32?? В чем глубокий смысл этого преобразования?

Ответить

Номер ответа: 7
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #7 Добавлено: 19.12.06 19:53
Как тебе нужно реагировать на пустую строку? Интерпретировать ее как 0, или прерывать выполнение? Если интерпретировать как 0, то вот тебе код:

        Dim txt As Integer
        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
CInt - это устаревшая конструкция из VB6, и желательно от нее избавляться.. В твоей ситуации целесообразнее использовать что-то типа TryParse(имхо).. потому что твой вариант пропустит обычный пробел..

Вполне нормальная конструкция.

Ответить

Номер ответа: 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

As a rule, you should use the Visual Basic type conversion functions in preference to the .NET Framework methods such as ToString(), either on the Convert class or on an individual type structure or class. The Visual Basic functions are designed for optimal interaction with Visual Basic code, and they also make your source code shorter and easier to read. In addition, the .NET Framework conversion methods do not always produce the same results as the Visual Basic functions, for example when converting Boolean to Integer. For more information, see Troubleshooting Data Types.


Для тех кто учил в школе албанский.
Эти функции сделаны специально для 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-сайт: sharpc.livejournal.com
 Профиль | | #14
Добавлено: 20.12.06 01:12
Думаю, через год Brand будет входить в тройку :) posts++

Ответить

Номер ответа: 15
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #15 Добавлено: 20.12.06 03:00
Да ну, достаточно сделать

    UPDATE Messages SET UserID=915

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам