С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 111
1

Объект без ссылки на него

30.11.2013, 21:05. Показов 1565. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Program
{
    static void Main()
    {
        
        new SomeClass();
        
    }
}
 
class SomeClass
{ 
 
}
Что дает запись new SomeClass(); и как ей пользоваться.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2013, 21:05
Ответы с готовыми решениями:

Передача ссылки на объект
Есть работающий код рисования круга. Он в обработчике MouseUP объекта, на котором рисуем. ...

Передача в конструктор ссылки на объект
Есть 2 класса Model и Controller, нужно передать в конструктор Controller-а ссылку на Model. Вот...

Объект без ссылки
Если создать объект без ссылки, например в вызове метода, и в нем присутствует метод close(), то...

Реферальные ссылки, с редиректом или без него?
Приветствую. К примеру, при переходе по ссылке _http://www.hodokii.ru/page/11 посетитель на самом...

6
Футболист
533 / 435 / 142
Регистрация: 31.10.2011
Сообщений: 1,010
30.11.2013, 21:13 2
вызывает конструктор без параметров, он там по умолчанию будет вызываться... я могу ошибаться)
1
60 / 59 / 15
Регистрация: 04.05.2010
Сообщений: 161
30.11.2013, 21:43 3
Скорее всего вызывается конструктор по умолчанию.

Если интересно пробуй.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Program
{
    static int Main(string[] args)
    {
        new SomeClass();
        SomeClass c = new SomeClass();
        otherClass s = new otherClass();
        Console.ReadKey();
        return 0;
 
    }
}
 
class SomeClass
{
 
}
class otherClass
{
    public otherClass()
    {
 
    }
}
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
      new SomeClass();
001E2822  mov         ecx,4D02FCh  
001E2827  call        000B2100  
001E282C  mov         dword ptr [ebp-4Ch],eax  
001E282F  mov         ecx,dword ptr [ebp-4Ch]  
001E2832  call        000CC750  
001E2837  nop  
        SomeClass c = new SomeClass();
001E2838  mov         ecx,4D02FCh  
001E283D  call        000B2100  
001E2842  mov         dword ptr [ebp-50h],eax  
001E2845  mov         ecx,dword ptr [ebp-50h]  
001E2848  call        000CC750  
001E284D  mov         eax,dword ptr [ebp-50h]  
001E2850  mov         dword ptr [ebp-40h],eax  
        otherClass s = new otherClass();
001E2853  mov         ecx,4D035Ch  
001E2858  call        000B2100  
001E285D  mov         dword ptr [ebp-54h],eax  
001E2860  mov         ecx,dword ptr [ebp-54h]  
001E2863  call        000CC760  
001E2868  mov         eax,dword ptr [ebp-54h]  
001E286B  mov         dword ptr [ebp-44h],eax
ildasm говорит нам - создаем новый объект, с помощью конструктора по умолчанию, но не происходит вызова stloc, то есть данные не сохраняются. Далее происходит pop - это получение значения из стека.

C#
1
2
3
4
5
6
7
  IL_0000:  /* 00   |                  */ nop
  IL_0001:  /* 73   | (06)000003       */ newobj     instance void SomeClass::.ctor()
  IL_0006:  /* 26   |                  */ pop
  IL_0007:  /* 73   | (06)000003       */ newobj     instance void SomeClass::.ctor()
  IL_000c:  /* 0A   |                  */ stloc.0
  IL_000d:  /* 73   | (06)000004       */ newobj     instance void otherClass::.ctor()
  IL_0012:  /* 0B   |                  */ stloc.1
ildasm говорит, что вызывается конструктор по умолчанию.

Хотелось бы услышать мнение экспертов
2
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 111
30.11.2013, 23:33  [ТС] 4
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Program
{
    static void Main()
    {
        
        new SomeClass(10);
        
    }
}
 
class SomeClass
{ 
      public int i;
 public SomeСlass(int input)
{
    i = input;
}
}
А если так? Куда присвоится десятка?

Добавлено через 13 минут
up чтоли
0
660 / 530 / 137
Регистрация: 07.07.2011
Сообщений: 1,232
01.12.2013, 10:09 5
ccobbra, в небытие.
1
324 / 307 / 59
Регистрация: 06.03.2013
Сообщений: 869
01.12.2013, 10:43 6
ccobbra, объект создастся в памяти, однако доступ к нему вы не получите. gc его потом зохавает. такую запись мне порою приходится использовать в java:
Кликните здесь для просмотра всего текста
Java
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
import javax.swing.*;
import java.awt.*;
 
public class Main extends JFrame {
    Main() {
        JLabel lbl = new JLabel("Hello, world");
 
        setLayout(new FlowLayout());
        setTitle("Hello world app");
        setSize(200, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        add(lbl);
 
        setVisible(true);
    }
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Main();
            }
        });
    }
}

