Объявления объектов C # - PullRequest
5 голосов
/ 28 апреля 2010

Существуют ли какие-либо издержки при использовании следующего синтаксиса:

Form1 myForm = new Form1();
myForm.Show();

В отличие от:

Form1 myForm;
myForm = new Form1();
myForm.Show();

Когда я изучал VB6, мне сказали, что у quivelent в VB есть издержки - то же самое относится и к .NET?

Ответы [ 6 ]

5 голосов
/ 28 апреля 2010

Разницы в .Net нет.

Но в VB6 As New было злом. У него было специальное значение : он создал переменную с автоматическим созданием экземпляра. Вы никогда не могли получить исключение нулевой ссылки с этими переменными. Среда выполнения VB6 автоматически создаст для вас новый экземпляр объекта.

Dim x As New Foo
x.Bar = 10      ' creates a new Foo '
Set x = Nothing ' destroys the first Foo'
x.Bar = 20      ' NO ERROR - creates a second Foo '

Такое поведение считалось злом большинством здравомыслящих программистов: и мы избегали As New как чума.

Но в VB.Net (и C #) нет разницы между Dim x As New Foo и Dim x As Foo: Set x = New Foo

5 голосов
/ 28 апреля 2010

Нет. Оба одинаковы.

2 голосов
/ 28 апреля 2010

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

1 голос
/ 28 апреля 2010

В последнем случае вы отделили декларацию только от экземпляра. Там нет значительного влияния этого. Я где-то читал, что создание экземпляра объекта .Net занимает 0,000007 секунд, поэтому вряд ли это имеет значение, хотя рекомендуется практиковать создание экземпляра объекта только при необходимости и удаление при необходимости или кэширование не требуется.

0 голосов
/ 28 апреля 2010

В этом примере вы создаете переменную [myForm] типа Form1 и выделяете ей память при создании.

Form1 myForm = new Form1(); 

В этом примере в первой строке создается переменная типа Form1, но памяти для этого объекта myForm не выделено.

Form1 myForm;   

Тогда вторая строка может использоваться всякий раз, когда вам нужен новый экземпляр типа Form1 [в этот момент память будет выделена для объекта myForm].

myForm = new Form1(); 

По моему мнению, это хорошая практика - объявить все ваши переменные для этих типов, а затем, когда вам нужен живой экземпляр, вы можете сделать ... obj = new Foo1 ();

0 голосов
/ 28 апреля 2010

Я сомневаюсь, что есть, но даже если бы и было, потери производительности были бы настолько незначительны, что не было бы никакого ощутимого преимущества, выбрав одно из другого.

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