Value Types C#

Zmienne typu wartościowego (ValueType) są najprostszymi strukturami danych dostępnymi w frameworku .NET. W odróżnieniu od typów referencyjnych ich wartość jest przechowywana na stosie co znacznie ułatwia i przyspiesza dostęp do danych. W przypadku typów referencyjnych na stosie jest przechowywana jedynie referencja na  obiekt znajdujący się na stercie (heap).

Z uwagi na to, że w sieci jest dużo informacji na ten temat przedstawię tylko ciekawostki warte zapamiętania.

Typy wartościowe możemy podzielić na trzy główne kategorie:

  • Typy wbudowane
  • Typy wyliczeniowe (Enumeration)
  • Typy tworzone przez użytkownika (Struktury)

Wszystkie typy wartościowe są pochodnymi klasy System.ValueType. Główną cechą zmiennych tego typu jest fakt, że po przypisaniu jednej zmiennej do innej dostajemy kopię danego obiektu. Zatem po takiej operacji dostajemy dwie niezależne zmienne. Podobna sytuacja ma miejsce podczas przekazywania takich zmiennych jako parametry w funkcjach.

Domyślna implementacja metody ValueType.Equals do porównywania wartości wykorzystuje system refleksji. Nadpisanie tej metody w określonych typach może znacznie zwiększyć wydajność ich porównywania.

Typy wbudowane

Pierwszą ważną kwestią jest inicjalizacji  zmiennych lokalnych, gdyż brak inicjalizacji powoduje błąd podczas kompilacji. Typy wartościowe będące polami klas nie muszą być inicjalizowany. Przy tworzeniu obiektu danej klasy mają przypisaną domyślną wartość dla danego typu.

Nazwy typów int, long, double itd są tylko aliasami na typy, odpowiednio System.Int32, System.Int64, System.Double. Wszystkie aliasy możemy zobaczyć tutaj.

Każdy typ wartościowy posiada domyślny konstruktor który możemy wywołać:

[csharp]int i = new int();
double d = new double();[/csharp]

Po wywołaniu konstruktora zostanie utworzony obiekt z domyślną wartością.

Enum

Kolejnym typem wartościowym jest typ wyliczeniowy. Domyślnym typem dla typu enumeracyjnego jest int, aby wskazać inny typ podajemy go po nazwie, do dyspozycji mamy wszystkie typy całkowite za wyjątkiem typu char

[csharp]enum Days : long { Mon=1, Tue, Wed, Thu, Fri, Sat, Sun };[/csharp]

Elementy typu wyliczeniowego możemy rzutować na typ w jakim wartości są przechowywane (w tym przypadku long) jak i możliwa jest konwersja w drugą stronę.

[csharp] long mon = (long) Days.Mon;
Days d = (Days) mon;[/csharp]

Domyślną wartością każdego typu enumeracyjnego jest 0, zatem warto o tym pamiętać przypisując wartości do poszczególnych jej elementów.

[csharp]Days days = new Days(); //Domyślny konstruktor

Days days = 0; //nie wymaga rzutowania

Days days = (Days)1; //rzutowanie wymagane

[/csharp]

Słowem kluczowym new możemy zastąpić dany typ enumeracyjny zagnieżdżony w klasie na nowy.

Flags

Aby móc typem enumeracyjnym posługiwać się jako flagami musimy dodać do niego atrybut [Flags]. Warto pamiętać aby do konkretnych elementów typu wyliczeniowego przypisać wartości będące kolejnymi potęgami 2, w przeciwnym wypadku typ może zachowywać się nie tak jak byśmy tego oczekiwali.

[csharp][Flags]
enum Colors : short
{
Black = 0,
Red = 1,
Green = 2,
Blue = 4,
All = Black | Red | Green | Blue
}
[/csharp]

Struct

Struktury są typem definiowanym przez użytkownika. Struktury posiadają kilka podstawowych cech o których warto pamiętać:

  • rozmiar struktury musi być nie większy niż 16 B (bajtów)
  • struktura nie może posiadać bezparametrowego konstruktora
  • w strukturach nie ma dziedziczenia tak jak w klasach jednakże struktura jest pochodną klasy System.Object
  • sturuktua nie może być bazą dla klasy jak również struktura nie może dziedziczyć po innej strukturze lub klasie
  • mimo braku dziedziczenia struktury mogą implementować interfejsy.

