Имя: Пароль:
IT
 
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# можно назвать си подобным наследником. Хотя метаклассы так и не перекочевали
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс