Dlaczego int jest strukturą?

Odpowiedz Nowy wątek
2018-11-09 16:04
0

Kiedy zacząłem się uczyć C#, nie rozumiałem, dlaczego kompilator zamienia int na System.Int32. I dalej nie rozumiem. Na SO piszą:

The biggest difference between Java's and C#'s handling of primitives is that you can use C# primitives in places where user-defined struct types can go, most notably, in C# generic arguments, while Java treats primitives as a completely separate group of types.

Czyli chodzi o generyki? Nie da się zrobić, aby generyki obsługiwały jednocześnie obiekty i typy prymitywne takie jak w Javie? No i o co chodzi z tym, że There is no "wrapping" in a struct going on here. i But that happens only if you cast the int to object.?

edytowany 1x, ostatnio: nobody01, 2018-11-09 16:06
Może nieco zniszczę Ci światopogląd, ale Java nie obsługuje generyków na typach skalarnych ;-) - Patryk27 2018-11-09 16:15
Wiem :) typy prymitywne takie jak w Javie Trochę źle napisałem: chodzi mi o to, że w Javie inty nie są strukturami, tylko... intami. - nobody01 2018-11-09 16:16
Czyi reasumując , te klasy które dziedziczą po System.ValueType to są struktury . - Zimny Krawiec 2018-11-10 10:15

Pozostało 580 znaków

2018-11-09 16:15
0

int I System.Int32 w csharp to to samo, czyli autoboxing jest automatyczny, mozna uzywac prymitywow, jako parametrow(w generykach). Inaczej niz, w javie.


edytowany 1x, ostatnio: lion137, 2018-11-09 16:16
Tu nie ma żadnego autoboxingu. - somekind 2018-11-09 17:09
A to nie to samo?:) - lion137 2018-11-09 19:43
boxing to opakowanie w instancję typu referencyjnego, unboxing to wyciągnięcie instancji typu wartościowego. boxing następuje przy przypisaniu inta do objecta, co zacytował autor: But that happens only if you cast the int to object. - Wibowit 2018-11-09 21:42

Pozostało 580 znaków

2018-11-09 16:22
0

Tylko z tego, co rozumiem, to .NET jakoś inaczej traktuje System.Int32 niż zwykłe struktury, aby nie było narzutu z opakowywaniem. Tylko po co tak komplikować?

Pozostało 580 znaków

2018-11-09 16:59
2

Na jakiej podstawie tak twierdzisz? O ile mi wiadomo wszystkie typy wartościowe są obsługiwane tak samo. I boxing następuje tylko w określonych przypadkach, jak przy przypisaniu typu wartościowego do objecta albo do interfejsu, ale już nie przy użyciu jako generyczny typ.

Pozostało 580 znaków

2018-11-09 17:15
Any
0

A po to żeby mieć jeden standard dla całej platformy .NET, a to czy się w C# nazywa int , a w innym języku integer to już sprawa kompilatora

Pozostało 580 znaków

2018-11-09 18:04
Wielki Kaczor
1

Po pierwsze int to jest alias nazwy Int32 - taka nazwa zastępcza Też możesz sobie tworzyć takie nawy zastępcze za pomocą słowa kluczowego using.
Po drugie nie wiem czy wiesz czy nie wiesz ale język C# zbudowany z jest z języka niższego rzędu CLI (IL) - Common Intermediate Language.
Ten pośredni język też posiada już takie typy podstawowe jak int32 . Struktura Int32 w C# to jest tak jakby nadbudowa tego int32 w CLI
W końcu ten język CLI zbudowany jest z języka najniższego rzędu - kodu maszynowego zrozumiałego dla procesora komputera .

Pozostało 580 znaków

2018-11-09 18:32
0

Ok, moj blad. Nie zachodzi autoboxing, bo od razu tworzona jest struktura zamiast "inta". Ale dalej nie wiem, jaki jest tego sens.

edytowany 1x, ostatnio: nobody01, 2018-11-09 18:33

Pozostało 580 znaków

2018-11-09 18:36
6
nobody01 napisał(a):

Czyli chodzi o generyki? Nie da się zrobić, aby generyki obsługiwały jednocześnie obiekty i typy prymitywne takie jak w Javie?

No właśnie Javowe generyki nie obsługują prymitywów, dlatego że prymitywy nie są obiektami. W C# to osiągnięto, bo zarówno struktury, jak i klasy znajdują się w jednej hierarchii dziedziczenia.

No i o co chodzi z tym, że There is no "wrapping" in a struct going on here. i But that happens only if you cast the int to object.?

int to alias na System.Int32, więc tu nie ma żadnego wrapowania, bo to jest po prostu jedno i to samo. Dopiero jak próbujesz go wsadzić do zmiennej typu object, to następuje wrapowanie (a właściwie boxowanie).

nobody01 napisał(a):

Tylko z tego, co rozumiem, to .NET jakoś inaczej traktuje System.Int32 niż zwykłe struktury, aby nie było narzutu z opakowywaniem. Tylko po co tak komplikować?

Nie wiem, o co dokładnie Ci tutaj chodzi, ale ogólna prawda jest taka, że jeśli kompilator zna konkretny typ, to może różne optymalizacje na jego podstawie robić. Normalna sprawa.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2018-11-09 18:52
0

Z czym macie problem Panowie ? Najlepiej wklejcie kod żebyśmy wiedzieli o czym gadamy

Pozostało 580 znaków

2018-11-09 19:42
2
nobody01 napisał(a):

Ok, moj blad. Nie zachodzi autoboxing, bo od razu tworzona jest struktura zamiast "inta". Ale dalej nie wiem, jaki jest tego sens.

Nie ma „tworzenia struktury zamiast inta”, tylko jest po prostu int.
W C# taki List<int> to jest lista intów. Nie intów opakowanych w cokolwiek, tylko 32-bitowych intów.

inti System.Int32 to jest to samo. Jedno jest po prostu aliasem drugiego, podobnie jak string i System.String, object i System.Object albo float i System.Single.
W C# każdy „keywordowy” typ ma swoją nazwę „namespace'ową” i obie nazwy są równoważne.

edytowany 4x, ostatnio: Azarien, 2018-11-09 19:48

Pozostało 580 znaków

2018-11-09 19:53
0
somekind napisał(a):
nobody01 napisał(a):

Czyli chodzi o generyki? Nie da się zrobić, aby generyki obsługiwały jednocześnie obiekty i typy prymitywne takie jak w Javie?

No właśnie Javowe generyki nie obsługują prymitywów, dlatego że prymitywy nie są obiektami. W C# to osiągnięto, bo zarówno struktury, jak i klasy znajdują się w jednej hierarchii dziedziczenia.

To jak to z tym dziedziczeniem jest? Wszystko pochodzi od Object ale jak to się dzieje skoro struktury nie mogą dziedziczyć z klas, mogą tylko implementować interfejsy. ?

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0