Dzięki atrybutom możemy określić niestandardowe rozłożenie struktury w pamięci (coś na wzór union w C/C++)

[csharp]
[StructLayout(LayoutKind.Explicit)]
struct TestExplicit
{
[FieldOffset(0)]
public long lg;
[FieldOffset(0)]
public int i1;
[FieldOffset(4)]
public int i2;
} [/csharp]

W powyższym przypadku pole lg wskazuje na ten sam obszar pamięci co pola i1 i i2. Zatem zmiana pola lg zmienia wartości pól i1 i i2, jak również zmiana pól i1 i/lub i2 zmienia wartość pole lg.

Nullable

Domyślnie do typu wartościowego nie można przypisać wartości null. Jednak platforma .NET dostarcza nam typ generyczyn umożliwiający takie przypisanie, mowa tu o strukturze Nullable<T>.

[csharp]
Nullable<int> nint = null;
int? a = null; // skrócony zapis
[/csharp]

Boxing/Unboxing

Boxing i unboxing to mechanizmy o których istnieniu warto wiedzieć. Prostym przykładem boxing’u jest poniższy kod:

[csharp]Point p = new Point();
object obj = (object)p;
p.X = 5;
Console.WriteLine(p);
Console.WriteLine(obj);
[/csharp]

Po wykonaniu tego kodu na ekranie ujrzymy:

{X=5,Y=0}
{X=0,Y=0}

Jak widzimy po przypisaniu struktury typu Point do zmiennej typu object uzyskaliśmy dwa różne obiekty, a to za sprawą faktu, że przy przypisaniu struktury do zmiennej typu referencyjnego obiekt został skopiowany do sterty i uzyskaliśmy dwie kopie tego samego obiektu jedna na stosie, a drugą na stercie. W wyniku czego zmiana pierwszego nie wpływa na drugi obiekt.

Więcej informacji jak również przykładowe ilustracje przybliżające działanie mechanizmu boxingu można znaleźć w The C# Value Type and Boxing .

Wpis powstał na podstawie: Value Types, Structs Tutorial, Enumeration Types, Boxing and Unboxing, Nullable Types.