или вот, добавляем в массив объекты:
C#
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
31
32
33
34
35
36
37
38
39
namespace Test
{
    class Customer
    {
        public string Name { get; set; }
        public string Surname { get; set; }
        public string Phone { get; set; }
        public int Balance { get; set; }
    }
    
    class Program
    {
        public static void Main(string[] args)
        {
            var l = new List<Customer>
            {
                new Customer {
                    Name = "Anton",
                    Surname = "Antonov",
                    Phone = "+ (888) 222333444",
                    Balance = 100
                },
                
                new Customer {
                    Name = "Andrey",
                    Surname = "Andreyev",
                    Phone = "+ (999) 333444555",
                    Balance = 5000
                }
            };
            
            l.ForEach((a) => {
                Console.WriteLine(a.Name);
            });
            
            Console.ReadKey();
        }
    }
}
если в классе не определен конструктор, вызовется конструктор по-умолчанию, он же .ctor. по сути это конструктор типа object.

Добавлено через 14 минут
и во что оно скомпилится:
Кликните здесь для просмотра всего текста
C#
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
.namespace Test                         // DATA XREF: get_Name+1r set_Name+2w
{
.class private auto ansi beforefieldinit Customer extends [mscorlib]System.Object
{
  .field private string <Name>k__BackingField
 
  .field private string <Surname>k__BackingField // DATA XREF: get_Surname+1r
                                        // set_Surname+2w
 
  .field private string <Phone>k__BackingField // DATA XREF: get_Phone+1r
                                        // set_Phone+2w
 
  .field private int32 <Balance>k__BackingField // DATA XREF: get_Balance+1r
                                        // set_Balance+2w
 
  .property instance string Name
  {
    .get instance string get_Name()
    .set instance void set_Name(string value)
  }
 
  .property instance string Surname
  {
    .get instance string get_Surname()
    .set instance void set_Surname(string value)
  }
 
  .property instance string Phone
  {
    .get instance string get_Phone()
    .set instance void set_Phone(string value)
  }
 
  .property instance int32 Balance
  {
    .get instance int32 get_Balance()
    .set instance void set_Balance(int32 value)
  }
 
 
  .method public hidebysig specialname instance string get_Name() // CODE XREF: <Main>b__3+2p
  {
    .maxstack 1
    .locals init (string V0)
    ldarg.0
    ldfld    string Test.Customer::<Name>k__BackingField
    stloc.0
    br.s     loc_19
 
loc_19:
    ldloc.0
    ret
  }
 
  .method public hidebysig specialname instance void set_Name(string value)
                                        // CODE XREF: Main+14p Main+4Fp
  {
    .maxstack 8
    ldarg.0
    ldarg.1
    stfld    string Test.Customer::<Name>k__BackingField
    ret
  }
 
  .method public hidebysig specialname instance string get_Surname()
  {
    .maxstack 1
    .locals init (string V0)
    ldarg.0
    ldfld    string Test.Customer::<Surname>k__BackingField
    stloc.0
    br.s     loc_39
 
loc_39:
    ldloc.0
    ret
  }
 
  .method public hidebysig specialname instance void set_Surname(string value)
                                        // CODE XREF: Main+20p Main+5Bp
  {
    .maxstack 8
    ldarg.0
    ldarg.1
    stfld    string Test.Customer::<Surname>k__BackingField
    ret
  }
 
  .method public hidebysig specialname instance string get_Phone()
  {
    .maxstack 1
    .locals init (string V0)
    ldarg.0
    ldfld    string Test.Customer::<Phone>k__BackingField
    stloc.0
    br.s     loc_59
 
loc_59:
    ldloc.0
    ret
  }
 
  .method public hidebysig specialname instance void set_Phone(string value)
                                        // CODE XREF: Main+2Cp Main+67p
  {
    .maxstack 8
    ldarg.0
    ldarg.1
    stfld    string Test.Customer::<Phone>k__BackingField
    ret
  }
 
  .method public hidebysig specialname instance int32 get_Balance()
  {
    .maxstack 1
    .locals init (int32 V0)
    ldarg.0
    ldfld    int32 Test.Customer::<Balance>k__BackingField
    stloc.0
    br.s     loc_79
 
loc_79:
    ldloc.0
    ret
  }
 
  .method public hidebysig specialname instance void set_Balance(int32 value)
                                        // CODE XREF: Main+35p Main+73p
  {
    .maxstack 8
    ldarg.0
    ldarg.1
    stfld    int32 Test.Customer::<Balance>k__BackingField
    ret
  }
 
  .method public hidebysig specialname rtspecialname instance void .ctor()
                                        // CODE XREF: Main+8p Main+43p
  {
    .maxstack 8
    ldarg.0
    call     instance void [mscorlib]System.Object::.ctor()
    ret
  }
}
}
 
