2011-01-05 35 views
6

Lý do tôi hỏi là, nó chỉ hợp lệ trong khai báo tham số phương thức, phải không? Tôi đã cố gắng để tạo ra một biến bên trong cơ thể chức năng gọi là "params", nhưng tất nhiên đây không phải là một vấn đề lớn, chỉ cần tự hỏi lý do MS chọn để làm cho nó một từ khóa toàn cầu và không theo ngữ cảnh.Tại sao từ khóa params không theo ngữ cảnh?

+3

Không chắc chắn về lý do tại sao một phần, nhưng nếu bạn thực sự muốn sử dụng điều này như một tên biến trong C# lời nói đầu tên biến với @: int @params = 1; – Derrick

Trả lời

5

câu trả lời tvanoffson của phỏng đoán rằng nó sẽ rất khó để làm cho "params" theo ngữ cảnh. Nó thực sự sẽ không phải là khó khăn. Hãy xem xét:

void M(params x) 

Điều chúng tôi làm trong trường hợp này, theo giả thuyết, trước tiên tìm cách loại 'thông số'. Nếu chúng ta có thể tìm thấy một, tuyệt vời, chúng ta đã xong. Nếu chúng ta không thể, thì chúng ta có một chút rắc rối. giả sử ví dụ thay vì x là

void M(params Int32) 

Rõ ràng đó là lỗi, nhưng lỗi gì? Chúng ta có nên giả định rằng Int32 là tên tham số và đưa ra lỗi "bạn đang thiếu kiểu"? Chúng ta có nên giả định rằng Int32 là loại và đưa ra một lỗi nói rằng loại phải là một loại mảng, và rằng bạn đang thiếu định danh? Chúng ta có nên đưa ra một lỗi nói rằng không có loại có tên 'params'? Điều phải làm ở đây là gì? Rõ ràng chúng ta có thể tìm ra điều gì đó nhưng không rõ ràng.

Đó là các trường hợp lỗi mà là khó khăn với các từ khóa theo ngữ cảnh; nhận được các trường hợp thành công làm việc thực sự là khá đơn giản.

Nhưng thực sự, nó không phải là quá nhiều mà nó là cứng để làm cho bối cảnh như làm cho nó theo ngữ cảnh không phải là một chiến thắng thực sự lớn. Việc đặt bối cảnh "set" và "value" là một thắng lợi lớn bởi vì chúng tôi giả định rằng tất cả mọi người sẽ muốn tạo các biến cục bộ với các tên như "set" và "value". "params" thậm chí không phải là một từ tiếng Anh, do đó, có vẻ như ít có khả năng ai đó sẽ muốn sử dụng nó. Không có lợi ích lớn để làm cho nó theo ngữ cảnh, do đó, chi phí của tính năng này là không hợp lý.

+0

Cảm ơn Eric. Tôi đã thực sự hy vọng để đọc những gì bạn đã có trong tâm trí. Đối với tôi, có vẻ như các trường hợp hợp lệ sẽ là 1. Có loại params nào không? 2. Nếu không, thì phải có một loại ở dạng Type [], và theo sau là một số nhận dạng. Tôi không phải là một chuyên gia như bạn, nhưng bạn có nghĩ rằng điều này bao gồm tất cả các trường hợp? Ngoài ra bạn là đúng, nó không phải là một từ tiếng Anh, chỉ nghĩ rằng nó sẽ hữu ích trong một số mã, thay vì viết tham số/(s). –

2

Các params từ khóa không tìm đến được chỉ hữu ích trong việc khai thông số phương pháp, nhưng tôi thực sự đồng ý với MS rằng nó sẽ không phải là một ý tưởng tốt để cho các từ khóa được sử dụng cho các tên instance, anyway.

Có lẽ họ đang đặt khả năng có một cái gì đó như thế này trong C# 8.0:

params Customers = DB.GetCustomerList(); 

Hoặc nếu không cho phép params trong một phạm vi địa phương là tốt.

+0

Nhưng điều đó sẽ làm gì? Để tôi sử dụng nó trong phạm vi địa phương mà bạn cho thấy sẽ không có ý nghĩa nhiều, phải không? Tôi không chắc. Btw khi nào C# 8.0 sắp ra mắt? : O –

+1

tôi nghĩ rằng khoảng 2017 nếu quả cầu pha lê của tôi là chính xác. –

+1

Joan - Câu hỏi hay. Tôi không biết nó sẽ làm gì. Trong thực tế, tôi thậm chí không nghĩ rằng dòng mã sẽ biên dịch trong C# 8.0 do lỗi cú pháp. – Flipster

9

Điều tương tự cũng được hỏi về bất kỳ từ khoá khác. Ví dụ, tại sao không phải là "class" theo ngữ cảnh vì nó chỉ được sử dụng trong các khai báo lớp?

Đối với tôi một từ khóa là một từ khóa. Tôi tưởng tượng nó đơn giản hóa rất nhiều phần phân tích từ vựng của trình biên dịch để không phải là nhận thức ngữ cảnh đó.

Là một sang một bên, bạn có thể sử dụng các biểu tượng @ để cho phép bạn khai báo một biến gọi là 'params' (hoặc bất kỳ từ khoá reserved khác):

var @params = new int[] { 1, 2 }; 
+0

Cảm ơn nhưng nếu lớp học theo ngữ cảnh thì làm cách nào để tách biệt cách sử dụng lớp lồng nhau? Nhưng với params, không có nơi nào khác để sử dụng nó, và có vẻ như nó sẽ dễ dàng để phân biệt chúng, nhưng tôi không phải là một trình biên dịch maestro như Eric Lippert. –

+0

Tôi nghĩ bạn có thể cố gắng làm cho ngữ cảnh 'lớp' bằng cách tìm cú pháp khai báo lớp điển hình: [class modifier] class [class name] {}. Nhưng tôi không lên trên trình biên dịch spec đủ để biết nếu điều này là thực sự khả thi. –

+0

Ok có ý nghĩa. –

4

Eric Lippert có một bài đăng blog bao gồm contextual and reserved keywords và họ lịch sử. Mặc dù nó không giải thích rõ ràng lý do tại sao params nằm trong danh sách dành riêng (nó đã được kể từ 1.0), nó ngụ ý rằng nó thuộc về tập các từ dành riêng đó sẽ là cứng để làm theo ngữ cảnh.

+0

Cảm ơn, đó là những từ dành riêng cho? Tôi nghĩ rằng nó có nghĩa là nó dành riêng cho sử dụng tiềm năng mới trong tương lai? –

+2

@Janan - một số có thể, nhưng hầu hết là * được bảo lưu * như trong "chỉ dành riêng cho mục đích này". – tvanfosson

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