Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Ja 31. 05. 2018, 20:59:23

Název: Proč lze použít = u value types? .NET
Přispěvatel: Ja 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?
Název: Re:Proč lze použít = u value types? .NET
Přispěvatel: gll 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.
Název: Re:Proč lze použít = u value types? .NET
Přispěvatel: Ja 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 (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ží?
Název: Re:Proč lze použít = u value types? .NET
Přispěvatel: test 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 (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)
Název: Re:Proč lze použít = u value types? .NET
Přispěvatel: gll 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 (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
Název: Re:Proč lze použít = u value types? .NET
Přispěvatel: Ja 03. 06. 2018, 17:12:35
Super, díky za odpovědí  :)
Moje zvědavost je už uspokojena :D
Název: Re:Proč lze použít = u value types? .NET
Přispěvatel: polygon 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.
Název: Re:Proč lze použít = u value types? .NET
Přispěvatel: harrison314 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