Shruti91 Ответов: 2

Переменная не очищается в цикле.


В этом коде переменная фильтра не очищается в цикле, если она не инициализирована, но если я ее инициализирую, она работает правильно. По какой причине он не очищается, когда не инициализируется?

Dim tables() As String = {"AcDailyTxnDetailPreMoc31032020Final" _
                                , "AdvAcBalanceDetai_110720202" _
                                , "AdvAcBalanceDetail" _
                                , "AdvAcBalanceDetail_New"}
        For Each tableName As String In tables
            Dim filter As String
            If tableName.Contains("AcDailyTxnDetail") Then
                filter = IIf(filter = "", " TxnDate>'31/mar/2020'", filter)
            End If
        Next


Что я уже пробовал:

Dim tables() As String = {"AcDailyTxnDetailPreMoc31032020Final" _
                                , "AdvAcBalanceDetai_110720202" _
                                , "AdvAcBalanceDetail" _
                                , "AdvAcBalanceDetail_New"}
        For Each tableName As String In tables
            Dim filter As String=""
            If tableName.Contains("AcDailyTxnDetail") Then
                filter = IIf(filter = "", " TxnDate>'31/mar/2020'", filter)
            End If
        Next

2 Ответов

Рейтинг:
1

OriginalGriff

Чтобы добавить к тому, что сказал Патрис, если вы не инициализируете переменную, ей присваивается значение по умолчанию, основанное на ее типе. "Базовая переменная", такая как целое число или двойник, равна нулю, поэтому

Dim i As Integer
Dim d As Double
Это то же самое что сказать
Dim i As Integer = 0
Dim d As Double = 0.0

Но для более сложных переменных, таких как строки, они не являются таковыми - этим переменным присваиваются значения класса по умолчанию, которые являются специальным значением, называемым Nothing - который содержит ... ну, ничего. Это на самом деле очень важно знать, потому что Nothing это не то же самое, что "пусто".
Пустая строка:
Dim s As String = ""
означает, что переменная содержит реальную, живую, подлинную - если она пуста - строку.
Dim s As String
отличается - она вообще ничего не содержит, и если вы попытаетесь использовать s чтобы вызвать любой из строковых методов, вы получите "исключение нулевой ссылки", которое говорит: "здесь нет ничего, чтобы вызвать метод!"

Это немного похоже на автомобили. У вас есть автомобиль, который вы всегда паркуете в одном и том же месте. Вы идете в космос, садитесь в машину и можете ехать на работу. Он прекрасно работает, даже если вы продадите машину и купите новую: она находится в пространстве, так что вы можете управлять ею. Автомобиль-это значение (строка); пробел-это переменная (контейнер для экземпляра автомобиля)

Но... если ваша жена встает рано и берет машину, то пространство пусто, и когда вы пытаетесь ехать на работу, у вас есть проблема: вы не можете сделать ничего, что вы обычно делаете:
Dim mySpace as Car
mySpace.OpenDoor(Cardoors.Driver)
Произойдет сбой (с нулевой ссылкой), когда вы попытаетесь вызвать его, потому что пространство пусто. В реальной жизни, если вы подойдете к своему пустому парковочному месту и попытаетесь открыть дверь и сесть, вы получите очень странные взгляды, и вы действительно не скоро доберетесь до работы! В компьютерном мире то же самое - попытка использовать переменную, содержащую Nothing это значит, что компьютер странно смотрит на вас и работает не так, как вы надеялись!

В результате рекомендуется всегда устанавливать начальное значение при объявлении переменной, даже если она содержит нулевое или пустое значение.

Теперь в этом больше смысла?


Рейтинг:
1

Patrice T

Цитата:
По какой причине он не очищается, когда не инициализируется?

Потому что неинициализированная строковая переменная-это не то же самое, что пустая строка.