Proč lze použít = u value types? .NET

Ja

Proč lze použít = u value types? .NET
« kdy: 31. 05. 2018, 20:59:23 »
Nazdar, value types jsou jinými slovy struktury, jak to, že můžu tedy použít např.
bool b = true;

Když struktura Bool nikde nemá použito přetížení operátoru = ?
Navíc když se na Bool podívám, nikde neobsahuje žádnou propertu pro držení dat.

Když si chci udělat vlastní strukturu, tak pokud do ní chci něco uložit, musí mít struktura nějakou propertu.
Viz třeba

MujBool b;
b.value = true;

Předpokládám, že to .NET prostě nějak skrývá, zajímalo by mě jak, ví někdo?


gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Proč lze použít = u value types? .NET
« Odpověď #1 kdy: 31. 05. 2018, 21:41:17 »
Nazdar, value types jsou jinými slovy struktury, jak to, že můžu tedy použít např.
bool b = true;

nepleteš si primitivní typ a hodnotový typ?

Když struktura Bool nikde nemá použito přetížení operátoru = ?

to nepotřebuješ, jedná se o přiřazení stejného typu. literal true je typu bool.

Ja

Re:Proč lze použít = u value types? .NET
« Odpověď #2 kdy: 03. 06. 2018, 10:22:26 »
Nepletu, protože primitivní datové typy .NET neobsahuje, aspoň dle https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/value-types


Citace
Když struktura Bool nikde nemá použito přetížení operátoru = ?

to nepotřebuješ, jedná se o přiřazení stejného typu. literal true je typu bool.
Ok to teda vysvětluje, proč to jde, prostě je to v .NET zadrátované.

Ale co má první otázka? Kde se ta hodnota ve struktuře bool drží?

test

Re:Proč lze použít = u value types? .NET
« Odpověď #3 kdy: 03. 06. 2018, 13:23:57 »
Nepletu, protože primitivní datové typy .NET neobsahuje, aspoň dle https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/value-types


Citace
Když struktura Bool nikde nemá použito přetížení operátoru = ?

to nepotřebuješ, jedná se o přiřazení stejného typu. literal true je typu bool.
Ok to teda vysvětluje, proč to jde, prostě je to v .NET zadrátované.

Ale co má první otázka? Kde se ta hodnota ve struktuře bool drží?

System.Boolean (a vlastně i všechny ostatní) mají v sobě proměnou m_value (lze se podívat do zdrojáků .NET Core) ve které se ta hodnota drží....to jak se tam dostává je věc druhá (sám to nevím)

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Proč lze použít = u value types? .NET
« Odpověď #4 kdy: 03. 06. 2018, 13:37:53 »
Nepletu, protože primitivní datové typy .NET neobsahuje, aspoň dle https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/value-types

tak vestavěné typy, takové pro které existují literaly.

Citace
Když struktura Bool nikde nemá použito přetížení operátoru = ?

to nepotřebuješ, jedná se o přiřazení stejného typu. literal true je typu bool.
Ok to teda vysvětluje, proč to jde, prostě je to v .NET zadrátované.

Ale co má první otázka? Kde se ta hodnota ve struktuře bool drží?

literal true vytvoří hodnotu typu bool. stejné jako bys napsal new bool(hodnota)

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/value-types#initializing-value-types


Ja

Re:Proč lze použít = u value types? .NET
« Odpověď #5 kdy: 03. 06. 2018, 17:12:35 »
Super, díky za odpovědí  :)
Moje zvědavost je už uspokojena :D

polygon

Re:Proč lze použít = u value types? .NET
« Odpověď #6 kdy: 03. 06. 2018, 23:12:22 »
Pokud hledáte takovéto vysvětlení v .NET, především se ptejte jak daný konstrukt vypadá ve vašem jazyce (C#), jak vypadá v IL a do čeho bude eventuálně přeložen.
int je v zásadě syntaktický cukr pro System.Int32. Jeví se jako primitivní typ, ale ty v .NET přímo nejsou. Není to ale velká chyba některé vestavěné typy za primitivní typy považovat.
System.Int32 vypadá dekompilovaný takto:
public struct Int32
{
    internal Int32 m_value;

    // Other members.
}
Což ale nejde zkompilovat, protože struktura nemůže obsahovat svůj vlastní typ jako field. Je to tedy jen taková vizuální pomůcka a ne skutečný kód. Něco tam být musí, protože System.Int32 je struct - hodnotový typ.
IL obsahuje typ int32 a ten je pak překládán jako primitivní datový typ. AFAIK.

Poslední legrace s int (a všemi hodnotovými typy) je, že jako každý datový typ je odvozen od System.Object. Je tedy možné mít object o = 5; a pak psát třeba o.ToString(). "o" je pořád 5 a zároveň je to objekt, čehož se dosáhne technikou zvanou boxing. Z pohledu jazyka vše probíhá transparentně. Do IL se podle potřeby přeloží instrukce box/unbox.

harrison314

Re:Proč lze použít = u value types? .NET
« Odpověď #7 kdy: 04. 06. 2018, 07:17:15 »
To na co sa pytas v prvom prispevku spravit ide cez implicitny operator:

Kód: [Vybrat]
MujBool b;
b.value = true;

na
Kód: [Vybrat]
MujBool b = true;

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/implicit