Re[2]: Я фигею от VB.NET
От: alien74  
Дата: 23.07.03 12:51
Оценка:
Здравствуйте, nob114, Вы писали:

N>Kto ge peremnnuu vnutri tsikla objavlyaet ??? Objavite gde to eshe — a vistavit' mogno i v tsikle. Definitely buggy code.



в этом то и весь кайф что можно внутри цикла объявить в нете, а по окончании цикла убъется она

но в данном случае использование было некорректным
Re[2]: Я фигею от VB.NET
От: Lexey Россия  
Дата: 23.07.03 12:52
Оценка:
Здравствуйте, nob114, Вы писали:

N>Kto ge peremnnuu vnutri tsikla objavlyaet ??? Objavite gde to eshe — a vistavit' mogno i v tsikle. Definitely buggy code.


В нормальных языках нормальные люди переменные объявляют по месту использования, в том числе и внутри циклов.
Re[3]: Я фигею от VB.NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.07.03 13:07
Оценка:
Здравствуйте, Lexey, Вы писали:

L>В нормальных языках нормальные люди переменные объявляют по месту использования, в том числе и внутри циклов.


Я еще понимаю объявление переменных внутри объявления цикла, т.к. они будут сидеть в регистрах а не в стеке, но когда объявляют в середине кода, и начинаешь искать ее объявление начинаешь ....
Конечно дело вкуса, но мне нравится паскалевский подход.
и солнце б утром не вставало, когда бы не было меня
Re[4]: Я фигею от VB.NET
От: alien74  
Дата: 23.07.03 13:10
Оценка:
S> Конечно дело вкуса, но мне нравится паскалевский подход.


JEDEM DAS SEINE
Re[4]: Я фигею от VB.NET
От: Lexey Россия  
Дата: 23.07.03 13:15
Оценка:
Здравствуйте, Serginio1, Вы писали:

L>>В нормальных языках нормальные люди переменные объявляют по месту использования, в том числе и внутри циклов.


S> Я еще понимаю объявление переменных внутри объявления цикла, т.к. они будут сидеть в регистрах а не в стеке, но когда объявляют в середине кода, и начинаешь искать ее объявление начинаешь ....


1) Когда нужно лезть в начало функции, чтобы увидеть объявление переменной — это ничуть не лучше, а в большинстве случаев гораздо хуже, т.к. в этом случае в месте объявления смысл переменной попросту непонятен.
2) Объявление по месту, в теории, позволяет компилятору генерировать более эффективный код.

S> Конечно дело вкуса, но мне нравится паскалевский подход.


У нас правило объявления переменной непосредственно перед началом ее использования внесено в корпоративный стандарт кодирования, и в данном случае я с ним полностью солидарен.
Re[5]: Я фигею от VB.NET
От: Awaken Украина  
Дата: 23.07.03 13:20
Оценка:
>хуже, т.к. в этом случае в месте объявления смысл переменной попросту непонятен.
L>2) Объявление по месту, в теории, позволяет компилятору генерировать более эффективный код.

зависит от реализации компилятора. если объявление переменной в цикле заставляет модифицировать фрейм стека
при каждом проходе это наоборот замедляет код. интересно как в этом случае поступает .NET — в скомпилированном коде
объявление будет вынесено за цикл?
Re[6]: Я фигею от VB.NET
От: migel  
Дата: 23.07.03 13:25
Оценка:
Здравствуйте, Awaken, Вы писали:

A>зависит от реализации компилятора. если объявление переменной в цикле заставляет модифицировать фрейм стека

A>при каждом проходе это наоборот замедляет код. интересно как в этом случае поступает .NET — в скомпилированном коде
A>объявление будет вынесено за цикл?
Будет, будет в IL Переменные обявляються в самом начале метода...
Просто компилятор басика не делает код активации в начале области видимости переменной
Re[5]: Я фигею от VB.NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.07.03 13:28
Оценка:
Здравствуйте, Lexey, Вы писали:

L>2) Объявление по месту, в теории, позволяет компилятору генерировать более эффективный код.

Если переменные сидят в стеке, то какую либо оптимизацию получить сложно, тем более, что компилятору нужно следить за размещение в стеке, в отличии от объявления переменных внутри одной секции, т.к сразу определяется нужный размер стека под переменные.
Исключение составляют переменные циклов.
L>У нас правило объявления переменной непосредственно перед началом ее использования внесено в корпоративный стандарт кодирования, и в данном случае я с ним полностью солидарен.

Все зависит от длины куска кода, где применяется переменная, если небольшой вполне приемлемо, иначе....
и солнце б утром не вставало, когда бы не было меня
Re[6]: Я фигею от VB.NET
От: Lexey Россия  
Дата: 23.07.03 13:31
Оценка:
Здравствуйте, Awaken, Вы писали:

>>хуже, т.к. в этом случае в месте объявления смысл переменной попросту непонятен.

L>>2) Объявление по месту, в теории, позволяет компилятору генерировать более эффективный код.

A>зависит от реализации компилятора. если объявление переменной в цикле заставляет модифицировать фрейм стека


Естественно. Только вынести объявление всегда можно, а вот внести гораздо сложнее. А локальное объявление, по идее, позволяет один раз зарезервировать память под множество однотипных временных переменных. Только вот VC с этим успешно не справляется.
Re[7]: Я фигею от VB.NET
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 23.07.03 14:06
Оценка:
Здравствуйте, migel, Вы писали:

[]

