Việc thiếu toán tử hàm mũ cho C# là một sự khó chịu 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ừ vb6 tốt.
Tôi rất vui vì chúng tôi đã đi với C# nhưng nó vẫn làm phiền tôi bất cứ khi nào tôi đang viết một phương trình phức tạp bao gồm cả số mũ. Phương thức Math.Pow() làm cho 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 mà chúng tôi ghi đè^-operator (xem dưới đây)
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 như DoubleX:
DoubleX a = 2;
DoubleX b = 3;
Console.WriteLine($"a = {a}, b = {b}, a^b = {a^b}");
hoặc sử dụng một bộ 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 mặc dù được rằng số mũ được tính trong nhiều thập kỷ thứ tự sai màu đỏ cho các nhà khai thác khác. Điều này có thể tránh được bằng cách luôn đặt thêm() xung quanh các hoạt động mà một lần nữa làm cho nó một chút khó khăn hơn để đọc các phương trình:
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 đỡ để những người sử dụng rất nhiều các 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 --------------
}
}
Nó không phải trong C#, nhưng nhiều ngôn ngữ sử dụng '** 'như nhà điều hành ghi lũy thừa. –
đến đây bởi vì tôi đã miffed rằng 10^7 được lưu trữ trong một dài/Int64 đã cho tôi "13." Tôi đã thử 1E7, nhưng điều đó đã cho tôi một lỗi kiểu. Vì tôi đã không nhìn thấy một lỗi loại/lỗi cú pháp toán tử bất hợp pháp, tôi đã giả định 10^7 của tôi đã hoạt động ... – mpag