Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
20 / 16 / 11
Регистрация: 07.12.2013
Сообщений: 244
1

Инициализация полей - в чем разница двух приведенных реализаций

03.08.2014, 11:28. Просмотров 597. Ответов 5
Метки нет (Все метки)


C#
1
2
3
4
5
6
7
8
9
10
11
class first
{
      public first()
     {
       a=5;
       b="строка";
     }
 
   int a;
   string b;
}
C#
1
2
3
4
5
class second
{
   int a=5;
   string b="строка";
}
В классе first инициализация полей происходит через конструктор по умолчанию,в классе second-через инициализаторы полей.Собственно,существенна ли разница и чему отдавать предпочтение?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.08.2014, 11:28
Ответы с готовыми решениями:

Конвертация типов - в чем разница приведенных способов
Объясните в чем разница между: Convert.To. () .Parse()

Эвенты и делегаты - в чем разница приведенных кодов
Всем доброго времени суток. :) Евенты и делегаты в принципе моё слабое место в C#, а сейчас стал...

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

Инициализация копированием () и присваиванием =. В чем разница?
в чем разница инициализации в скобках от инициализации присваиванием? int a=5; int b(5); //в чем...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы С#-разработчиков‌
5
6228 / 3529 / 898
Регистрация: 28.10.2010
Сообщений: 5,926
03.08.2014, 11:41 2
Игорюня, не особо принципиально, как я понимаю, потому что в IL коде выглядит практически одинаково. Хотя тут нужно спросить кого-то, кто в этом разбирается.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.class private auto ansi beforefieldinit ConsoleApplication3.first
    extends [mscorlib]System.Object
{
    // Fields
    .field private int32 a
    .field private string b
 
    // Methods
    .method public hidebysig specialname rtspecialname 
        instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 28 (0x1c)
        .maxstack 8
 
        IL_0000: ldarg.0
        IL_0001: call instance void [mscorlib]System.Object::.ctor()
        IL_0006: nop
        IL_0007: nop
        IL_0008: ldarg.0
        IL_0009: ldc.i4.5
        IL_000a: stfld int32 ConsoleApplication3.first::a
        IL_000f: ldarg.0
        IL_0010: ldstr "строка"
        IL_0015: stfld string ConsoleApplication3.first::b
        IL_001a: nop
        IL_001b: ret
    } // end of method first::.ctor
 
} // end of class ConsoleApplication3.first
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
.class private auto ansi beforefieldinit ConsoleApplication3.second
    extends [mscorlib]System.Object
{
    // Fields
    .field private int32 a
    .field private string b
 
    // Methods
    .method public hidebysig specialname rtspecialname 
        instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x206d
        // Code size 26 (0x1a)
        .maxstack 8
 
        IL_0000: ldarg.0
        IL_0001: ldc.i4.5
        IL_0002: stfld int32 ConsoleApplication3.second::a
        IL_0007: ldarg.0
        IL_0008: ldstr "строка"
        IL_000d: stfld string ConsoleApplication3.second::b
        IL_0012: ldarg.0
        IL_0013: call instance void [mscorlib]System.Object::.ctor()
        IL_0018: nop
        IL_0019: ret
    } // end of method second::.ctor
 
} // end of class ConsoleApplication3.second
1
Злой няш
1949 / 1384 / 508
Регистрация: 05.04.2010
Сообщений: 2,627
03.08.2014, 11:50 3
Разница есть, но она несущественна до такой степени, что на это можно не обращать внимание.
Пример на знание компилятора
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
internal class Program
{
    private static void Main()
    {
        new Person();
    }
}
 
internal class Person
{
    private int Age = string.Empty;
 
    private string Name = 0;
 
    public Person() : this("Robert", 20) {}
 
    public Person(string name, int age) : this()
    {
        this.Name = name;
        this.Age = age;
    }
}
1
20 / 16 / 11
Регистрация: 07.12.2013
Сообщений: 244
03.08.2014, 12:08  [ТС] 4
Бесконечный вызов конструкторов друг другом?
0
225 / 203 / 92
Регистрация: 26.10.2012
Сообщений: 600
04.08.2014, 08:23 5
http://habrahabr.ru/post/178763/
Пункт 10

Разницы особой нет. Один метод вызывается раньше другого. По мне удобнее задавать дефолтные значения полям сразу при инициализации.
Все в одном месте. Плюс не надо задумываться об инициализации кода в нескольких конструкторах.
1
Злой няш
1949 / 1384 / 508
Регистрация: 05.04.2010
Сообщений: 2,627
06.08.2014, 10:05 6
jetyb, о~, бородатая статья, но это не первоисточник. Большинство перечисленных вещей на практике не используется вообще.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.08.2014, 10:05

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

Указатель на строковую константу. В чем отличие двух приведенных примеров
char *x; x = "Текст"; это указатель на строковую константу. char x="Текст"; - строка(т.е....

В чем разница в задании полей класса?
Доброго времени! Вопрос: В чем состоит разница между описанием полей класса? Как повлияет на...

В чем разница между инициализацией полей в конструкторе и за ним?
То есть, в чем состоит разница между следующим кодом? class SomeClass { List<int> someList =...

В чем разница двух перегрузок?
// move.h template<typename _Tp> constexpr _Tp&& forward(typename...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.