тупые вопросы по C#

pitrik2

я джавист, c# не знаю
буду задавать тута тупые вопросы
nullable классы, это тоже самое что у нас обертки типа int/Integer?

Helga87

для того же, но не то же.

Ulala

А я Java есть generics? Если есть, то насколько они похожи на C# generics?

agaaaa

нет

kokoc88

нет
Нет или не похожи, ты бы уточнил. :grin:

Helga87

А я Java есть generics? Если есть, то насколько они похожи на C# generics?
в Java 1.5 и выше generics есть. Они являются чистым синтаксическим сахаром — в рантайме нельзя отличить generic класс от обычного. В .net же мы в рантайме можем отличать. Поэтому в Java возможна такая вещь:

int sum(List<Integer> list)
{
int result = 0;
for (Integer item : list) {
result += item;
}
return result;
}

List<Integer> list = new ArrayList<Integer>
list.add(3);
list.add(4);
List<String>Object)list.add("lala"); //тут Java все проглотит
System.out.println(sum(list; //А тут навернется, т.к. не будет ждать такой подлянки -- String в List<Integer>

freezer

зато по-моему в Java для добавления женериков не потребовалось вносить изменений в рантайм

pitrik2

зато по-моему в Java для добавления женериков не потребовалось вносить изменений в рантайм
что значит "зато"?
это плюс что ли? или это по сравнению с чем-то?
в сишарпе оно изначально было, значит явно не с ним сравнение
а плюсом это назвать как то странно

6yrop

для того же, но не то же.
Нееет!
В Java Integer это заплатка для решения "деткой болезни" джавы (разделение на примитивные и на объектные типы). В C# такой болезни нет.
В джава int это не Object, а в C# всё Object!
Nalluble типы ввели во втором фрайсворке. Nalluble<int>используются там, где нужен int, но возможна ситуация, когда значение не определено.

freezer

в сишарпе оно изначально было, значит явно не с ним сравнение
в том-то и дело, что в .NET 1.1 женериков не было

pitrik2

в C# всё Object
тогда зачем nullable?
почему бы не писать
int a;
if(a == null)
...
?

pitrik2

в том-то и дело, что в .NET 1.1 женериков не было
ну значит .net 1.1 не нужно считать
джаву 1 тоже же никто не считает, все джаву 2 всегда подразумевают
первый блин комом

Helga87

Пусть надо найти максимальное нечетное число в массиве:
int? FindMaxOddNumber(int[] values)
{
int? result = null;
foreach (int value in values)
{
if (value % 2 == 1 && (result == null || result < value
{
result = value;
}
}
return result;
}

Тогда у нас есть два варинта: число найдено, возвращено значение; число не найдено, возвращен null;
В Java тут бы использовался Integer, в этом смысле я и сказал "для того же".

Helga87

тогда зачем nullable?
почему бы не писать
int a;
if(a == null)
...
?
почитай про различие value type и reference type. Value types не могут принимать значение null, вместо этого они принимают default(T которое равно значению со всему нулевыми полями.

freezer

ну значит .net 1.1 не нужно считать
как это не нужно? Проги-то на нём писали, и довольно долго. Вот 1.0 - действительно не надо считать.

pitrik2

прочитал
получается что int это все таки не object
но может быть приведен к object рантаймовским автобоксингом
встречал людей утверждавших что автобоксинг зло, от рантаймовского автобоксинга их наверна бы вырвало :)

Dasar

встречал людей утверждавших что автобоксинг зло
аргументация?

freezer

забоксенная величина много места в памяти занимает?

aleks058

Забоксенные структуры обычно не переживают нулевого поколения и отлично собираются GC. Памяти они не так уж и много занимают.

karkar

забоксенная величина много места в памяти занимает?
Кажися, на 8 байт больше, чем сам объект (на 32-битной платформе). Т.е. забоксенный инт в три раза больше того, что в стеке.

freezer

да я собственно не спрашивал (сам знаю вопрос был, годится ли это в качестве недостатка ;)

bleyman

зато по-моему в Java для добавления женериков не потребовалось вносить изменений в рантайм
Да в шарпе в общем-то тоже изменения, насколько я понимаю, касаются только сурового рефлекшена с динамической генерацией классов.
Так-то всё компилятор делает и отдаёт рантайму уже инстанцированные классы с забавными именами.
Кстате, нуллаблы на самом деле ужасно кривые. Int? и прочие базовые классы работают нормально, а вот "SomeStruct? а;" приводит к необходимости писать "a.Value.x = 11;", например. Потому что a в результате имеет тип банально Nullable<SomeStruct>, а вовсе не что-то правильное и удобное.
То есть это что-то непонятное, с одной стороны похоже на совсем-совсем простой и неинтересный синтаксический сахар, с другой — нуллабл инты всё-таки можно складывать, значит, они поддерживают операторы самих интов. Странная штука, короче.
Оставить комментарий
Имя или ник:
Комментарий: