Có thể chỉ định toán tử R
trong đó R
có thể là toán tử số học, quan hệ hoặc logic không?chỉ định theo lập trình toán tử
Ví dụ một hàm tính
c = a R b
nơi tôi có thể xác định xem R
là +, -, *, /
này có thể được thực hiện trong C#?
Có thể chỉ định toán tử R
trong đó R
có thể là toán tử số học, quan hệ hoặc logic không?chỉ định theo lập trình toán tử
Ví dụ một hàm tính
c = a R b
nơi tôi có thể xác định xem R
là +, -, *, /
này có thể được thực hiện trong C#?
Một binary operator là bất kỳ chức năng mà chấp nhận hai toán hạng. Thật đơn giản để trừu tượng hóa chức năng này bằng cách sử dụng delegates, về cơ bản là hàm bao quanh các phương thức (hàm).
Để làm rõ ràng này, chúng ta có thể xác định một phương pháp chung chung mà không làm gì hơn là gọi các đại biểu sử dụng các thông số chỉ định, và trả về kết quả của nó:
public Tout GetResult<TIn, TOut>(TIn a, TIn b, Func<TIn, TIn, TOut> @operator)
{
return @operator(a, b);
}
Và bạn có thể sử dụng nó để vượt qua bất kỳ sự kết hợp của các thông số và các nhà khai thác:
private bool AreEqual(int a, int b)
{
return a.Equals(b);
}
private int Subtract(int a, int b)
{
return a - b;
}
sau đó bạn có thể sử dụng cùng một phương pháp tổng quát để làm bất cứ điều gì bạn muốn hoạt động:
// use the "AreEqual" operator
bool equal = GetResult(10, 10, AreEqual);
// use the "Subtract" operator
int difference = GetResult(10, 10, Subtract);
Sử dụng biểu thức lambda, thậm chí bạn có thể tạo các nhà điều hành "on the fly", bằng cách xác định nó như là một phương pháp vô danh:
// define a "Product" operator as an anonymous method
int product = GetResult(10, 10, (a,b) => a*b);
Có thể có hành quá tải trong C#, kiểm tra một số MSDN
http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx
Nó không giống như OP muốn thay đổi chức năng của một nhà điều hành nhất định - nó giống như, được hai toán hạng, họ muốn chọn hoạt động trong thời gian chạy. –
anh ta yêu cầu chỉ định toán tử, không quá tải hành vi của nó trong một lớp/struct – Jimmy
Tôi nghĩ đây là một câu trả lời hay; nó có thể được sử dụng để có được chức năng mong muốn. –
Bạn có thể làm một cái gì đó rất gần với rằng việc sử dụng lambda:
Func<int, int, int> op = (x, y) => x + y; // or any other operator
Và sau đó sử dụng nó giống như bất kỳ đại biểu khác:
int result = op(1, 2);
Nếu loại được đề cập là người dùng xác định với các toán tử bị quá tải, bạn có thể sử dụng sự phản chiếu, nhưng tôi e rằng không thể cho các kiểu như int
.
Check-out Trees Biểu - http://msdn.microsoft.com/en-us/library/bb397951.aspx
Vâng, đó là có thể, nhưng cách nhất-chung để làm như vậy có nghĩa là học tập về [Cây biểu hiện] (http://msdn.microsoft.com/en-us/library/bb397951.aspx). :) Nhà khai thác sẽ được sử dụng như thế nào? –
chính xác sao chép http://stackoverflow.com/questions/1528319/operators-as-method-parameters-in-c – mcabral