.namespace Test                         // DATA XREF: Main+83r Main+96w ...
{
.class private auto ansi beforefieldinit Program extends [mscorlib]System.Object
{
  .field private static genericinst(class [mscorlib]System.Action`1,18) CS$<>9__CachedAnonymousMethodDelegate4
 
 
  .method public static hidebysig void Main(string[] args)
  {
    .entrypoint
    .maxstack 4
    .locals init (genericinst(class [mscorlib]System.Collections.Generic.List`1,18) V0,
                  int32 V1,
                  genericinst(class [mscorlib]System.Collections.Generic.List`1,18) V2,
                  int32 V3)
    nop
    newobj   T0xA000012
    stloc.1
    ldloc.1
    newobj   instance void Test.Customer::.ctor()
    stloc.2
    ldloc.2
    ldstr    "Anton"
    callvirt instance void Test.Customer::set_Name(string value)
    nop
    ldloc.2
    ldstr    "Antonov"
    callvirt instance void Test.Customer::set_Surname(string value)
    nop
    ldloc.2
    ldstr    "+ (888) 222333444"
    callvirt instance void Test.Customer::set_Phone(string value)
    nop
    ldloc.2
    ldc.i4.s 0x64
    callvirt instance void Test.Customer::set_Balance(int32 value)
    nop
    ldloc.2
    callvirt T0xA000013
    nop
    ldloc.1
    newobj   instance void Test.Customer::.ctor()
    stloc.3
    ldloc.3
    ldstr    "Andrey"
    callvirt instance void Test.Customer::set_Name(string value)
    nop
    ldloc.3
    ldstr    "Andreyev"
    callvirt instance void Test.Customer::set_Surname(string value)
    nop
    ldloc.3
    ldstr    "+ (999) 333444555"
    callvirt instance void Test.Customer::set_Phone(string value)
    nop
    ldloc.3
    ldc.i4   0x1388
    callvirt instance void Test.Customer::set_Balance(int32 value)
    nop
    ldloc.3
    callvirt T0xA000013
    nop
    ldloc.1
    stloc.0
    ldloc.0
    ldsfld   genericinst(class [mscorlib]System.Action`1,18) Test.Program::CS$<>9__CachedAnonymousMethodDelegate4
    brtrue.s loc_14D
    ldnull
    ldftn    void Test.Program::<Main>b__3(class Test.Customer a)
    newobj   T0xA000014
    stsfld   genericinst(class [mscorlib]System.Action`1,18) Test.Program::CS$<>9__CachedAnonymousMethodDelegate4
    br.s     loc_14D
 
loc_14D:                                // CODE XREF: Main+88j
    ldsfld   genericinst(class [mscorlib]System.Action`1,18) Test.Program::CS$<>9__CachedAnonymousMethodDelegate4
    callvirt T0xA000015
    nop
    call     valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
    pop
    ret
  }
 
  .method public hidebysig specialname rtspecialname instance void .ctor()
  {
    .maxstack 8
    ldarg.0
    call     instance void [mscorlib]System.Object::.ctor()
    ret
  }
 
  .method private static hidebysig void <Main>b__3(class Test.Customer a)
                                        // DATA XREF: Main+8Br
  {
    .maxstack 8
    nop
    ldarg.0
    callvirt instance string Test.Customer::get_Name()
    call     void [mscorlib]System.Console::WriteLine(string)
    nop
    ret
  }
}
}
1
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.12.2013, 11:20 7
ccobbra, эта запись
C#
1
2
3
4
5
6
    static void Main()
    {
        
        new SomeClass();
        
    }
полностью аналогично этой:
C#
1
2
3
4
5
6
    static void Main()
    {
        
        var obj = new SomeClass();
        
    }
компилятору пофиг, что ты не написал присваивание, он его все равно неявно создаст ссылку.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public class Program
    {
        private static void Main()
        {
            new SomeClass(10);
        }
    }
 
    public class SomeClass
    {
        public int I;
 
        public SomeClass(int input)
        {
            I = input;
            Console.WriteLine("I = {0}", I);
        }
 
        ~SomeClass()
        {
            Console.WriteLine("deleted");
        }
    }
Как он мог вызвать деструктор, если бы у него не было ссылки ?
1
01.12.2013, 11:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.12.2013, 11:20
Помогаю со студенческими работами здесь

Вордпресс загружает изображение без ссылки на него
Доброго время суток. Возникла такая проблема, изображения загружаются без ссылки, то есть раньше...

Для чего нужен возвращаемый тип в перегрузке ввода >> и почему без него него выдаётся ошибка?
Для чего нужен возвращаемый тип в перегрузке ввода &gt;&gt;, какую роль он выполняет что без него него...

при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого!
Друзья! Обнаружил пробел в знаниях. Собсно, вопрос в теме. Дополню лишь: поля объекта меняются на...

Ссылки на объект
Непонятна тема про переменные ссылочного типа. Например, при создании нового объекта. ClassName p1...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru