{"id":32562,"date":"2021-03-23T18:00:00","date_gmt":"2021-03-23T17:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=32562"},"modified":"2021-03-26T15:39:32","modified_gmt":"2021-03-26T14:39:32","slug":"record-posizionali-in-c-9","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/","title":{"rendered":"Record posizionali in C# 9"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"32563\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/attachment\/7_21_1105x656_blog-c9record\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record.png?fit=1105%2C656&amp;ssl=1\" data-orig-size=\"1105,656\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"7_21_1105x656_blog-c9record\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record.png?fit=300%2C178&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-32563\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record-1024x608.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ho gi\u00e0 parlato in un <a href=\"https:\/\/blexin.com\/it\/blog\/uno-sguardo-al-futuro-c-9\/\" target=\"_blank\" rel=\"noreferrer noopener\">precedente articolo<\/a> delle probabili novit\u00e0 che sarebbero state introdotte con la nuova versione del linguaggio di casa Microsoft C# 9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tra queste, quella che per molti sviluppatori risulta essere la pi\u00f9 interessante \u00e8 l\u2019introduzione dei <em>Record<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un tipo Record ci fornisce un modo pi\u00f9 semplice per creare un tipo di riferimento immutabile in .NET. Per impostazione predefinita, infatti, i valori delle propriet\u00e0 di un&#8217;istanza di un <em>Record <\/em>non possono cambiare dopo la sua inizializzazione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il passaggio dei dati avviene in base al valore e l\u2019uguaglianza tra due <em>Record <\/em>\u00e8 verificata confrontando il valore delle loro propriet\u00e0.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I <em>Record <\/em>possono essere quindi utilizzati efficacemente in casi in cui abbiamo bisogno di immutabilit\u00e0, come quando dobbiamo inviare o ricevere dati, o quando abbiamo bisogno di confrontare i valori di propriet\u00e0 di oggetti dello stesso tipo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prima di approfondire l\u2019argomento, parliamo di un\u2019altra funzionalit\u00e0 introdotta con questa versione del linguaggio e strettamente correlata ai Record, ovvero la parola chiave <em>init <\/em>che va associata a propriet\u00e0 e indicizzatori.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n public class Person \n{ \n        public string Name { get; init; } \n        public string Surname { get; init; } \n\n        public Person() \n        { \n        } \n\n        public Person(string name, string surname) \n\n        { \n                Name = name; \n                Surname = surname; \n        } \n} \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Grazie a questa nuova funzionalit\u00e0, come suggerisce il nome, le propriet\u00e0 di sola inizializzazione possono essere settate solo quando l&#8217;oggetto viene inizializzato, ma non possono essere modificate successivamente;&nbsp;in questo modo,&nbsp;\u00e8 possibile disporre di un modello immutabile:&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar person = new Person\t\t\t\t        \/\/Object Initializer \n{ \n        Name = &quot;Francesco&quot;, \n        Surname = &quot;Vas&quot; \n}; \n\nvar otherPerson = new Person(&quot;Adolfo&quot;, &quot;Arnold&quot;);\t\/\/Constructor \n\nperson.Surname = &quot;de Vicariis&quot;; \t\t\t\/\/Compile error \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Da notare che, essendo presente nella classe un costruttore parametrizzato, il frammento di codice dell\u2019<em>Object Initializer <\/em>compila solo se \u00e8 presente esplicitamente anche il costruttore senza parametri.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Torniamo ora a parlare di <em>Record <\/em>e vediamo come poterli definire utilizzando la sintassi di default. I <em>Record <\/em>scritti in questo modo, cio\u00e8 con un elenco di parametri, vengono detti <em>Record Posizionali<\/em>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic record Person(string Name, string Surname); \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Vediamo subito cosa c\u2019\u00e8 dietro le quinte!&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Analizzando il codice&nbsp;<em>IL<\/em>&nbsp;generato da questa sintassi, vediamo che l\u2019istruzione viene interpretata come una classe&nbsp;<em>Person<\/em>&nbsp;che implementa l&#8217;interfaccia&nbsp;<em>IEquatable<\/em><em>&lt;T&gt;<\/em>.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La classe contiene due campi privati di tipo stringa e un costruttore parametrizzato con i due relativi argomenti di tipo stringa:&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n.class public auto ansi beforefieldinit Person extends &#x5B;System.Runtime]System.Object \nimplements class &#x5B;System.Runtime]System.IEquatable`1&lt;class Person&gt; \n{ \n  \t     .field private initonly string &#039;&lt;Name&gt;k__BackingField&#039; \n  \t     .field private initonly string &#039;&lt;Surname&gt;k__BackingField&#039; \n         .method public hidebysig specialname rtspecialname instance void   \n         .ctor(string Name, string Surname) cil managed \n  \t     { \n                string Person::&#039;&lt;Name&gt;k__BackingField&#039; \n                string Person::&#039;&lt;Surname&gt;k__BackingField&#039; \n                instance void &#x5B;System.Runtime]System.Object::.ctor() \n        } \n} \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Vediamo anche i metodi pubblici <em>getter <\/em>e <em>setter <\/em>delle propriet\u00e0, ma se prestiamo attenzione, notiamo che i metodi <em>setter<\/em>, hanno l\u2019attributo <em>IsExternalInit<\/em>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n.method public hidebysig specialname instance void modreq (&#x5B;System.Runtime]System.Runtime.CompilerServices.IsExternalInit) \n\n    set_Name(string &#039;value&#039;) cil managed \n\n{ \/\/...} \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Questo perch\u00e9 viene utilizzata la parola chiave <em>init<\/em>, di cui abbiamo parlato ad inizio articolo, per ogni propriet\u00e0 del Record dichiarato con la sintassi di default:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic string Name { get; init; } \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Per maggior chiarezza, vi mostrer\u00f2 ora un file prodotto con un software di analisi del codice <em>IL (ILSpy), <\/em>che interpreta la nostra definizione in questo modo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic class Person : IEquatable&lt;Person&gt; \n{ \n        private readonly string &lt;Name&gt;k__BackingField; \n\n        private readonly string &lt;Surname&gt;k__BackingField; \n\n        protected virtual Type EqualityContract \n        { \n                get { return typeof(Person); } \n        } \n\n        public string Name { get; init; } \n\n        public string Surname { get; init; } \n  \n        public Person(string Name, string Surname) \n        { \n                this.Name = Name; \n                this.Surname = Surname; \n                base..ctor(); \n        } \n\n        public override string ToString() \n        { \n                StringBuilder stringBuilder = new StringBuilder(); \n           \t    stringBuilder.Append(&quot;Person&quot;); \n                stringBuilder.Append(&quot; { &quot;); \n                if (PrintMembers(stringBuilder)) \n        { \n                stringBuilder.Append(&quot; &quot;); \n        } \n\n        stringBuilder.Append(&quot;}&quot;); \n\n        return stringBuilder.ToString(); \n        } \n\n         protected virtual bool PrintMembers(StringBuilder builder) \n        { \n                builder.Append(&quot;Name&quot;); \n                builder.Append(&quot; = &quot;); \n                builder.Append((object?)Name); \n                builder.Append(&quot;, &quot;); \n                builder.Append(&quot;Surname&quot;); \n                builder.Append(&quot; = &quot;); \n                builder.Append((object?)Surname); \n   \t            return true; \n        } \n\n        public static bool operator !=(Person? r1, Person? r2) \n        { \n                return !(r1 == r2); \n        } \n\n        public static bool operator ==(Person? r1, Person? r2) \n        { \n                 return (object)r1 == r2 || (r1?.Equals(r2) ?? false); \n        } \n\n        public override int GetHashCode() \n        { \n                return (EqualityComparer&lt;Type&gt;.Default.GetHashCode(EqualityContract) * -1521134295 + \n                EqualityComparer&lt;string&gt;.Default.GetHashCode(Name)) * -1521134295 +  \n                EqualityComparer&lt;string&gt;.Default.GetHashCode(Surname); \n         } \n\n         public override bool Equals(object? obj) \n        { \n                return Equals(obj as Person); \n        } \n\n        public virtual bool Equals(Person? other) \n        { \n                return (object)other != null &amp;&amp; EqualityContract == other!.EqualityContract  \n                &amp;&amp; EqualityComparer&lt;string&gt;.Default.Equals(Name, other!.Name)  \n                &amp;&amp; EqualityComparer&lt;string&gt;.Default.Equals(Surname, other!.Surname); \n        } \n\n        public virtual Person&lt;Clone&gt;$() \n        { \n                return new Person(this); \n        } \n\n        protected Person(Person original) \n        { \n                Name = original.Name; \n                Surname = original.Surname; \n        } \n\n        public void Deconstruct(out string Name, out string Surname) \n        { \n                Name = this.Name; \n                Surname = this.Surname; \n        } \n\n}     \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Possiamo quindi vedere che, con una sola riga di codice, avremo a disposizione:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Propriet\u00e0 di sola inizializzazione che ci garantiscono un&#8217;istanza di tipo immutabile senza dichiarazioni aggiuntive.<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>Un costruttore con tutte le propriet\u00e0 come argomenti, chiamato <em>Costruttore Primario<\/em>.<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>Un metodo <em>PrintMembers() <\/em>ed un override del metodo <em>ToString() <\/em>che ci forniscono una rappresentazione testuale del tipo e dei valori delle propriet\u00e0 dell\u2019oggetto.<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>Controlli di uguaglianza basati sul valore senza la necessit\u00e0 di sovrascrivere i metodi <em>GetHashCode() <\/em>ed <em>Equals().<\/em><\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>Un&#8217;implementazione del metodo <em>Deconstruct(), <\/em>che ci consente di utilizzare la decostruzione di oggetti per accedere alle singole propriet\u00e0 come valori individuali.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Facciamo qualche esempio concreto. Inizializziamo un oggetto di tipo Record utilizzando un costruttore come se creassimo un\u2019istanza di una classe:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar person = new Person(&quot;Francesco&quot;, &quot;Vas&quot;); \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Non \u00e8 possibile utilizzare un&nbsp;<em>Object&nbsp;Initializer<\/em>&nbsp;definendo un&nbsp;<em>Record<\/em>&nbsp;con la sintassi di default, perch\u00e9,&nbsp;come abbiamo visto dal codice&nbsp;<em>IL<\/em>, la classe ha solo il costruttore parametrizzato.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Manca invece un costruttore senza parametri, che \u00e8 necessario per il suo funzionamento:&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar personWithInitializer = new Person { Name = &quot;Francesco&quot;, Surname = &quot;Vas&quot; }; \t\/\/Compile error \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Se proviamo a modificare il valore di una propriet\u00e0 dopo l&#8217;inizializzazione dell&#8217;oggetto, otteniamo un errore di compilazione.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Come abbiamo detto, non \u00e8 possibile modificare il valore di un&#8217;istanza esistente di un tipo&nbsp;<em>record<\/em>:&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nperson.Name = &quot;Adolfo&quot;; \t\t\t\t\/\/Compile error\t\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u00c8 possibile creare una copia dell\u2019istanza del record modificando tutte o solo alcune delle sue propriet\u00e0:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar otherPerson = person with { Surname = &quot;de Vicariis&quot; }; \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">In questo modo,&nbsp;creiamo un nuovo&nbsp;<em>Record<\/em>&nbsp;<em>otherPerson<\/em>&nbsp;di tipo&nbsp;<em>Person<\/em>&nbsp;con gli stessi valori dell&#8217;istanza&nbsp;<em>person<\/em>&nbsp;esistente,&nbsp;ad eccezione dei valori che forniamo dopo l&#8217;istruzione&nbsp;<em>with<\/em>.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se proviamo ora ad utilizzare l\u2019override&nbsp;del metodo&nbsp;<em>ToString()<\/em>&nbsp;che la definizione del&nbsp;<em>Record<\/em>&nbsp;stesso ci fornisce, possiamo verificare che i risultati siano quelli attesi:&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nConsole.WriteLine(person.ToString());\t\/\/ Person { Name = Francesco, Surname = Vas } \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">O semplicemente possiamo scrivere:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nConsole.WriteLine(otherPerson);\t\t\/\/ Person { Name = Francesco, Surname = de Vicariis } \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Come ci aspettavamo, otteniamo la rappresentazione testuale del tipo,&nbsp;dei valori delle propriet\u00e0 dei due&nbsp;<em>Record<\/em>&nbsp;e l\u2019istanza del&nbsp;<em>record&nbsp;<\/em>originale \u00e8 stata clonata e modificata.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Proviamo ora a confrontare due&nbsp;<em>Record<\/em>:&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar person = new Person(&quot;Francesco&quot;, &quot;Vas&quot;); \n\nvar otherPerson = new Person(&quot;Francesco&quot;, &quot;Vas&quot;); \n\nConsole.WriteLine(person.Equals(otherPerson));\t\t\t                                        \/\/Returns True \nConsole.WriteLine(person == otherPerson);\t\t\t\t                                            \/\/Returns True \nConsole.WriteLine(person.GetHashCode() == otherPerson.GetHashCode());\t\/\/Returns True \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">A differenza di una classe, i <em>Record <\/em>seguono l&#8217;uguaglianza strutturale anzich\u00e9 l&#8217;uguaglianza referenziale. L&#8217;uguaglianza strutturale garantisce che due <em>Record <\/em>siano considerati uguali se il loro <em>tipo <\/em>\u00e8 uguale e i valori di tutte le propriet\u00e0 sono uguali.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Parliamo brevemente anche del <em>decostruttore<\/em>, che non \u00e8 certamente una novit\u00e0 introdotta con C# 9, ma che ci viene messo a disposizione in modo \u201cgratuito\u201d dalla definizione del <em>Record Posizionale<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Come abbiamo visto dal codice <em>IL<\/em>, \u00e8 presente un metodo <em>Deconstruct <\/em>con tanti parametri quante sono le propriet\u00e0 del <em>Record <\/em>che abbiamo creato. Questo ci permette di accedere a tutte le propriet\u00e0 individualmente:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar person = new Person (&quot;Francesco&quot;, &quot;Vas&quot;, 20); \nvar (name, surname, id) = person; \n\nConsole.WriteLine(name + &quot; &quot; + surname + &quot;, Id: &quot; + id);\t\t\/\/ Francesco Vas, Id: 20 \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Oppure possiamo utilizzare le variabili&nbsp;<em>discard<\/em>&nbsp;per ignorare elementi restituiti da un metodo&nbsp;<em>Deconstruct<\/em>:&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar (_, _, onlyId) = person; \n\nConsole.WriteLine(onlyId);\t\t\/\/ 20  \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Ogni variabile <em>discard<\/em> \u00e8 definita da una variabile denominata <em>\u201c_\u201d, <\/em>ed una singola operazione di decostruzione pu\u00f2 includere diverse variabili <em>discard<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I <em>Record<\/em> possono essere una valida alternativa alle classi quando dobbiamo inviare o ricevere dati. Lo scopo stesso di un DTO \u00e8 trasferire i dati da una parte del codice a un&#8217;altra e l\u2019immutabilit\u00e0 in molti casi ci pu\u00f2 far comodo. Potremmo quindi utilizzarli per ritornare dati da una Web API o per rappresentare eventi nella nostra applicazione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Possono essere utilizzati facilmente nei casi in cui abbiamo bisogno di confrontare i valori di propriet\u00e0 di oggetti dello stesso tipo. Inoltre, l\u2019immutabilit\u00e0 ci pu\u00f2 aiutare nell\u2019accesso simultaneo ai dati: non abbiamo bisogno di sincronizzare l\u2019accesso ai dati, se i dati sono immutabili.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cosa ne pensate di tutte queste funzionalit\u00e0 in una singola riga di codice? Io lo trovo davvero pratico!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ci sarebbe ancora tanto da dire, ad esempio \u00e8 anche possibile scrivere un nostro Record e personalizzarlo, i <em>Record <\/em>supportano l\u2019ereditariet\u00e0 da altri Record\u2026 ma ne parleremo magari un\u2019altra volta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al prossimo articolo! Stay Tuned!<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Scopriamo cosa si nasconde dietro un Record Posizionale in C# 9 <\/p>\n","protected":false},"author":196716244,"featured_media":32563,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_crdt_document":"","inline_featured_image":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false},"categories":[688637524,688637374],"tags":[688637382],"class_list":["post-32562","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-en","category-blog","tag-c"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Record posizionali in C# 9 - Blexin<\/title>\n<meta name=\"description\" content=\"Cosa si nasconde dietro un Record Posizionale in C# 9? Vediamolo in questo articolo di Francesco\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Record posizionali in C# 9 - Blexin\" \/>\n<meta property=\"og:description\" content=\"Cosa si nasconde dietro un Record Posizionale in C# 9? Vediamolo in questo articolo di Francesco\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-23T17:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-03-26T14:39:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record.png?fit=1105%2C656&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1105\" \/>\n\t<meta property=\"og:image:height\" content=\"656\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Francesco Vastarella\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Francesco Vastarella\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/\"},\"author\":{\"name\":\"Francesco Vastarella\",\"@id\":\"https:\/\/blexin.com\/it\/#\/schema\/person\/388dae0ca9df603c88b5e41e29cf2d4d\"},\"headline\":\"Record posizionali in C# 9\",\"datePublished\":\"2021-03-23T17:00:00+00:00\",\"dateModified\":\"2021-03-26T14:39:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/\"},\"wordCount\":1050,\"image\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record.png?fit=1105%2C656&ssl=1\",\"keywords\":[\"C#\"],\"articleSection\":[\"Blog\",\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/\",\"url\":\"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/\",\"name\":\"Record posizionali in C# 9 - Blexin\",\"isPartOf\":{\"@id\":\"https:\/\/blexin.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record.png?fit=1105%2C656&ssl=1\",\"datePublished\":\"2021-03-23T17:00:00+00:00\",\"dateModified\":\"2021-03-26T14:39:32+00:00\",\"author\":{\"@id\":\"https:\/\/blexin.com\/it\/#\/schema\/person\/388dae0ca9df603c88b5e41e29cf2d4d\"},\"description\":\"Cosa si nasconde dietro un Record Posizionale in C# 9? Vediamolo in questo articolo di Francesco\",\"breadcrumb\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/#primaryimage\",\"url\":\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record.png?fit=1105%2C656&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record.png?fit=1105%2C656&ssl=1\",\"width\":1105,\"height\":656},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blexin.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Record posizionali in C# 9\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blexin.com\/it\/#website\",\"url\":\"https:\/\/blexin.com\/it\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blexin.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blexin.com\/it\/#\/schema\/person\/388dae0ca9df603c88b5e41e29cf2d4d\",\"name\":\"Francesco Vastarella\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/blexin.com\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3b8deedae8f35372d5fba49f918006fb0a58a2943aff6ae52d3ff188e0c441bb?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3b8deedae8f35372d5fba49f918006fb0a58a2943aff6ae52d3ff188e0c441bb?s=96&d=identicon&r=g\",\"caption\":\"Francesco Vastarella\"},\"url\":\"https:\/\/blexin.com\/it\/author\/francesco-vastarellablexin-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Record posizionali in C# 9 - Blexin","description":"Cosa si nasconde dietro un Record Posizionale in C# 9? Vediamolo in questo articolo di Francesco","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/","og_locale":"it_IT","og_type":"article","og_title":"Record posizionali in C# 9 - Blexin","og_description":"Cosa si nasconde dietro un Record Posizionale in C# 9? Vediamolo in questo articolo di Francesco","og_url":"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/","og_site_name":"Blexin","article_published_time":"2021-03-23T17:00:00+00:00","article_modified_time":"2021-03-26T14:39:32+00:00","og_image":[{"width":1105,"height":656,"url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record.png?fit=1105%2C656&ssl=1","type":"image\/png"}],"author":"Francesco Vastarella","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Francesco Vastarella","Tempo di lettura stimato":"7 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/"},"author":{"name":"Francesco Vastarella","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/388dae0ca9df603c88b5e41e29cf2d4d"},"headline":"Record posizionali in C# 9","datePublished":"2021-03-23T17:00:00+00:00","dateModified":"2021-03-26T14:39:32+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/"},"wordCount":1050,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record.png?fit=1105%2C656&ssl=1","keywords":["C#"],"articleSection":["Blog","Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/","url":"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/","name":"Record posizionali in C# 9 - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record.png?fit=1105%2C656&ssl=1","datePublished":"2021-03-23T17:00:00+00:00","dateModified":"2021-03-26T14:39:32+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/388dae0ca9df603c88b5e41e29cf2d4d"},"description":"Cosa si nasconde dietro un Record Posizionale in C# 9? Vediamolo in questo articolo di Francesco","breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record.png?fit=1105%2C656&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record.png?fit=1105%2C656&ssl=1","width":1105,"height":656},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/record-posizionali-in-c-9\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"Record posizionali in C# 9"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/it\/#website","url":"https:\/\/blexin.com\/it\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/388dae0ca9df603c88b5e41e29cf2d4d","name":"Francesco Vastarella","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3b8deedae8f35372d5fba49f918006fb0a58a2943aff6ae52d3ff188e0c441bb?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3b8deedae8f35372d5fba49f918006fb0a58a2943aff6ae52d3ff188e0c441bb?s=96&d=identicon&r=g","caption":"Francesco Vastarella"},"url":"https:\/\/blexin.com\/it\/author\/francesco-vastarellablexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/03\/7_21_1105x656_blog-c9record.png?fit=1105%2C656&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-8tc","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/32562","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/users\/196716244"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=32562"}],"version-history":[{"count":24,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/32562\/revisions"}],"predecessor-version":[{"id":32629,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/32562\/revisions\/32629"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/32563"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=32562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=32562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=32562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}