Когда я должен использовать With-End With и когда я должен использовать нормальные ссылки на объекты в VB6? - PullRequest
3 голосов
/ 20 апреля 2011

Просматривая код, который я поддерживаю, я вижу, что в некоторых местах используется конструкция With - End With ...

With my_object
    .do_this()
    .do_that()
    .do_the_other()
End With

а иногда и более простой

my_object.do_this()
my_object.do_that()
my_object.do_the_other()

Есть ли тонкие различия между этими двумя формами? И вообще, что я предпочитаю?

(Мое личное мнение таково, что я иду на второе, потому что после двух или трех вложений на первое начинает болеть голова - это достаточная причина?)

Ответы [ 4 ]

4 голосов
/ 20 апреля 2011

Существует разница, если ссылка на объект на самом деле является более сложным выражением, таким как получение свойства или возвращаемое значение функции.

Сравните это:

With MyObjectFactory.CreateMyObject()
    .do_this
    .do_that
    .WriteToDatabase
End With

Противочевидно неправильный:

MyObjectFactory.CreateMyObject().do_this
MyObjectFactory.CreateMyObject().do_that
MyObjectFactory.CreateMyObject().WriteToDatabase

Фактическим эквивалентом в этом случае будет создание ссылки:

Dim myObject as MyObject
Set myObject = MyObjectFactory.CreateMyObject() 
myObject.do_this
myObject.do_that
myObject.WriteToDatabase

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

2 голосов
/ 21 апреля 2011

Джастин неверен. With...End With конструкция - это не просто синтаксическая конфета, это еще и трюк с производительностью. Когда у вас есть путь к объекту, который включает в себя несколько точек (.), Увеличение производительности довольно заметно, особенно при зацикливании и / или работе с Types (структурами).

Например, этот код:

For x = 1 to my_object.Employee.Records.Count
    Debug.Print my_object.Employee.Records(x).ID
Next

будет намного быстрее как:

For x = 1 to my_object.Employee.Records.Count
    With my_object.Employee.Records(x)
        Debug.Print .ID
    End With
Next

и, как указал @wqw, он, вероятно, будет еще быстрее (в зависимости от того, сколько свойств вам нужно получить доступ), например, так как он предлагает наименьшее количество переквалификации объекта:

With my_object.Employee.Records
    For x = 1 to .Count
        Debug.Print Item(x).ID
    Next    
End With

Дайте ему шанс, вы увидите разницу.

1 голос
/ 22 апреля 2011

Новый ответ только на почтовый индекс.

Обратите внимание, что кеширование объектов не всегда делает то, что вы ожидаете, будь то использование анонимного С-кэша или явной ссылочной переменной (или аргумента процедуры). И DumpRS, и DumpRSII ниже делают одно и то же, печатая все значения в RS:

Option Explicit
'Add a reference to ADO 2.5 or later.

Private RS As ADODB.Recordset

Private Sub MakeRS()
    Dim I As Integer

    Set RS = New ADODB.Recordset
    With RS
        .CursorLocation = adUseClient
        .Fields.Append "SomeField", adInteger
        .Open
        For I = 1 To 10
            .AddNew Array(0), Array(I)
        Next
    End With
End Sub

Private Sub DumpRS()
    With RS.Fields(0)
        RS.MoveFirst
        Do Until RS.EOF
            Debug.Print .Value
            RS.MoveNext
        Loop
    End With
End Sub

Private Sub DumpRSII(ByVal Field As ADODB.Field)
    With RS
        .MoveFirst
        Do Until .EOF
            Debug.Print Field.Value
            .MoveNext
        Loop
    End With
End Sub

Private Sub Main()
    MakeRS
    DumpRS
    DumpRSII RS.Fields(0)
    RS.Close
End Sub

Объект Field - это просто окно на курсоре. Объекты поля кэширования могут значительно повысить производительность повторяющихся операций ADO.

0 голосов
/ 20 апреля 2011

Я бы использовал первую версию только для установки значений свойств, таких как блок инициализации в C #.Если вы вызываете методы и т. Д., Используйте вторую форму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...