tutorial sintaxis expressions expresiones español c# visual-studio debugging lambda

c# - expressions - lambda sintaxis



¿Por qué no es posible evaluar las lambdas en la ventana inmediata? (5)

Al escribir un lambda, el acto de capturar variables altera significativamente la construcción del código subyacente (mover variables a campos de clases generadas por compilador, que podrían muy fácilmente ser encadenados en contextos de cierre).

Ni siquiera considerando la complejidad general de hacer esto, tendría dos opciones:

  • capturar todos los valores variables como constantes; factible y bastante simple, pero fácilmente podría significar que el resultado de la ejecución en la ventana inmediata es muy diferente al resultado de la ejecución en el cuerpo principal (muy indeseable)
  • reescriba el código completo (por las razones descritas anteriormente) sobre la marcha (en una suposición, imposible)

Dada la opción entre "indeseable" e "imposible", supongo que simplemente optaron por no implementar una característica que sería intrínsecamente frágil y muy compleja de escribir.

¿Hay alguna razón en particular? ¿No es posible o simplemente no está implementado todavía? ¿Tal vez hay complementos de terceros que permitan evaluaciones lambda?

ACTUALIZAR:

He encontrado este proyecto en Codeplex Extended Inmediato Window . Parece que ha sido abandonado por algún tiempo, pero esto puede ser una prueba de un concepto. ¿Alguien sabe algún otro complemento de extensión de ventana inmediata? ¿Los que pueden ejecutarse para / foreach sentencias en C # por ejemplo?


Bueno, creo que es porque la ventana inmediata solo puede evaluar expresiones, o más bien solo puede hacer invocaciones y asignaciones. Para evaluar una expresión Lambda, se tendría que crear un cierre para esa lambda, verificarse y luego ejecutarse.

Creo que todo se reduce a que la ventana Inmediato es solo un evaluador y no un intérprete.

http://msdn.microsoft.com/en-us/library/f177hahy(VS.80).aspx

"La ventana Inmediato se usa en el momento del diseño para depurar y evaluar expresiones, ejecutar sentencias, imprimir valores de variables, etc. Le permite ingresar expresiones para que el lenguaje de desarrollo evalúe o ejecute durante la depuración".

Entonces, de hecho, su pregunta se reduce a por qué no puede definir funciones en la ventana inmediata (ya que las lambdas son funciones anónimas), y la respuesta es que simplemente no fue diseñada para eso.


Si aún necesita usar Visual Studio 2013, puede escribir un bucle o expresión lambda en la ventana inmediata utilizando también la ventana de la consola del administrador de paquetes. En mi caso, agregué una lista en la parte superior de la función:

private void RemoveRoleHierarchy() { #if DEBUG var departments = _unitOfWork.DepartmentRepository.GetAll().ToList(); var roleHierarchies = _unitOfWork.RoleHierarchyRepository.GetAll().ToList(); #endif try { //RoleHierarchy foreach (SchoolBo.RoleHierarchy item in _listSoRoleHierarchy.Where(r => r.BusinessKeyMatched == false)) _unitOfWork.RoleHierarchyRepository.Remove(item.Id); _unitOfWork.Save(); } catch (Exception e) { Debug.WriteLine(e.ToString()); throw; } }

Donde mi función GetAll () es:

private DbSet<T> _dbSet; public virtual IList<T> GetAll() { List<T> list; IQueryable<T> dbQuery = _dbSet; list = dbQuery .ToList<T>(); return list; }

Aquí seguí recibiendo el siguiente error, así que quería imprimir todos los elementos en los diversos repositorios:

InnerException {"The DELETE statement conflicted with the REFERENCE constraint /"FK_dbo.Department_dbo.RoleHierarchy_OranizationalRoleId/". The conflict occurred in database /"CC_Portal_SchoolObjectModel/", table /"dbo.Department/", column ''OranizationalRoleId''./r/nThe statement has been terminated."} System.Exception {System.Data.SqlClient.SqlException}

Luego, descubro cuántos registros hay en el repositorio del departamento ejecutando esto en la ventana inmediata:

_unitOfWork.DepartmentRepository.GetAll().ToList().Count

Que devolvió 243.

Por lo tanto, si ejecuta lo siguiente en la consola del administrador de paquetes, imprime todos los elementos:

PM> for($i = 0; $i -lt 243; $i++) { $a = $dte.Debugger.GetExpression("departments[$i].OrgagnizationalRoleId"); Write-Host $a.Value $i }

El autor de la idea se puede encontrar aquí: http://ogresoft.blogspot.ca/2013/06/how-to-write-loop-or-lambda-expression.html


Supongo que, debido a que es una evaluación perezosa, la ventana inmediata no puede saber de antemano qué valores deben tener las variables capturadas (cierre).


de Microsoft escribió un par de publicaciones de blog respondiendo a tu pregunta: parte 1 y parte 2 . Encontrarás las respuestas allí.