|
C#. Словарь наследников | ☑ | ||
---|---|---|---|---|
0
Rizhij_Nikitos
19.01.16
✎
12:52
|
Честно говоря не удалось найти подходящей секции, перенесите если я ошибаюсь.
Вопрос к тем кто пользует не только 1С, но и другие языки вроде си#: Есть у меня интерфейс, его реализует базовый класс, а базовый класс реализуют наследники структуры. Если я создаю словарь (string, InterfaceName) и помещаю в словарь этих самых наследников, останутся ли они структурами или станут ссылками(объектами классов)? Такое вообще возможно? |
|||
1
Garykom
гуру
19.01.16
✎
12:55
|
сча тебя Serginio1 просветит
|
|||
2
Rizhij_Nikitos
19.01.16
✎
12:57
|
(1) Скорей бы... а то мой хед ведет себя как девочка потому что проиграл спор о быстродействии и красоте кода. Не отвечает на мои глупые вопросы теперь...
|
|||
3
Garykom
гуру
19.01.16
✎
12:58
|
если под словарем подразумевается https://msdn.microsoft.com/ru-ru/library/xfhwa508(v=vs.110).aspx то в него ссылки на объекты помещаются
но вот "а базовый класс реализуют наследники структуры" нифига не понял |
|||
4
Garykom
гуру
19.01.16
✎
12:58
|
(2) ты лучше скажи чем абстрактный класс от интерфейса отличается?
|
|||
5
Rizhij_Nikitos
19.01.16
✎
12:59
|
(3) Интерфейс - его реализует базовый класс. - 1 и 2 уровни
От базового класса наследуются структуры. - 2 и 3 уровни Под словарем я имел ввиду Dictionary - сейчас проверю эту тему |
|||
6
Rizhij_Nikitos
19.01.16
✎
13:01
|
(4) там дофига отличий писать долго, но в основном тем, что интерфейс не реализует тела методов. А так там еще приколы с наследованием и свойствами и проч. проч.
|
|||
7
Garykom
гуру
19.01.16
✎
13:02
|
(6) неа абстрактный класс тоже никакие тела методов не реализует, только обозначает как и интерфейс
главное отличие то какое? |
|||
8
Rizhij_Nikitos
19.01.16
✎
13:08
|
(7) абстрактный класс может реализовывать тела методов, в отличие от интерфейса. Интерфейс реализовывают, абстрактный класс - наследуют. Правила использования у них разные, с интерфейсом все надо правильно сделать, если его реализуешь, как в нем написано. Интерфейсов можно много реализовывать а правила наследования - 1 к 1.
|
|||
9
Garykom
гуру
19.01.16
✎
13:09
|
(8) "Интерфейсов можно много реализовывать а правила наследования - 1 к 1" - вот самое главное
что интерфейсов можно несколько наследовать, в отличие от абстрактных классов )) |
|||
10
Rizhij_Nikitos
19.01.16
✎
13:11
|
(9) ну да я этот вопрос долго муссировал когда только начинал геймдев.
|
|||
11
Garykom
гуру
19.01.16
✎
13:11
|
(9)+ "наследовать" в кавычках
|
|||
12
Rizhij_Nikitos
19.01.16
✎
13:12
|
(11) да понятно)
|
|||
13
vde69
19.01.16
✎
13:31
|
для ответа на сабж нужно понять в каком именно обработчике создаются твои "наследники", в собственном конструкторе класса или еще где... Ихмается что в собственном конструкторе класса, значит везде вне собственного класса это будут ссылки...
|
|||
14
Serginio1
19.01.16
✎
15:48
|
(5)Структуры уже наследуются? Тем более от классов?
Код покажи. А так почитай https://rsdn.ru/article/dotnet/values.xml#E1JAE |
|||
15
Господин ПЖ
19.01.16
✎
15:53
|
Структуры копируются при присваивании.При присваивании структуры к новой переменной выполняется копирование всех данных, а любое изменение новой копии не влияет на данные в исходной копии.Это важно помнить при работе с коллекциями типов значений, такими как Dictionary<string, myStruct>
|
|||
16
Rizhij_Nikitos
19.01.16
✎
15:53
|
(14) вопрос как раз и был, могу ли я структуру наследовать от классов, но судя по всему нет. Тогда и все дальнейшие рассуждения бессмысленны. Ну и код не интересен.
|
|||
17
Garykom
гуру
19.01.16
✎
16:07
|
(14) про это речь?
Типы-значения в языке C# – это типы, определённые с помощью ключевых слов struct, enum, а также все фундаментальные (то есть, входящие в список основных предопределенных типов, непосредственно понимаемых компилятором) типы (int, char, float,…), за исключением типа System.String (System.String – это единственный ссылочный фундаментальный тип). enum AEnum { First, Second } struct AValue { public int n; public string s; } Компилятор C# считает базовым классом для типов-значений тип object (System.Object), хотя на самом деле (с точки зрения CLR) System.Object не является прямым базовым типом для типов-значений. Типы-значения – это наследники System.ValueType или System.Enum. Но C# скрывает это от программиста, и не позволяет явно наследоваться ни от ValueType, ни от Enum. |
|||
18
Господин ПЖ
19.01.16
✎
16:08
|
>могу ли я структуру наследовать от классов, но судя по всему нет
бредовое желание |
|||
19
Garykom
гуру
19.01.16
✎
16:09
|
(17)+ никогда не юзал "struct" поэтому не понял про какие "структуры" речь (3)
вместо этого юзал static всегда |
|||
20
ObjectRelation Model
19.01.16
✎
16:15
|
(0) они упакуются в object и будут размещены в куче
|
|||
21
Rizhij_Nikitos
19.01.16
✎
16:46
|
(20) собственно с этим и были связаны последующие вопросы.
(18) поработай со стратегией и у тебя появится такое же желание. |
|||
22
ObjectRelation Model
19.01.16
✎
16:47
|
(21) вопрос решен?
|
|||
23
Господин ПЖ
19.01.16
✎
16:51
|
>поработай со стратегией и у тебя появится такое же желание.
вряд ли |
|||
24
Rizhij_Nikitos
19.01.16
✎
16:52
|
(22) вопрос решен, всем спасибо.
(23) ну блин 40 вариантов поведения по нажатиям на кнопки а это ведь еще и на телефоны потом будет компилиться. Приходится искать оптимизации во всем. |
|||
25
ObjectRelation Model
19.01.16
✎
16:57
|
(24) непонятно почему не class использовать
|
|||
26
Господин ПЖ
19.01.16
✎
16:59
|
(24) и чем мне поможет структура унаследованная(?!) от класса?
|
|||
27
ObjectRelation Model
19.01.16
✎
17:01
|
(26) в шарпе нет структур, унаследованных от класса, только структуры, реализующие интерфейсы
|
|||
28
Господин ПЖ
19.01.16
✎
17:02
|
(27) автору надо. интересно зачем
|
|||
29
Rizhij_Nikitos
19.01.16
✎
17:04
|
(28) чтобы она в стеке лежала а не в куче.
|
|||
30
ObjectRelation Model
19.01.16
✎
17:07
|
(29) ну если в коллекции хранишь - все равно она в куче разместит
|
|||
31
Rizhij_Nikitos
19.01.16
✎
17:15
|
(30) вот об этом я кстати не подумал...
|
|||
32
Serginio1
19.01.16
✎
17:28
|
(31) Массив структур лучше чем массив объетов тем, что нагрузка на GС меньше, так не нужно следить за объектами.
http://rsdn.ru/?Forum/Default.aspx?ans=1 |
|||
33
Serginio1
19.01.16
✎
17:32
|
Проблема в том, что после первой сборки мусора, объекты помещаются в стпршее поколение, а та как при сборке мусора игнорируются старшие поколения, то GC отслеживает их изменение, на что уходит время. Правда с каждой версией GC совершенствуется
|
|||
34
ObjectRelation Model
20.01.16
✎
09:54
|
(32) а то что ваши структуры упаковываются в кучу, ничего страшного? это не те же объекты?
|
|||
35
Serginio1
20.01.16
✎
10:30
|
(34) Структуры прекрасно себя чувствуют на стеке (int,double, decimal это все value типы), в качестве полей объекта и элементов массива. В данном случае они представляют некую область памяти, за которой GC не следит. А вот когда происходит боксинг тогда структура превращается в полноценный объект
http://habrahabr.ru/post/136609/ |
|||
36
ObjectRelation Model
20.01.16
✎
11:12
|
(35) а я про что? он их в коллекцию пихает, тем самым отправляет в кучу как объекты
|
|||
37
Serginio1
20.01.16
✎
11:15
|
(36) Только вот есть разница между массивом структур и объектов. Почитай 32.
Массив структур это один объект определенной длины. А вот Массив объектов это сам массив и количество элементов в массиве |
|||
38
ObjectRelation Model
20.01.16
✎
11:25
|
(37)
1. ссылка в (32) кривая 2. речь была про другие коллекции 3. даже массив это экземпляр класса, он размещается в куче 4. какой длины массив, получаемый как аргумент в функции? void Test(MyStruct[] arr) |
|||
39
Serginio1
20.01.16
✎
12:27
|
(38)Прошу прощения вот
http://rsdn.ru/forum/dotnet/415352.1 Речь шла про Generic коллекции. А там прекрасно себе живут и структуры. Еще раз при использовании массива структур будет только один объект. arr.Length Получает ссылку, а внутри объекта можно получить длину, информацию о типе итд. Смотри 35 |
|||
40
ObjectRelation Model
20.01.16
✎
12:40
|
(39) то есть ты считаешь в коде
struct A {} A a; var list = new List<A>(); list.Add(a); никакой упаковки структуры не происходит? |
|||
41
Garykom
гуру
20.01.16
✎
12:56
|
(40) изобрели TRecord из паскаля/дельфи и сидят чему то радуются?
|
|||
42
Serginio1
20.01.16
✎
12:58
|
Конечно. Они как раз в том числе для этого и созданы.
https://msdn.microsoft.com/ru-ru/library/b5bx6xee.aspxПравда если нет ограничения https://msdn.microsoft.com/ru-ru/library/d5x73970.aspx Правда если для Generic коллекций для классов будет одна реализация, то для структур будет создана своя на каждый тип |
|||
43
Serginio1
20.01.16
✎
12:59
|
(41) Вообщето автор паскаля/дельфи и C# один и тот же человек Аннерс Хейлсберг
|
|||
44
ObjectRelation Model
20.01.16
✎
13:01
|
(42) а теперь немного усложним:
interface I {} struct A: public I {} A a; var list = new List<I>(); list.Add(a); |
|||
45
Garykom
гуру
20.01.16
✎
13:01
|
(43) вот это новость/поворот... а https://ru.wikipedia.org/wiki/Вирт,_Никлаус куда дели?
|
|||
46
ObjectRelation Model
20.01.16
✎
13:02
|
(45) делфи на основе паскаль, а не равно паскаль
|
|||
47
Serginio1
20.01.16
✎
13:03
|
(45) Вирт изобрел Паскаль. А Хейлсберг
В 1983 году написал свой первый компилятор языка Паскаль, который после портирования под операционную систему MS-DOS продал фирме Borland. Эта версия легла в основу Turbo/Borland Pascal, который развивался до 1995 года. До 1996 года Хейлсберг был главным инженером фирмы Borland, где создал новое поколение компиляторов Паскаля — язык Delphi, компилятор которого работал уже под операционной системой Windows. В 1996 году он перешёл в Microsoft, где работал над такими проектами, как J++ и Microsoft Foundation Classes. С 2000 года возглавлял группу по созданию и проектированию языка C#. https://ru.wikipedia.org/wiki/Хейлсберг,_Аннерс |
|||
48
Serginio1
20.01.16
✎
13:04
|
(44) Все что приводится к Object, интерфейсу то все боксится.
|
|||
49
Garykom
гуру
20.01.16
✎
13:04
|
(47) так и нужно было сказать что написал компилятор паскаль/дельфи и руководил группой разработки "компилятора" C# ))
|
|||
50
ObjectRelation Model
20.01.16
✎
13:18
|
(48) продолжим:
interface I {} struct A: public I {} var lista = new List<I>(); A a1; list.Add(a1); //тут есть упаковка? IList<I> listi = lista; A a2; listi.Add(a2); //тут есть упаковка? вот два места в одной коллекции, где есть упаковка, а где нет? |
|||
51
ObjectRelation Model
20.01.16
✎
13:35
|
+(50) наврал что-то, еще подумаю
|
|||
52
Serginio1
20.01.16
✎
13:51
|
(49) Поверь Turbo Pascal как язык много отличался от виртовского. Кроме того а Delphi был packed object
http://rsdn.ru/forum/delphi/391763.flat.2 |
|||
53
Serginio1
20.01.16
✎
13:53
|
52 Я помню программировал на ДВК-2 на паскале в 80х. Компиляция была чудовищно долгая, и в каком я был восторге после перписания кода на ТП и скорости компиляции и выполнения.
|
|||
54
Музон Хиггса
21.01.16
✎
21:11
|
Вот чего, а скорости выполнения там не было. ТП быстро компилировал как раз из-за отсутствия хоть какой-нибудь оптимизации кода.
|
|||
55
Serginio1
22.01.16
✎
10:31
|
(54) По сравнению с ДВК-2 это была ракета. Скорость С и С++ брали за счет инлайнинга, в том числе и развертывании макросов, шаблонов, на что уходила куча времени. Плюс никакой IDE.
ТП по тем временам это был прорыв. Жалко, что MS тогда делала ставку на Васик. В итоге практически оба умерли. C# можно назвать си подобным наследником. Хотя метаклассы так и не перекочевали |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |