2013-11-11 3 views
2

Просматривая старый код VB.Net, я заметил странную модель, которая заставляет меня почесывать голову.Создание экземпляра объекта New Nothing

Dim objMyObject As Namespace.Child.ChildType = Nothing 
objMyObject = New Namespace.Child.ChildType 

(Там нет дополнительного кода между размерами и назначением.)

Похоже, предпочтительный стиль должен был бы сделать как на одной строке, либо пропустить = Nothing. Как следует:

Dim objMyObject As Namespace.Child.ChildType = New Namespace.Child.ChildType 

ИЛИ

Dim objMyObject As Namespace.Child.ChildType 
objMyObject = New Namespace.Child.ChildType 

ИЛИ, как это было предложено @helrich

Dim objMyObject As New Namespace.Child.ChildType 

Есть ли конкретное значение, чтобы делать это таким образом, или это экземпляр оригинальный программист используется для VB6-способа делать что-то?


В VB6, размеров и инстанцировании переменной в одной строке было сочтено проблематичным, поскольку она будет повторно запустить создание экземпляра (при необходимости), когда переменная была доступна - фактически, переменная отрегулировано таким образом, никогда не могли быть проверены на Ничего, потому что новый экземпляр будет создан по требованию. Однако VB.Net не сохраняет это соглашение.

+3

Или даже 'Dim objMyObject As New Namespace.Child.ChildType'. – helrich

+0

Ничто не является нулевым, как вы, вероятно, знаете. Инициализация чего-либо Nothing и объявление переменной (ссылочного типа) без назначения - одно и то же. –

+0

это может быть либо отражением * предпочтения * или * уровня * оригинального разработчика *. Если это «старый код VB.Net», возможно, вы не могли бы сделать это в очень ранних версиях (?) Или снова, они не знали, что могли. – Plutonix

ответ

4

Нет, это бессмысленно. CLR уже предоставляет жесткую гарантию того, что переменные инициализируются ничем.

В противном случае полностью безвреден, оптимизатор джиттера полностью удалит код для назначения. Поэтому, если оригинальный автор предпочел этот стиль, тогда все в порядке. Возможно, он был бывшим программистом на C#, который не понимал определенных правил назначения на этом языке. VB.NET тоже делает некоторые проверки, но это не так строго. Убедитесь, что это командный стандарт, за которым вы должны следовать, надеюсь, нет.

+0

Надеюсь, что нет. :) Проект действительно пошел в другом направлении, от VB6 до VB.Net до C#. Большая часть оставшегося кода VB6/VB.Net не была затронута через 7 или 8 лет. – GalacticCowboy

+0

Значит ли это, что в C# было бы необходимо выполнить 'Namespace.Child.ChildType myObj = null;' или это было бы бессмысленно? – Mr1159pm

+0

Это не требуется в C#, инструкция * new * считается инициализацией. Так что да, бессмысленно. –

2

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

Но мне было интересно здесь (гипотеза): так как вы должны разделить этот путь, когда хотите сохранить переменную в стеке, когда она назначена в кодовом блоке (например: If), возможно, когда-то этот блок существовал, и он был удален, сохраняя постоянную связь с ним. Его ассоциация, однако, не была объединена с ее декларацией.


О ассоциирования Nothing к пустой переменной: Лично мне нравится этот шаблон. :)

Он рассказывает мне (в будущих версиях), что переменная была объявлена ​​с пустым (нулевым) значением с целью. Это устраняет сомнения, что я, может быть, забыл написать ключевое слово New за типом.

Ahh, и он также устранит a vb.net warning во время сборки.

+0

Это предупреждение не появляется, если переменная не присваивается никакому значению вообще. Также помните пример, который я написал в моих комментариях выше: одна вещь - это что-то вроде Dim myString As String = Nothing (-> уже созданный экземпляр, с или без = Nothing), а другая вещь - класс Dim myClass as myWholeClass = Nothing (-> он не экземпляр) – varocarbas

+0

@varocarbas: Вы правы. Но предупреждение может также появляться в случаях, когда «возможно» var не будет назначен (то есть условное присвоение). Назначение объявления + null может быть полезно в случаях метода «ReturnValidValueOrNull». –

+1

Как я уже говорил в своем (удаленном) ответе; Мне нравится = ничего (ну ... = что-то, в идеале - правильное значение), потому что я привык писать его таким образом. Но, на самом деле, не имеет никакого влияния: VB.NET сделает эту переменную ничем независимо от того, что вы там пишете. – varocarbas

Смежные вопросы