53 / 53 / 10
Регистрация: 26.09.2013
Сообщений: 277
1

Экземпляры класса, вызов переопределенного метода

01.08.2014, 17:43. Показов 1148. Ответов 8

как лучше вызвать переопределенный метод?
C#
1
 Console.WriteLine(m1.ToString());
или через статический метод(так как сделал ниже в программе)?

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
 class MyClass
    {
        public string Name { get; set; }
        public int Age { get; set; }
 
        public MyClass(string name, int age)
        {
            Name = name;
            Age = age;
        }
 
        public override string ToString()
        {
            return string.Format(" Имя: {0}\tВозраст: {1}", Name, Age);
        }
    }
    class Program
    {
        static void Main()
        {
            MyClass m1 = new MyClass("Vlad", 10);
            Console.WriteLine(m1.ToString());
 
            MyClass m2 = m1;
            m2.Name = "Tom";
            m2.Age = 15;
            Display(m1);
            Display(m2);
 
            Console.ReadKey();
        }
        static void Display(MyClass m1 ) 
        {
           Console.WriteLine(m1); 
        }
    }
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2014, 17:43
Ответы с готовыми решениями:

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: override означает, что...

С помощью метода получить все экземпляры класса-потомка
Прошу прощения за кривизну вопроса, не знаю как спросить у гугла class MyClass { ...

Вызов методов классов друг у друга (вызов метода из другого класса)
Есть несколько классов, которые могут вызывать методы (функции) друг у друга. Логика: класс1 имеет...

Делегаты или вызов метода класса из другого класса
Добрый день! В попытке изучения c# наткнулся на такую проблему: 1. Зачем нужен делегат? Ведь я...

8
MrGladus
01.08.2014, 17:48
  #2

Не по теме:

Как лучше сложить 2 числа:
вот так: 2 + 1
или же так 1 + 2 ?:)

0
tranquil
01.08.2014, 17:57  [ТС]
  #3

Не по теме:

MrGladus, не совсем согласен с вами. :)к примеру, 2 числа по разному можно сложить, можно в 1 строчку,а можно и в несколько. Результат будет 1, но подходи разные, сложность программы разная, объем кода,производительность разная :) и т.д.

0
870 / 720 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
01.08.2014, 18:03 4
tranquil,
Можно даже так, ToString() вызовется автоматически
C#
1
Console.WriteLine(m1);
1
178 / 178 / 50
Регистрация: 06.01.2013
Сообщений: 392
01.08.2014, 18:55 5
Лучший ответ Сообщение было отмечено tranquil как решение

Решение

Ок, давайте разберем по глубже, я создал дллку с вашего кода, и заглянул в IL code:

Кликните здесь для просмотра всего текста
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
.method private hidebysig static void  Main() cil managed
  {
    // Code size       70 (0x46)
    .maxstack  3
    .locals init ([0] class ClassLibrary1.MyClass m1,
             [1] class ClassLibrary1.MyClass m2)
    .line 27,27 : 9,10 ''
    IL_0000:  nop
    .line 28,28 : 13,50 ''
    IL_0001:  ldstr      "Vlad"
    IL_0006:  ldc.i4.s   10
    IL_0008:  newobj     instance void ClassLibrary1.MyClass::.ctor(string,
                                                                    int32)
    IL_000d:  stloc.0
    .line 29,29 : 13,46 ''
    IL_000e:  ldloc.0
    IL_000f:  callvirt   instance string [mscorlib]System.Object::ToString()
    IL_0014:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_0019:  nop
    .line 31,31 : 13,29 ''
    IL_001a:  ldloc.0
    IL_001b:  stloc.1
    .line 32,32 : 13,29 ''
    IL_001c:  ldloc.1
    IL_001d:  ldstr      "Tom"
    IL_0022:  callvirt   instance void ClassLibrary1.MyClass::set_Name(string)
    IL_0027:  nop
    .line 33,33 : 13,25 ''
    IL_0028:  ldloc.1
    IL_0029:  ldc.i4.s   15
    IL_002b:  callvirt   instance void ClassLibrary1.MyClass::set_Age(int32)
    IL_0030:  nop
    .line 34,34 : 13,25 ''
    IL_0031:  ldloc.0
    IL_0032:  call       void ClassLibrary1.Program::Display(class ClassLibrary1.MyClass)
    IL_0037:  nop
    .line 35,35 : 13,25 ''
    IL_0038:  ldloc.1
    IL_0039:  call       void ClassLibrary1.Program::Display(class ClassLibrary1.MyClass)
    IL_003e:  nop
    .line 37,37 : 13,31 ''
    IL_003f:  call       valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
    IL_0044:  pop
    .line 38,38 : 9,10 ''
    IL_0045:  ret
  } // end of method Program::Main
 
  .method private hidebysig static void  Display(class ClassLibrary1.MyClass m1) cil managed
  {
    // Code size       9 (0x9)
    .maxstack  8
    .line 40,40 : 9,10 ''
    IL_0000:  nop
    .line 41,41 : 13,35 ''
    IL_0001:  ldarg.0
    IL_0002:  call       void [mscorlib]System.Console::WriteLine(object)
    IL_0007:  nop
    .line 42,42 : 9,10 ''
    IL_0008:  ret
  } // end of method Program::Display


