C # için üstel bir işleç olmaması, hesaplama yazılımımızı iyi ol 'vb6'dan dönüştürmek için yeni bir dil ararken bizim için büyük bir sıkıntıydı.
C # ile gittik sevindim ama üsleri içeren karmaşık bir denklem yazarken hala beni rahatsız ediyor. Math.Pow () yöntemi, denklemlerin IMO'yu okumasını oldukça zorlaştırır.
Çözümümüz, ^ -operator'ı geçersiz kıldığımız özel bir DoubleX sınıfı oluşturmaktı (aşağıya bakın)
Bu, değişkenlerden en az birini DoubleX olarak beyan ettiğiniz sürece oldukça iyi çalışır:
DoubleX a = 2;
DoubleX b = 3;
Console.WriteLine($"a = {a}, b = {b}, a^b = {a ^ b}");
veya standart çiftlerde açık bir dönüştürücü kullanın:
double c = 2;
double d = 3;
Console.WriteLine($"c = {c}, d = {d}, c^d = {c ^ (DoubleX)d}"); // Need explicit converter
Bu yöntemle ilgili bir problem, üssün diğer operatörlere göre yanlış sırada hesaplanmasıdır. Bu, işlemin etrafına her zaman bir denklemin okunmasını biraz daha zorlaştıran bir extra () koyarak önlenebilir:
DoubleX a = 2;
DoubleX b = 3;
Console.WriteLine($"a = {a}, b = {b}, 3+a^b = {3 + a ^ b}"); // Wrong result
Console.WriteLine($"a = {a}, b = {b}, 3+a^b = {3 + (a ^ b)}"); // Correct result
Umarım bu, kodlarında çok sayıda karmaşık denklem kullanan başkalarına yardımcı olabilir ve belki de birinin bu yöntemi nasıl geliştireceği hakkında bir fikri vardır ?! :-)
DoubleX sınıfı:
using System;
namespace ExponentialOperator
{
/// <summary>
/// Double class that uses ^ as exponential operator
/// </summary>
public class DoubleX
{
#region ---------------- Fields ----------------
private readonly double _value;
#endregion ------------- Fields ----------------
#region -------------- Properties --------------
public double Value
{
get { return _value; }
}
#endregion ----------- Properties --------------
#region ------------- Constructors -------------
public DoubleX(double value)
{
_value = value;
}
public DoubleX(int value)
{
_value = Convert.ToDouble(value);
}
#endregion ---------- Constructors -------------
#region --------------- Methods ----------------
public override string ToString()
{
return _value.ToString();
}
#endregion ------------ Methods ----------------
#region -------------- Operators ---------------
// Change the ^ operator to be used for exponents.
public static DoubleX operator ^(DoubleX value, DoubleX exponent)
{
return Math.Pow(value, exponent);
}
public static DoubleX operator ^(DoubleX value, double exponent)
{
return Math.Pow(value, exponent);
}
public static DoubleX operator ^(double value, DoubleX exponent)
{
return Math.Pow(value, exponent);
}
public static DoubleX operator ^(DoubleX value, int exponent)
{
return Math.Pow(value, exponent);
}
#endregion ----------- Operators ---------------
#region -------------- Converters --------------
// Allow implicit convertion
public static implicit operator DoubleX(double value)
{
return new DoubleX(value);
}
public static implicit operator DoubleX(int value)
{
return new DoubleX(value);
}
public static implicit operator Double(DoubleX value)
{
return value._value;
}
#endregion ----------- Converters --------------
}
}
**
infix üs alma işleci olarak kullanılıyor.