Как достигнуть C#, 'поскольку' ключевое слово для значения вводит в vb.net?

Пожалуйста, проверьте ниже кусок кода и сообщите, если это решило вашу проблему

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class LaunchChrome {

    public static void main(String[] args) {

        System.setProperty("webdriver.chrome.driver", "D:\\user\\chromedriver_win32\\chromedriver.exe");

        WebDriver driver=new ChromeDriver();

        readFileLineByLineUsingBufferedReader(driver); 
    }

    public static void readFileLineByLineUsingBufferedReader(WebDriver driver) {
        BufferedReader reader;
        try {
            reader = new BufferedReader(new FileReader("CSV_FILE_PATH"));
            String line = reader.readLine();
            while(line != null) {
                driver.get(line);
                // You may give some pause here (Thread.sleep(2000));  
                // read next line
                line = reader.readLine();
            }
            reader.close();
        } catch(IOException io) {
            io.printStackTrace();
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}
12
задан ЯegDwight 5 August 2010 в 14:17
поделиться

6 ответов

В VB 9.0 "IF" является истинной операцией объединения, эквивалентной "??" в C #. Источник MSDN :

Так что вы можете использовать:

oObject.Name = IF(oReader.Item("Name").Equals(DBNull.Value),string.Empty,DirectCast(oReader.Item("Name"), String))
5
ответ дан 2 December 2019 в 19:32
поделиться

Редактировать

Извините за прорастание такой ерунды. Я полагался на публикацию Пола Вика (тогдашнего руководителя команды VB), а не на MSDN , и у меня не будет установлен Windows для тестирования кода.

Я буду все еще оставляю мою публикацию - сильно измененную (обратитесь к истории редактирования, чтобы прочитать неверный исходный текст) - потому что я считаю, что точки все еще имеют некоторые достоинства.

Итак, еще раз, три вещи, чтобы подытожить:

  1. Для ссылочные типы , C # как напрямую моделируется TryCast в VB.

    Однако C # добавляет немного больше для обработки типов значений посредством распаковки (а именно возможность распаковать типы значений в их Nullable аналог через как ).

  2. VB 9 предоставляет оператор If для реализации двух различных операторов C #: null coalescing ( ?? ) и условный (? : ), следующим образом:

    ' Null coalescing: '
    Dim result = If(value_or_null, default_value)

    ' Conditional operator: '
    Dim result = If(condition, true_value, false_value)

В отличие от предыдущей функции IIf это реальные операторы с коротким замыканием, то есть будет выполняться только необходимая часть. В частности, следующий код скомпилируется и будет работать нормально (не будет с функцией IIf , поскольку мы можем делить на ноль):

    Dim divisor = Integer.Parse(Console.ReadLine())
    Dim result = If(divisor = 0, -1, 1 \ divisor)
  1. Не использовать обработку ошибок в стиле VB6 ( On Error GoTo… или On Error Resume [Next] ). Это обратная совместимость для простого преобразования VB6. Вместо этого используйте механизмы обработки исключений .NET, как в C #.
9
ответ дан 2 December 2019 в 19:32
поделиться

Используйте метод IsDbNull для проверки нулевых значений вместо дорогостоящего try-fail-handlefailure подходить. Обработка ошибок почти всегда обходится дороже, чем перехват условия перед тем, как он становится ошибкой.

(Кроме того, обработка ошибок должна использовать исключения, а не стиль VB6 ON ERROR GOTO HELL ...)

С условным Если бы функция выглядела бы так как однострочная:

oObject.Name = If(oReader.IsDbNull(oReader.GetOrdinal("Name")), Nothing, oReader.GetString(oReader.GetOrdinal("Name")))

Я бы предпочел написать несколько вспомогательных функций, которые можно было бы использовать для того, чтобы сделать код более читабельным и более эффективным:

Function GetStringOrDefault(reader As DbDataReader, key As String) As String
   Dim ordinal = reader.GetOrdinal(key)
   If reader.IsDbNull(ordinal) Then
      Return Nothing
   Else
      Return reader.GetString(ordinal)
   End If
End Function

Использование:

oObject.Name = GetStringOrDefault(oReader, "Name")

Вы в качестве альтернативы можно записать их как расширения класса DbDataReader , чтобы сделать их еще более читабельными.

2
ответ дан 2 December 2019 в 19:32
поделиться

I не думайте, что в VB.NET есть оператор, который имитирует работу оператора ?? в C #. Тем не менее, вы можете использовать эквивалент троичного оператора C # - Функция IIF в вашем случае:

По общему мнению, некрасиво:

oObject.Name = IIf(oReader.Item("Name").Equals(DBNull.Value), DirectCast(oReader.Item("Name"), String), String.Empty)
oObject.Value = IIf(oReader.Item("Value").Equals(DBNull.Value), DirectCast(oReader.Item("Value"), Integer), -1)

Пожалуйста, прочитайте пост Стивена Уэтерфорда по ссылке, которую я предоставил выше, которая предлагает универсальная функция IIf, которая выводит требования типа из предоставленных аргументов. Это становится необходимым, потому что функция IIf всегда возвращает объект!

Лучшим вариантом было бы создать функцию, которая выполняет это приведение условно, а не пытаться сделать это в одной строке.

1
ответ дан 2 December 2019 в 19:32
поделиться

Все добавили несколько важных моментов в эту дискуссию, поэтому я решил обобщить важные моменты.

  1. В.Б. .net TryCast () НЕ НЕ то же самое, что C # как ключевое слово. Если бы это было то же самое, тогда не было бы необходимости в этом вопросе.

  2. VB.net использует функцию If () для троичных операций и операций объединения нулей. Это не так легко прочитать, как версию C # (соответственно? И ??). Старайтесь избегать использования функции vb.net IIf (), поскольку это не одно и то же.

  3. Шаблон слияния нулевого кода не работает, так как мы не можем использовать TryCast () с обнуляемыми типами, поэтому мы должны использовать троичный шаблон.

  4. oReader.IsDBNull (oReader.GetOrdinal ("Name")) - лучший способ проверить, является ли значение DBNull.

1
ответ дан 2 December 2019 в 19:32
поделиться

Согласно документации, TryCast работает только со ссылочными типами. В любом случае, проблема может быть связана с тем, что вы используете IDataReader, а не trycast.

Перед циклическим циклом по строкам в IDataReader получите порядковые значения имен столбцов и используйте строго типизированные методы GetX для получения значений полей, например

Dim name As Integer = oReader.GetOrdinal("Name")
Dim value as Integer = oReader.GetOrdinal("Value")

While reader.Read()
  oObject.Name = if(oReader.IsDbNull(name), string.Empty, oReader.GetString(name))
  oObject.Value = if(oReader.IsDbNull(value), -1, oReader.GetInt32(value)
End While

' Call Close when done reading.
oReader.Close()

Использование оператора if с 3-мя такими параметрами заставляет его работать как троичный булев оператор C # eval? TrueExpression: falseExpression

Это должно помочь вам в вашей проблеме.

0
ответ дан 2 December 2019 в 19:32
поделиться