{"id":28,"date":"2020-06-09T10:33:00","date_gmt":"2020-06-09T10:33:00","guid":{"rendered":"https:\/\/www.mainmind.com\/blog\/?p=28"},"modified":"2020-07-29T09:14:31","modified_gmt":"2020-07-29T09:14:31","slug":"c-9-propiedades-iniciales-y-datos","status":"publish","type":"post","link":"https:\/\/www.mainmind.com\/blog\/c-9-propiedades-iniciales-y-datos\/","title":{"rendered":"C# 9: propiedades iniciales y datos"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Desde el a\u00f1o 2000 han sido muchas las <a href=\"https:\/\/github.com\/dotnet\/roslyn\/blob\/master\/docs\/Language%20Feature%20Status.md\" target=\"_blank\" rel=\"noopener noreferrer\">modificaciones y mejoras en el lenguaje<\/a>, a veces cuesta acostumbrarse a estas nuevas funcionalidades, veamos que nos depara 20 a\u00f1os despu\u00e9s:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es posible declarar el valor de propiedades en el momento de creaci\u00f3n de un objeto, no es posible modificar a posteriori estos valores.<\/p>\n\n\n\n<div>\n<div id=\"highlighter_466553\" class=\"syntaxhighlighter  csharp\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"csharp keyword\">public<\/code> <code class=\"csharp keyword\">class<\/code> <code class=\"csharp plain\">Vehiculo<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"csharp spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"csharp keyword\">public<\/code> <code class=\"csharp keyword\">string<\/code> <code class=\"csharp plain\">Marca { <\/code><code class=\"csharp keyword\">get<\/code><code class=\"csharp plain\">; init; }<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"csharp spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"csharp keyword\">public<\/code> <code class=\"csharp keyword\">string<\/code> <code class=\"csharp plain\">Modelo { <\/code><code class=\"csharp keyword\">get<\/code><code class=\"csharp plain\">; init; }<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"csharp plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Por tanto, si todas las propiedades de un objeto con valores primitivos (int, double&#8230;) son de solo lectura (inmutables),&nbsp;nos acercamos a la definici\u00f3n de estructura (struct). Recordemos que las estructuras contienen valores y las clases referencias a valores, el ejemplo b\u00e1sico:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_985639\" class=\"syntaxhighlighter  csharp\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"csharp keyword\">struct<\/code> <code class=\"csharp plain\">Vehiculo<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"csharp plain\">{&nbsp; <\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"csharp spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"csharp keyword\">public<\/code> <code class=\"csharp keyword\">int<\/code> <code class=\"csharp plain\">Potencia;&nbsp; <\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"csharp spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"csharp keyword\">public<\/code> <code class=\"csharp plain\">Vehiculo(<\/code><code class=\"csharp keyword\">int<\/code> <code class=\"csharp plain\">pot)&nbsp; <\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"csharp spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"csharp plain\">{&nbsp; <\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"csharp spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"csharp keyword\">this<\/code><code class=\"csharp plain\">.Potencia = pot;&nbsp; <\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"csharp spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"csharp plain\">}&nbsp; <\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"csharp plain\">}&nbsp; <\/code><\/div>\n<div class=\"line number9 index8 alt2\">&nbsp;<\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"csharp plain\">Vehiculo a = <\/code><code class=\"csharp keyword\">new<\/code> <code class=\"csharp plain\">Vehiculo(120);&nbsp; <\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"csharp plain\">Vehiculo b = a;&nbsp; <\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"csharp plain\">a.Potencia = 200;&nbsp; <\/code><\/div>\n<div class=\"line number13 index12 alt2\">&nbsp;<\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"csharp plain\">System.Console.WriteLine(b.Potencia);<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">El resultado que se muestra siendo una estructura es de 120, si definimos como clase se mostrar\u00eda 200. [que recuerdos de punteros ;)]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Volvamos a las novedades teniendo claras las diferencias, podemos utilizar la declaraci\u00f3n <em>data<\/em> para las clases, aunque realmente estaremos hablando de solo DATOS:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_401292\" class=\"syntaxhighlighter  csharp\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"csharp keyword\">public<\/code> <code class=\"csharp plain\">data <\/code><code class=\"csharp keyword\">class<\/code> <code class=\"csharp plain\">Vehiculo<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"csharp spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"csharp keyword\">public<\/code> <code class=\"csharp keyword\">string<\/code> <code class=\"csharp plain\">Marca { <\/code><code class=\"csharp keyword\">get<\/code><code class=\"csharp plain\">; init; }<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"csharp spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"csharp keyword\">public<\/code> <code class=\"csharp keyword\">string<\/code> <code class=\"csharp plain\">Modelo { <\/code><code class=\"csharp keyword\">get<\/code><code class=\"csharp plain\">; init; }<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"csharp plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Pero podremos definirlos de manera r\u00e1pida y equivalente:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_867137\" class=\"syntaxhighlighter  csharp\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"csharp keyword\">public<\/code> <code class=\"csharp plain\">data <\/code><code class=\"csharp keyword\">class<\/code> <code class=\"csharp plain\">Vehiculo { <\/code><code class=\"csharp keyword\">string<\/code> <code class=\"csharp plain\">Marca; <\/code><code class=\"csharp keyword\">string<\/code> <code class=\"csharp plain\">Modelo}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Tampoco parece un gran avance&#8230; pero se a\u00f1aden m\u00e1s caracter\u00edsticas. Podemos realizar una copia del datos modificando solo una parte de manera r\u00e1pida:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_748991\" class=\"syntaxhighlighter  csharp\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"csharp keyword\">var<\/code> <code class=\"csharp plain\">vehiculo1 = <\/code><code class=\"csharp keyword\">new<\/code> <code class=\"csharp plain\">Vehiculo<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"csharp spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"csharp plain\">Marca = <\/code><code class=\"csharp string\">\"Honda\"<\/code><code class=\"csharp plain\">,<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"csharp spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"csharp plain\">Modelo = <\/code><code class=\"csharp string\">\"Civic\"<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"csharp plain\">};<\/code><\/div>\n<div class=\"line number6 index5 alt1\">&nbsp;<\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"csharp keyword\">var<\/code> <code class=\"csharp plain\">vehiculo2 = vehiculo1 with { Modelo = <\/code><code class=\"csharp string\">\"NSX\"<\/code> <code class=\"csharp plain\">};<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Existe un constructor por defecto que permite realizar una copia de todas las propiedades.<\/p>\n\n\n\n<div>\n<div id=\"highlighter_504849\" class=\"syntaxhighlighter  csharp\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"csharp keyword\">protected<\/code> <code class=\"csharp plain\">Vehiculo(Vehiculo original)<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">El comportamiento por defecto, cuando comparamos objetos&nbsp;que han sido modificados\/copiados puede llegar a la situaci\u00f3n en la que sean objectos diferentes pero el contenido sea el mismo, siguiendo con el ejemplo modificamos de nuevo la propiedad:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_993644\" class=\"syntaxhighlighter  csharp\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"csharp keyword\">var<\/code> <code class=\"csharp plain\">vehiculo3 = vehiculo2 with { Modelo = <\/code><code class=\"csharp string\">\"Civic\"<\/code> <code class=\"csharp plain\">};<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"csharp plain\">Equals(vehiculo3, vehiculo1); <\/code><code class=\"csharp comments\">\/\/ TRUE<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"csharp plain\">ReferenceEquals(vehiculo3, vehiculo1); <\/code><code class=\"csharp comments\">\/\/ FALSE<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos a a\u00f1adir herencia para acercarnos a escenarios reales:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_753467\" class=\"syntaxhighlighter  csharp\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"csharp keyword\">public<\/code> <code class=\"csharp plain\">data <\/code><code class=\"csharp keyword\">class<\/code> <code class=\"csharp plain\">Vehiculo { <\/code><code class=\"csharp keyword\">string<\/code> <code class=\"csharp plain\">Marca; <\/code><code class=\"csharp keyword\">string<\/code> <code class=\"csharp plain\">Modelo}<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"csharp keyword\">public<\/code> <code class=\"csharp plain\">data <\/code><code class=\"csharp keyword\">class<\/code> <code class=\"csharp plain\">Coche : Vehiculo { <\/code><code class=\"csharp keyword\">string<\/code> <code class=\"csharp plain\">Matricula}<\/code><\/div>\n<div class=\"line number3 index2 alt2\">&nbsp;<\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"csharp plain\">Vehiculo v1 = <\/code><code class=\"csharp keyword\">new<\/code> <code class=\"csharp plain\">Vehiculo {Marca = <\/code><code class=\"csharp string\">\"Honda, Modelo = \"<\/code><code class=\"csharp plain\">Civic\"}<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"csharp plain\">Vehiculo v2 = <\/code><code class=\"csharp keyword\">new<\/code> <code class=\"csharp plain\">Coche {Marca = <\/code><code class=\"csharp string\">\"Honda, Modelo = \"<\/code><code class=\"csharp plain\">Civic<\/code><code class=\"csharp string\">\", Matricual = \"<\/code><code class=\"csharp plain\">0000LGS\"}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">En este caso, si comparamos v<em>1<\/em> con <em>v2<\/em>&nbsp;\u00bfser\u00e1n iguales? C# utiliza una propiedad virtual protegida llamada \u00ab<em>EqualityContract<\/em>\u00ab, cada registro derivado lo anula por lo que para poder comprar los dos objetos deben tener el mismo \u00ab<em>EqualityContract<\/em>\u00ab<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/blog\/wp-content\/uploads\/\/2020\/csharp_logo.png\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Basado en las notas de <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/author\/madstmicrosoft-com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Mads Togersen<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Desde el a\u00f1o 2000 han sido muchas las modificaciones y mejoras en el lenguaje, a veces cuesta acostumbrarse a estas nuevas funcionalidades, veamos que nos depara 20 a\u00f1os despu\u00e9s: Es posible declarar el valor de propiedades en el momento de creaci\u00f3n de un objeto, no es posible modificar a posteriori estos valores. 1 2 3 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[67,66,68,70,69],"class_list":["post-28","post","type-post","status-publish","format-standard","hentry","category-visual-studio","tag-c","tag-csharp","tag-datos","tag-novedades","tag-propiedades"],"_links":{"self":[{"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/posts\/28","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/comments?post=28"}],"version-history":[{"count":0,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/posts\/28\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/media?parent=28"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/categories?post=28"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/tags?post=28"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}