¿Estoy usando JScript o lo interpreto con C#?

Iniciado por DeMoNcRaZy, 10 Octubre 2015, 23:44 PM

0 Miembros y 1 Visitante están viendo este tema.

DeMoNcRaZy

Buenas,

Estoy intentando realizar como una calculadora de windows... osea que todo lo hace en un textBox... he estado investigando y tal... y encontré esto:

Código (csharp) [Seleccionar]
private string EvalExpression(string expression)
        {
            VsaEngine engine = VsaEngine.CreateEngine();
            try
            {
                object o = Eval.JScriptEvaluate(expression, engine);
                return System.Convert.ToDouble(o).ToString();
            }
            catch
            {
                return "No se puede evaluar la expresión";
            }
            engine.Close();
        }


Código (csharp) [Seleccionar]
using Microsoft.JScript;
using Microsoft.JScript.Vsa;


Todo funciona según lo previsto.
¿Pero estoy trabajando con JScript? ¿O mantengo la forma de C#?

Es que estoy un poco confuso... si es JScript.. ¿se puede realizar en C#?

Cualquier información adicional lo agradecería.

Saludos.
Esta página web no está disponible - Google Chrome

Eleкtro

#1
Cita de: YuseTist en 10 Octubre 2015, 23:44 PM
encontré esto:

¿Pero estoy trabajando con JScript? ¿O mantengo la forma de C#?

Todo ese código está escrito en C#, pero el método Eval.JScriptEvaluate llama al intérprete JScript de Microsoft para evaluar código de JScript/javascript (es exactamente el mismo lenguaje), ya sea evaluar una expresión aritmética o no.

Esas classes de Microsoft.JScript quedaron obsoletas desde hace más de una década, deberías evitar su utilización, pues empezariamos muy mal si desarrollasemos una aplicación como una calculadora (la cual implica una mínima eficiencia posible) usando miembros deprecados, por muy buenos resultados que te de al evaluar... por algún buen motivo habrá quedado deprecada esa metodología.




Cita de: YuseTist en 10 Octubre 2015, 23:44 PMsi es JScript.. ¿se puede realizar en C#?

Si, puedes evaluar expresiones aritméticas en puro código administrado de C#/VB.Net.

Una manera sería compilando la expressión para devolver la respuesta, para ello puedes utilizar los proveedores de código de VB.Net o C (lee acerca de las classes VBCodeProvider o CSharpCodeProvider y CodeDomProvider), pero hacerlo implicaría fugas de memoria inevitables, ya que por cada evaluación realizada se generaría un ensamblado .Net que jamás serían liberados hasta finalizar la aplicación, así que no te lo recomiendo.

La otra forma sería demasiado tediosa o compleja, hablamos de desarrollar tu propio evaluador de expresiones, idear los algoritmos para tokenizar la expresión, hacer los cálculos, llevar los controles de errores, etc. No vale la pena trabajar en algo así cuando ya existen librerías open-source para .Net que han estado optimizando esa tarea durante años.

Te recomiendo la librería NCalc:
NCalc - Mathematical Expressions Evaluator for .NET - CodePlex

La página está plagado de ejemplos en C#, así que mostraré uno en VB.Net:

Código (vbnet) [Seleccionar]
Dim exp As String = "(1 + (2 - 2)) * (100 / 2.5)" ' = 40
Dim calc As New NCalc.Expression(exp)
Dim result As Decimal

If Not calc.HasErrors() Then
   result = CDec(calc.Evaluate())
Else
   MessageBox.Show(calc.Error)
End If


De todas formas, si por algún motivo quieres reinventar la rueda o hacer tu propia implementación personalizada, aquí te muestro dos buenos ejemplos...

Este código fuente parece estar muy bien, está orientado a la evaluación de expresiones aritméticas, y las expresiones soportan el uso de las funciones de la class System.Math (abc, exp, floor, round, pow, etc...) :
A C# Expression Evaluator - Black Belt Coder

Este código fuente está orientado a la evaluación de expresiones de varios tipos, incluyendo expresiones aritméticas claro está:
The expression evaluator revisited (Eval function in 100% managed .NET) - CodeProject
( debe ser un poco lento al evaluar objetos, por el uso de Reflection )

Saludos