2011-05-09 31 views
11

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+, -, *, /

này có thể được thực hiện trong C#?

+0

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? –

+2

chính xác sao chép http://stackoverflow.com/questions/1528319/operators-as-method-parameters-in-c – mcabral

Trả lời

7

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); 
-3

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

+5

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. –

+0

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

+0

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. –

2

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.

Các vấn đề liên quan