В случае
C#
1
Console.WriteLine(m1.ToString());
мы видим что компилятор C# сгенерировал такой IL код:
IL_000e: ldloc.0
C#
1
2
    IL_000f:  callvirt   instance string [mscorlib]System.Object::ToString()
    IL_0014:  call       void [mscorlib]System.Console::WriteLine(string)
В случае
C#
1
            Display(m1);
мы видим
C#
1
2
    IL_0031:  ldloc.0
    IL_0032:  call       void ClassLibrary1.Program::Display(class ClassLibrary1.MyClass)
и вот код метода Display:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
  .method private hidebysig static void  Display(class ClassLibrary1.MyClass m1) cil managed
  {
    // Code size       9 (0x9)
    .maxstack  8
    .line 40,40 : 9,10 ''
    IL_0000:  nop
    .line 41,41 : 13,35 ''
    IL_0001:  ldarg.0
    IL_0002:  call       void [mscorlib]System.Console::WriteLine(object)
    IL_0007:  nop
    .line 42,42 : 9,10 ''
    IL_0008:  ret
  } // end of method Program::Display
Что по сути то же самое, поскольку void [mscorlib]System.Console::WriteLine(object) превратится в:
C#
1
2
3
4
5
6
7
8
9
10
.method private static void Output(object obj) cil managed {
    .maxstack 1
    
    // Console.WriteLine(obj.GetType().ToString());
    ldarg.0
    callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
    callvirt instance string [mscorlib]System.Object::ToString()
    call void [mscorlib]System.Console::WriteLine(string)
    ret
  }
Вот как-то так

Не по теме:

P.S. Поэтому я и спросил вас про сложение чисел :)

1
tranquil
01.08.2014, 19:22  [ТС]
  #6

Не по теме:

я далек от этого, а от IL тем более. Поэтому не совсем согласный был с вами :)

0
870 / 720 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
01.08.2014, 19:29 7
tranquil,
MrGladus,
Вообще все что производит какие-то действия со свойствами класса должно быть реализовано в этом классе.
0
53 / 53 / 10
Регистрация: 26.09.2013
Сообщений: 277
01.08.2014, 19:52  [ТС] 8
XRoy, что то туго доходит получается в место 2 классов нужно все в 1 организовать?
0
870 / 720 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
01.08.2014, 19:58 9
tranquil,
Нет никакого смысла что бы писать отдельный метод вывода когда все это пишется одной строкой, был бы смысл если бы к примеру выводили данные класса в файла.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2014, 19:58
Помогаю со студенческими работами здесь

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

Вызов метода из статического класса
Как говорится, есть два класса - Tweet и статичный класс StringHelper. В одном константа...

Вызов метода из другого класса
Всем привет! Не могу полностью доделать задачу. Вот условие: вы вдруг поняли, что не очень-то...

Вызов метода базового класса
public class BaseClass { public virtual void Foo() { Console.WriteLine ("BaseClass.Foo"); } }...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru