Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
458 / 70 / 6
Регистрация: 29.01.2018
Сообщений: 1,028
1

Обращение и инициализация полей класса

23.08.2019, 22:34. Просмотров 465. Ответов 9
Метки нет (Все метки)

привет!


помогите пожалуйста разобраться, как это работает. нужно понять что просходит под капотом.


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
public class foo{
static public dynamic d;
 
 
 
 
}
class My{
static public void Main(){
 
Console.Write(foo.d); // почему так можно? я даже не создал объект класса? я понимаю что static это позволяет, но что происходит? как это работает без объекта?
 
 
 
}
 
}
вопрос второй:
C#
1
2
3
4
5
6
7
8
9
10
11
12
using System;
public class foo{
static public dynamic d;
 
 
 
 
}
class My{
static public void Main(){
 
foo obj=new foo{d=11;} // почему я могу инициализировать поля без конструктора ?  и почему для этого нужно стереть static?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2019, 22:34
Ответы с готовыми решениями:

Инициализация полей класса
Всем привет. Задумался над следующим вопросом. Допустим есть такой класс Singleton: ...

Инициализация полей класса
Привет! Не могу инициализировать в конструкторе поля класса. Интерфейс класса в отдельном файле....

Инициализация полей класса
Приветствую всех. Не в одной книге по С++ сказано, что поля класса желательно инициализировать в...

Инициализация полей класса конструктором
Добрый день! возникла такая проблема. Необходимо создать класс Polygon, в котором создать...

9
2217 / 1681 / 505
Регистрация: 02.08.2011
Сообщений: 4,827
24.08.2019, 00:05 2
1. А вы пробовали запускать это?
Тут будет ошибка в рантайме, так как компилятор не знает какую перегрузку метода вызвать. Подробнее не скажу.


2. Это просто синтаксический сахар.
Если взять простенькую программу типа:
C#
1
2
3
4
5
6
7
8
9
10
11
12
class Foo
    {
        public string Bar { get; set; }
    }
 
class Program
    {
        static void Main(string[] args)
        {
            var fb = new Foo {Bar = "Buzz"};
        }
    }
То ее IL-код будет примерно таким:
Код
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       20 (0x14)
  .maxstack  3
  .locals init (class ConsoleApp4_TokenEncoding.Foo V_0)
  IL_0000:  nop
  IL_0001:  newobj     instance void ConsoleApp4_TokenEncoding.Foo::.ctor()
  IL_0006:  dup
  IL_0007:  ldstr      "Buzz"
  IL_000c:  callvirt   instance void ConsoleApp4_TokenEncoding.Foo::set_Bar(string)
  IL_0011:  nop
  IL_0012:  stloc.0
  IL_0013:  ret
} // end of method Program::Main
Тут видно, что сначала вызывается конструктор, потом во временную переменную заносится строка, и далее через сеттер устанавливается значение.
То есть все это дело эквивалентно этому:
C#
1
2
var fb = new Foo();
fb.Bar = "Buzz";
1
458 / 70 / 6
Регистрация: 29.01.2018
Сообщений: 1,028
24.08.2019, 00:26  [ТС] 3
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
public class foo{
public dynamic d;
 
 
 
 
}
class My{
static public void Main(){
 
foo obj=new foo{d=11;}
 
Console.Write(obj.d);

Код
mcs file.cs

mono file.exe
да , это будет работать. почему бы и нет.

если убрать static.

Добавлено через 2 минуты
извините, но я еще раз вынужден спросить.
печему если я допишу static , то рабоать не будет.


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
public class foo{
static public dynamic d;
 
 
 
 
}
class My{
static public void Main(){
 
foo obj=new foo{d=11;}
 
Console.Write(obj.d);
0
4568 / 3142 / 1342
Регистрация: 09.05.2015
Сообщений: 7,721
24.08.2019, 00:32 4
Цитата Сообщение от pcmax Посмотреть сообщение
печему если я допишу static , то рабоать не будет.
Потому что статические поля так инициализировать нельзя.
1
458 / 70 / 6
Регистрация: 29.01.2018
Сообщений: 1,028
24.08.2019, 02:16  [ТС] 5
C#
1
2
3
foo obj=new foo()  // obj это же указатель по сути? он же содержит адрес области памяти из кучи?
 
зачем скобки после foo?
0
2689 / 1948 / 982
Регистрация: 14.08.2016
Сообщений: 6,664
24.08.2019, 02:19 6
pcmax, скобки после чего-то означают что это метод
1
458 / 70 / 6
Регистрация: 29.01.2018
Сообщений: 1,028
24.08.2019, 14:17  [ТС] 7
Цитата Сообщение от Diamante Посмотреть сообщение
скобки после чего-то означают что это метод
то есть foo()-это конструктор?

obj- это указатель, который содержит адрес выделенной памяти в куче, под объект типа foo?
0
2689 / 1948 / 982
Регистрация: 14.08.2016
Сообщений: 6,664
24.08.2019, 20:44 8
pcmax, да
1
458 / 70 / 6
Регистрация: 29.01.2018
Сообщений: 1,028
24.08.2019, 21:52  [ТС] 9
можно еще вопрос?

в с++ мы конструктор по умолчанию вызывается при создании объекта автоматически.


в с# это происходит так?

C#
1
foo obj=new foo();  // то есть foo(), я вызываю конструктор?  здесь это происходит так?
0
1108 / 779 / 219
Регистрация: 15.08.2010
Сообщений: 2,159
24.08.2019, 22:12 10
Цитата Сообщение от pcmax Посмотреть сообщение
в с# это происходит так?
в шарпах obj это ссылка на экземпляр класса, аналог в плюсах MyClass * c = new MyClass;
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2019, 22:12

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

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

Инициализация полей класса через vector<>
Здравствуйте, можете подсказать как правильно инициализировать поля класса, вот например есть класс...

Инициализация полей во время объявления класса
Инициализировать поля класса во время его объявления возможно только если в классе отсутствует...

Инициализация вещественных статических константных полей класса С++
static const double x=2.15; //c double и float не инициализирует. Почему??


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

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

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