Việc thiếu một toán tử hàm mũ cho C # là một sự phiền toái lớn đối với chúng tôi khi tìm kiếm một ngôn ngữ mới để chuyển đổi phần mềm tính toán của chúng tôi từ ol 'vb6 tốt.
Tôi rất vui vì chúng tôi đã đi với C # nhưng nó vẫn làm tôi khó chịu mỗi khi tôi viết một phương trình phức tạp bao gồm số mũ. Phương thức Math.Pow () làm cho các phương trình khá khó đọc IMO.
Giải pháp của chúng tôi là tạo ra một lớp DoubleX đặc biệt nơi chúng tôi ghi đè ^ -operator (xem bên dưới)
Điều này hoạt động khá tốt miễn là bạn khai báo ít nhất một trong các biến là DoubleX:
DoubleX a = 2;
DoubleX b = 3;
Console.WriteLine($"a = {a}, b = {b}, a^b = {a ^ b}");
hoặc sử dụng một trình chuyển đổi rõ ràng trên đôi tiêu chuẩn:
double c = 2;
double d = 3;
Console.WriteLine($"c = {c}, d = {d}, c^d = {c ^ (DoubleX)d}"); // Need explicit converter
Một vấn đề với phương pháp này là số mũ được tính theo thứ tự sai so với các toán tử khác. Điều này có thể tránh được bằng cách luôn đặt thêm () xung quanh thao tác, điều này khiến cho việc đọc các phương trình khó hơn một chút:
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
Tôi hy vọng điều này có thể giúp ích cho những người khác sử dụng nhiều phương trình phức tạp trong mã của họ và có lẽ ai đó thậm chí còn có ý tưởng về cách cải thiện phương pháp này?! :-)
Lớp DoubleX:
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 --------------
}
}
**
làm toán tử lũy thừa infix.