3,550 thoughts on “Value Types C#”

  1. Heya! I just wanted to ask if you ever have any problems with hackers?
    My last blog (wordpress) was hacked and I ended up losing many months of
    hard work due to no backup. Do you have any methods to stop hackers?

  2. Hi, Neat post. There’s a challenge along with your site in internet explorer,
    could test this? IE nonetheless will be the market leader
    and a big part of other people will miss your magnificent writing because
    of this problem.

  3. Thanks , I’ve just been looking for info about this subject for
    ages and yours is the greatest I have came upon till
    now. However, what about the conclusion? Are you
    positive concerning the supply?

  4. You can definitely see your expertise within the work you write. The sector hopes for more passionate writers like you who are not afraid to mention how they believe. Always go after your heart.

  5. I will immediately snatch your rss as I can not find your e-mail subscription hyperlink or newsletter service. Do you’ve any? Please permit me recognise in order that I may just subscribe. Thanks.

  6. I think this is one of the most important info for me. And i’m glad reading your article. But should remark on few general things, The website style is great, the articles is really excellent : D. Good job, cheers

  7. My brother recommended I would possibly like this blog.
    He was once entirely right. This post actually made my
    day. You cann’t believe just how a lot time I had spent
    for this information! Thank you!

  8. Great write-up, I¡¦m regular visitor of one¡¦s blog, maintain up the excellent operate, and It is going to be a regular visitor for a long time.

  9. You completed a few nice points there. I did a search on the theme and found nearly all persons will consent with your blog.

  10. Murió en Madrid a causa de los heridas recibidas, pues fue acribillado a bayonetazos delante de la puerta de Monteleón victima de una ardid alevosía del general francés Lagrange, el cual se acercó con un pañuelo blanco en la punta de la espada como símbolo de paz y cuando estuvo a su altura, cayó sobre Daoiz los soldados del general francés, conociéndolos desde aquella fecha en Madrid Como los héroes del 2 de mayo de 1808”.

  11. Hello there, just became alert to your blog through Google, and found that it is truly informative. I am gonna watch out for brussels. I’ll be grateful if you continue this in future. Lots of people will be benefited from your writing. Cheers!

  12. I just could not leave your site prior to suggesting that
    I extremely loved the normal info a person provide on the visitors?

    Is gonna be again frequently so that you can inspect new
    posts

  13. I relish, lead to I discovered just what I used to be
    taking a look for. You have ended my four day long hunt! God
    Bless you man. Have a great day. Bye

  14. Wow that was strange. I just wrote an really
    long comment but after I clicked submit my comment didn’t appear.

    Grrrr… well I’m not writing all that over again. Anyways, just wanted to
    say superb blog!

  15. Hello! I really could have sworn I’ve gone to this site
    before but after reading through some of the post I realized it’s a new comer to me.
    Nonetheless, I’m definitely happy I stumbled upon it and I’ll be bookmarking and checking back often!

  16. Pretty section of content. I just stumbled upon your weblog and in accession capital to assert that I acquire actually enjoyed account your blog posts. Anyway I’ll be subscribing to your feeds and even I achievement you access consistently quickly.

  17. I’ve noticed this small city undergo a lot of changes previously 30 years,
    from the Canadian firm planning to assemble 11-history company towers, to Watt Market wanting to build 360 acres into
    a master-planned beach community, to a class from Detroit wanting to
    develop six square blocks along in the beach.

  18. You can definitely see your expertise within the work you write. The sector hopes for more passionate writers like you who are not afraid to mention how they believe. Always go after your heart.

  19. Thank you for each of your effort on this site. Debby really loves engaging in investigation and it’s easy to understand why. A number of us learn all of the powerful way you give helpful solutions on the website and therefore invigorate contribution from other individuals about this article plus our princess is really discovering a whole lot. Have fun with the remaining portion of the year. You have been conducting a pretty cool job.

  20. hey there and thank you for your info – I have definitely picked up anything new from right here. I did however expertise a few technical issues using this website, as I experienced to reload the web site lots of times previous to I could get it to load correctly. I had been wondering if your web host is OK? Not that I am complaining, but slow loading instances times will very frequently affect your placement in google and could damage your high quality score if ads and marketing with Adwords. Anyway I’m adding this RSS to my email and could look out for a lot more of your respective interesting content. Ensure that you update this again soon..

  21. Simply wish to say your article is as astonishing.
    The clearness in your submit is simply cool and that i can assume
    you’re a professional on this subject. Well along with your permission allow
    me to grasp your feed to stay updated with imminent post.

    Thanks 1,000,000 and please keep up the gratifying work.

  22. What’s up colleagues, how is the whole thing, and what you wish for to say about this paragraph,
    in my view its really amazing in support of me.

  23. Hi, i do believe i saw you visited my site thus i got to return the favor.I’m trying to find points to enhance my website!I suppose its ok to make use of
    a number of your ideas!!

  24. magnificent issues altogether, you just received a logo new reader. What may you recommend about your put up that you simply made a few days ago? Any certain?

  25. Its like you read my mind! You appear to know a lot about this, like you wrote the book in it or something. I think that you can do with some pics to drive the message home a bit, but instead of that, this is wonderful blog. A great read. I’ll definitely be back.

  26. I intended to send you a little bit of note to say thank you again on the pleasing ideas you’ve shown above. It’s simply unbelievably open-handed with people like you to convey without restraint all that most people would’ve made available for an ebook in making some dough for themselves, notably given that you might have done it if you decided. The tactics also acted to become good way to know that other people have the same interest really like my personal own to figure out a whole lot more around this matter. Certainly there are thousands of more pleasurable situations up front for people who read through your website.

  27. Hello! Do you know if they make any plugins to protect against hackers?
    I’m kinda paranoid about losing everything I’ve worked hard
    on. Any suggestions?

  28. Nosso estudo mostrou que a ativa utilizada no conjunto de acompanhantes foi adequada e também atingiu os objetivos almejados, proporcionando a eles possibilidade de expressarem seus conflitos, fantasias e também temores e também receberem atenção e
    também entendimento de suas queixas, produzindo conforto e também tranqüilização
    de suas ansiedades. http://letshelp.ir/QuinnBly68/tab:info

  29. I ⅼike what yoᥙ guuys arе uup too. Such intelligent work and reporting!
    Carrʏ on the superb works guys I’ve incorporated you guys to
    my blogroll. I think it’ll improve the value oof my site :
    ).

Leave a Reply