C# to VB.NET (проблемы с переменными)

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Temoon
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 07.10.2004 (Чт) 22:16
Откуда: Москва

C# to VB.NET (проблемы с переменными)

Сообщение Temoon » 07.10.2004 (Чт) 22:40

Как из
Код: Выделить всё
protected Socket s = null;
(C#) сделать аналогичное объявление переменной, но на VB.NET?

Я сделал так
Код: Выделить всё
Protected s As Socket
и сразуже вытекают две проблемы (в зависимости от решения):
1) Если оставить код как есть, то в фрагменте
Код: Выделить всё
If Not s Is Nothing And s.Connected Then ...
появляется ошибка "An unhandled exception of type 'System.NullReferenceException' occurred", а проще говоря s "несуществует", следовательно никакую s.Connected функцию он вызвать неможет.
2) Если написать
Код: Выделить всё
Protected s As Socket = vbNull
, то на месте vbNull появляется ошибка "Value of type 'Microsoft.VisualBasic.VariantType' cannot be converted to 'System.Net.Sockets.Socket'."

Что мне делать? Подскажите правильно переписать код с C# на VB.NET

corgi
ToyMan
ToyMan
 
Сообщения: 1367
Зарегистрирован: 01.10.2002 (Вт) 9:59
Откуда: Россия, Москва

Сообщение corgi » 07.10.2004 (Чт) 23:11

а если написать
Protected s As New Socket
Ничто так не ограничивает полёт мысли программиста, как компилятор

Temoon
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 07.10.2004 (Чт) 22:16
Откуда: Москва

Сообщение Temoon » 07.10.2004 (Чт) 23:21

Тогда возникает ошибка "Overload resolution failed because no accessible 'New' accepts this number of arguments." на "s" (Protected s As New Socket) т.к. Socket содержит кучу параметров внутри себя.

Вопщем вот сокращенный вариант кода "целиком":
Код: Выделить всё
Imports System.Net
Imports System.Net.Sockets

Public Class Chat
    Protected s As Socket   ' ???

    Public Function Connect() As Boolean
        If Not s Is Nothing And s.Connected Then
            Trace.WriteLine("Вы уже присоединены к одному из серверов.", "[Ошибка]")
            Return False
        End If

        Dim _host As IPHostEntry = Dns.Resolve(_address)
        Dim _ip As IPAddress

        For Each _ip In _host.AddressList
            Dim _ipe As IPEndPoint = New IPEndPoint(_ip, _port)
            Dim __socket As Socket = New Socket(_ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp)

            __socket.Connect(_ipe)

            If __socket.Connected Then
                If _timer Is Nothing Then
                    Dim _delay As Long = PacketDelay / (4 * TimeSpan.TicksPerMillisecond) : If _delay = 0 Then _delay = 500

                    _timer = New System.Timers.Timer(_delay)
                    _timer.AutoReset = True
                    _timer.Enabled = True
                End If

                s = __socket
                Return True
            End If
        Next

        Return False
    End Function
End Class


А вот оригинальный код:
Код: Выделить всё
using System.Net;
using System.Net.Sockets;

public class Chat
{
    protected Socket s = null;

    public bool Connect()
    {
        if (this.s != null && this.s.Connected) {
            Trace.WriteLine("You are already connected.", "[Error]");
            return false;
        }

        lock (this)
        {
            IPHostEntry _host = Dns.Resolve(_address);

            foreach(IPAddress _ip in _host.AddressList) {
                IPEndPoint _ipe = new IPEndPoint(_ip, _port);
   Socket __socket = new Socket(_ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
               
                __socket.Connect(_ipe);

                if (__socket.Connected) {
                    lock (this)
                    {
                        if (_timer == null) {
                            long _delay = Chat.PacketDelay / (4 * TimeSpan.TicksPerMillisecond); if (_delay == 0) _delay = 500;
                            _timer = new System.Timers.Timer(_delay);
                            _timer.AutoReset = true;
                            _timer.Enabled = true;
                        }

                        this.s =  __socket;
                        return true;
                    }
                } else {
                    continue;
                }
            }
           
            return false;
        }
    }
}

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 08.10.2004 (Пт) 9:18

Полный вариант:
Protected s As Socket = Nothing


2003:
If Not s Is Nothing AndAlso s.Connected Then

2005
If s IsNot Nothing AndAlso s.Connected Then
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Temoon
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 07.10.2004 (Чт) 22:16
Откуда: Москва

Сообщение Temoon » 08.10.2004 (Пт) 10:26

Спасибо, но проблема так и не исчезла - VB полюбому обращается к свойству s.Connect, а если s несуществует (а его несуществует изначально Nothing) - он выдает ошибку.

В этом же проекте есть такой участок кода, в котором мне удалось "обойти" проверку свойства, если s Is Nothing:
Код: Выделить всё
If s Is Nothing Then Exit Function

If Not s.Connected Then
    _address = "localhost"
End If

но в функции Connect() так зделать уже нельзя, т.к. он никогда не сможет соединиться с сервером (создать сокет), ведь изначально s Is Nothing и он будет всегда прерывать функцию.

Возможно, есть какой-то другой вариант решения задачи? Смысл: перед вызовом функции соединения с сервером Connect() проверить, не соединены ли мы уже с ним; если соединены - выход из функции, если же нет - соединяемся.

Temoon
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 07.10.2004 (Чт) 22:16
Откуда: Москва

Сообщение Temoon » 08.10.2004 (Пт) 10:40

Ок. Проблема решена!

Сделал так (VB 2005, в более ранних таких функций нет):
Protected s As Nullable(Of Socket) = Nothing

. . .

If s <> Nothing AndAlso s.Value.Connected Then
Trace.WriteLine("Вы уже присоединены к одному из серверов.", "[Ошибка]")
Return False
End If

. . .

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.10.2004 (Пт) 12:03

Ну и зачем полагаться на фичи-2005 там, где можно без них обойтись? :)

Просто protected s as socket и, действительно, AndAlso.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Temoon
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 07.10.2004 (Чт) 22:16
Откуда: Москва

Сообщение Temoon » 08.10.2004 (Пт) 12:38

Дык "простые" фичи не работают.

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 08.10.2004 (Пт) 12:57

На будущее, есть тулзы VB.NET <-/-> C#. Неплохая встроена в SharpDevelop (http://sourceforge.net/projects/sharpdevelop/).
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 70

    TopList