Csak struct-al működik?

Csak struct-al működik?
2009-03-29T13:23:00+02:00
2009-03-30T21:59:38+02:00
2022-11-13T03:05:39+01:00
retek666
Helló Mindenkinek!

Nézelődtem a neten, hogy hogyan lehet beállítani a rendszer dátumot-időt és ezt találtam. Addig tiszta hogy ez egy windows DLL (talán windows API-nak nevezik?)hívás amely egy referenciát vár, de miért nem lehet neki egy osztályt adni, hiszen az referenciaként tárol. A struct tárol érték szerint ezért kell a ref kulcsszó hogy referencia ként adja vissza a tagokat. Nem értem? Belekavarodtam...

köszi a válaszokat

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { Program prg = new Program(); prg.setTime(6); } [DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)] public extern static bool Win32SetSystemTime(ref SystemTime sysTime); private void setTime(ushort hour ) { // Set system date and time SystemTime updatedTime = new SystemTime(); updatedTime.Year = (ushort)2008; updatedTime.Month = (ushort)4; updatedTime.Day = (ushort)23; // UTC time; it will be modified according to the regional settings of the target computer so the actual hour might differ updatedTime.Hour =Convert.ToUInt16((hour+22)%24); updatedTime.Minute = (ushort)55; updatedTime.Second = (ushort)30; // Call the unmanaged function that sets the new date and time instantly Win32SetSystemTime(ref updatedTime); Console.WriteLine("It's " + DateTime.Now.Hour + " o'clock. Do you know where your C# code is?"); Console.ReadKey(); } } public struct SystemTime { public ushort Year; public ushort Month; public ushort DayOfWeek; public ushort Day; public ushort Hour; public ushort Minute; public ushort Second; public ushort Millisecond; } }
Mutasd a teljes hozzászólást!
Amikor egy struktúra mezőjét éred el, akkor gyakorlatilag (alapesetben) a (struktúra kezdőcíme + össze megelőző adattag mérete) címre hivatkozol. Erre számít az a függvény, amit p/invoke-kal hívsz meg. Ez azért működik, mert a struct így van eltárolva a memóriában. Ezzel szemben a class sokminden mást is tartalmaz (gondolj csak a reflectionre).

Némi info

Annak érdekében, hogy a legacy kóddal való együtt működés megvalósítható legyen komplikáltabb esetekben is, bevezettek néhány attribútumot.

Azt hiszem mostmár érthető ;)

Még annyit, hogy a ref pontosan mit csinál: ez arra való, hogy érték típusokra (System.ValueType leszármazott - minden struct) mutató referenciát tudj átadni egy függvénynek. Ez nem jelent boxingot. Pusztán annyi történik, hogy paraméterátadáskor nem másolódik le az érték, hanem egy referncia adódik át. Tehát ez semmiképpen nem azonos egy ugyanolyan adattagokat tartalmazó class-szal.
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd