ventajas tutorial solo sharp programacion llamada lenguaje las incremento expresiones ejemplos desventajas descargar caracteristicas asignacion c# .net resharper

tutorial - lenguaje de programacion c# ventajas y desventajas



¿Cuál es la diferencia entre un nuevo Object() y un nuevo Object{} en expresiones en C# (2)

En C # sin procesar regular, la respuesta sería "nada". Sin embargo, cuando involucra árboles de expresión, hay una diferencia; como se puede ver here

using System; using System.Linq.Expressions; public class C<TSource, TDest> where TDest : new() { public Expression<Func<TSource, TDest>> Foo() => model => new TDest(); public Expression<Func<TSource, TDest>> Bar() => model => new TDest {}; }

compila como:

public Expression<Func<TSource, TDest>> Foo() { ParameterExpression parameterExpression = Expression.Parameter(typeof(TSource), "model"); Expression arg_2E_0 = Expression.New(typeof(TDest)); ParameterExpression[] expr_2A = new ParameterExpression[1]; expr_2A[0] = parameterExpression; return Expression.Lambda<Func<TSource, TDest>>(arg_2E_0, expr_2A); } public Expression<Func<TSource, TDest>> Bar() { ParameterExpression parameterExpression = Expression.Parameter(typeof(TSource), "model"); Expression arg_38_0 = Expression.MemberInit(Expression.New(typeof(TDest)), Array.Empty<MemberBinding>()); ParameterExpression[] expr_34 = new ParameterExpression[1]; expr_34[0] = parameterExpression; return Expression.Lambda<Func<TSource, TDest>>(arg_38_0, expr_34); }

Entonces, uno de ellos involucra un Expression.MemberInit (con un conjunto vacío de elementos de MemberBinding ) además de Expression.New . Esto puede alterar a cualquier proveedor de LINQ (o cualquier análisis de árbol de expresión similar) que no lo espere.

Tengo el siguiente fragmento de código:

Expression<Func<TSource, TDest>> expression = model => new TDest{}; // Result: {model => new TestModel(){}}

ReSharper refactoriza este fragmento con la configuración RedundantEmptyObjectOrCollectionInitializer :

Expression<Func<TSource, TDest>> expression2 = model => new TDest(); // Result: {model => new TestModel()}

Después de eso, mi código no funciona. ¿Qué influencia tienen las llaves en la inicialización?
Encontré ¿Cuál es la diferencia entre new object() y new {} en C #? en Stack Overflow, pero ambas instancias se ven iguales.

expression.GetType().ToString() es igual a expression2.GetType().ToString()

¿Cuál es la diferencia entre estas inicializaciones en los árboles de expresión ?:

var a = model => new TDest{}; var b = model => new TDest();


ReSharper le ofrece una mejor sugerencia sobre cómo crear una instancia de la clase TDest .

En teoría, no hay ninguna diferencia, ya que tanto el new TDest () como el new TDest {} le proporcionarán una instancia de TDest .

Sin embargo, cuando usa la expresión de inicialización, es porque desea establecer valores de propiedades públicas o campos en TDest .

class TDest { public string MyProperty { get; set; } }

Por lo tanto, puede inicializar la clase TDest estableciendo un valor en MyProperty . P.ej:

// Sample 1 new TDest { MyProperty = "This is the value of my property" }; // Sample 2 new TDest() { MyProperty = "This is the value of my property" };

En su caso, su clase tiene un constructor sin parámetros, por lo tanto, los signos de puntuación {, } u operadores () estarían bien.

Para escenarios simples donde tiene un constructor sin parámetros, puede usar solo la forma TDest() .

Pero si tuviera por ejemplo la clase de abajo.

class TDest { readonly ISomeInterface _someService; public string MyProperty { get; set; } public TDest(ISomeInterface someService) { _someService = someService; } }

Y deseaba inicializar MyProperty con algo en lugar de su valor de inicialización predeterminado (nulo, tipos de referencia), podría usar la inicialización completa del objeto. P.ej:

// Sample 3 new TDest(new MySomeServiceImplementation()) { MyProperty = "This is the value of my property" };

¡Ojalá ayude!

Para tener una mejor idea, eche un vistazo a los Inicializadores de objetos de C # .