M>Просто компилятор басика не делает код активации в начале области видимости переменной


Это что значит?
Конструктор размерного типа-то вызывается!
Получается интересная картина: если объявлять переменную с помощью New, для нее конструктор вызывается каждый раз в цикле. Это касается и встроеных типов, типа integer.
Например,
Structure s
   Public i as Integer
   Public Sub New(j as Integer)
   End Sub
End Structure
...
Dim i as Integer
Do
   Dim j as Integer
   Dim t as s
   Dim tt as s(20)
   WriteLine(j)
   WriteLine(t.i)
   WriteLine(tt.i)
   j = 10
   t.i = 100
   tt.i = 200
Loop while i < 3

Вывод
0        <- j
0        <- t.i
20       <- tt.i

10       <- j
100      <- t.i
20       <- tt.i

10       <- j
100      <- t.i
20       <- tt.i
Re[8]: Я фигею от VB.NET
От: migel  
Дата: 23.07.03 14:51
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Здравствуйте, migel, Вы писали:


AS>[]


M>>Просто компилятор басика не делает код активации в начале области видимости переменной


AS>Это что значит?

AS>Конструктор размерного типа-то вызывается!
AS>Получается интересная картина: если объявлять переменную с помощью New, для нее конструктор вызывается каждый раз в цикле. Это касается и встроеных типов, типа integer.

Вот и получается что инициализация объекта не происходит при повторном входе в область видимости
Re[3]: Я фигею от VB.NET
От: nob114  
Дата: 23.07.03 14:57
Оценка: -2
Dumai nad slovami, otets.
Re: Я фигею от VB.NET
От: nob114  
Дата: 23.07.03 15:01
Оценка:
Ne proshe li initsializirovat' ee s predugadivaemim znacheniem ? Ne vigu ja, ubeite, nikakogo zdes' nikakogo kriminala...

AS> Dim ii As Integer = 0

AS> Do
AS> Dim j As Integer = 0 ' or whatever ya want
AS> Console.WriteLine(j)
AS> j = 10
AS> ii += 1
AS> Loop While ii < 3
Re[4]: Я фигею от VB.NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.07.03 15:14
Оценка:
Здравствуйте, nob114, Вы писали:

N>Dumai nad slovami, otets.

Oy ctar uge stal synok, i dumat' uge len'.

А вот задумываться над тем как компилятор будет интерпретировать объявление переменной в цикле стоит.
и солнце б утром не вставало, когда бы не было меня
Re[5]: Я фигею от VB.NET
От: nob114  
Дата: 23.07.03 15:35
Оценка:
Ne vam adresovano bilo.
Re[6]: Я фигею от VB.NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.07.03 15:48
Оценка:
Здравствуйте, nob114, Вы писали:

N>Ne vam adresovano bilo.

Izvinyayus'
и солнце б утром не вставало, когда бы не было меня
Re[4]: Я фигею от VB.NET
От: Tom Россия http://www.RSDN.ru
Дата: 23.07.03 16:06
Оценка:
N>Dumai nad slovami, otets.
Lexey был абсолютно прав. Таким образом обьявлять переменные абсолютно нормальная практика. Применятся в тех случаях когда переменная/обьект должна быть создана на каждой итерации цикла.

ЗЫ: У нас не принято обращаться в таком тоне. Будьте следующий раз аккуратнее.
... << RSDN@Home 1.1 beta 1 >>
Народная мудрось
всем все никому ничего(с).
Re: Я фигею от VB.NET
От: al Россия  
Дата: 23.07.03 17:11
Оценка: 3 (1)
Здравствуйте, Alexey Shirshov, Вы писали:

Фигеть нечего. Это называется совместимостью с предыдущими версиями языка.
в VB6 это код (вернее немного пдправленный код) делает то же самое:

     Dim ii As Integer
     ii = 0
        Do
            Dim j As Integer
            MsgBox j
            j = 10
            ii = ii + 1
        Loop While ii < 3


Так что фигеть следовало-бы в обратном случае.

PS
VB это не C#


Re[5]: Я фигею от VB.NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.07.03 17:24
Оценка:
Здравствуйте, Tom, Вы писали:
Tom>Lexey был абсолютно прав. Таким образом обьявлять переменные абсолютно нормальная практика. Применятся в тех случаях когда переменная/обьект должна быть создана на каждой итерации цикла.

Не могли бы вы объяснить что будет происходить при объявление переменных Value типа.
Для объектов понятно выделяется память в куче, сборщик мусора пусть работает.
А что происходит с Value типом.Либо испльзуется старая переменная или каждый раз расширяется (сужается) стек ????
и солнце б утром не вставало, когда бы не было меня
Re[2]: Я фигею от VB.NET
От: Воронков Василий Россия  
Дата: 23.07.03 17:26
Оценка: +1
Здравствуйте, al, Вы писали:

Позволю себе не согласиться. Все же в VB.NET, в отличие от VB6, область видимости переменной ограничивается блоком, а не функцией. Так, в VB6 был бы вполне легален такой код:

If True Then
Dim i As Integer
i = 3
End If

MsgBox(i)


Более того, в диалог вывелось бы значение 3. В VB.NET же такой код просто не скомпилируется, так как там действительно используется с-подобная модель видимости переменных. Однако приведенный выше пример ее полностью нарушает. Таким образом, получается, что частично что-то переделали, а старые хвосты все же остались. Так что есть от чего фигеть на самом деле.
... << RSDN@Home 1.1 beta 1 >>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.