Khi nào thì thích hợp để sử dụng các thành viên thân thể biểu hiện? [đóng cửa]


24

C # 6 giới thiệu các thành viên thân biểu thức, cho phép mã đơn giản hóa trong các phương thức và thuộc tính chỉ trả về kết quả của biểu thức:

public override string ToString()
{
     return string.Format("{0} {1}", _field1, _field2);
}

trở thành:

public override string ToString() =>
    string.Format("{0} {1}", _field1, _field2);

Vì hiện tại chúng tôi có hai cú pháp chính xác và tương đương chính xác, một số quy tắc ngón tay cái phải được sử dụng để quyết định sử dụng. Khi nào thì sự thay thế mới phù hợp?


7
Umm, khi cơ thể của thành viên là một biểu hiện?
Jörg W Mittag

1
Điều đó sẽ trả lời câu hỏi "khi nào có thể sử dụng các thành viên thân thể biểu hiện".
Asik

7
Không hoàn toàn liên quan, nhưng bạn không thể sử dụng public override string ToString() => $"{_field1} {_field2}";?
Thaoden

3
@JorgWMittag Tôi muốn thêm "... không có tác dụng phụ" vào đó. Khai báo một phương thức theo kiểu chức năng khi nó không hoàn toàn là chức năng sẽ gây hiểu nhầm.
Jules

Câu trả lời:


12

Các ngôn ngữ lập trình hàm chỉ bao gồm các biểu thức, vì vậy hầu hết đã có một tính năng như thế này ngay từ đầu. Bạn sử dụng nó khi bạn có một biểu thức tương đối ngắn, thường xuyên lặp đi lặp lại, có thể được thay thế bằng một tên thậm chí ngắn hơn, có ý nghĩa hơn nhiều.

Một ví dụ phổ biến sẽ là các vị từ được sử dụng ở nơi khác, như:

public static bool isOdd(int num) => (num % 2) == 1;

Nếu biểu thức quá dài, tốt hơn là chia nó thành các hàm riêng biệt hoặc có thể là một hàm với kết quả trung gian được đặt tên. Nếu nó ngắn, nhưng bạn không thể nghĩ ra một cái tên hay, tốt hơn hết là bạn chỉ sao chép biểu thức thay vì tạo ra một cái tên khủng khiếp như thế nào condition1đó.


21

Từ C # /. NET Những điều kỳ diệu nhỏ: Các thành viên thể hiện trong C # 6 :

Vì vậy, bạn nên sử dụng này? Tất cả đều đến với phong cách. Ruột của tôi sẽ giới hạn điều này với những biểu hiện và phát biểu đơn giản có thể hiểu rõ ràng ngay từ cái nhìn đầu tiên.

(nhấn mạnh, của tôi; xem Cập nhật 1 bên dưới)

Thông tin thêm từ Tóm tắt của bài viết trên:

Vì vậy, C # 6 hiện cung cấp cho chúng ta khả năng chỉ định các phần thân phương thức và thuộc tính chỉ có các biểu thức. Điều này có thể giúp giảm gánh nặng cú pháp của các phương thức rất đơn giản để làm cho mã của bạn ngắn gọn hơn.

Tuy nhiên, với tất cả mọi thứ, hãy sử dụng phán đoán của bạn về việc nó có phù hợp với bất kỳ tình huống nào không. Khi một biểu thức rất dài hoặc phức tạp, sử dụng cú pháp toàn thân vẫn có thể dễ đọc hơn.

Và một trích dẫn khác về hiệu suất, bởi vì các vấn đề về hiệu suất cũng có thể giải quyết khi sử dụng một tính năng ngôn ngữ nhất định:

Bây giờ, bạn có thể hỏi, điều này có bất kỳ ý nghĩa hiệu suất trong thời gian chạy không? Thật ra, câu trả lời là không . Đây chỉ đơn giản là đường cú pháp mở rộng vào cùng IL khi viết toàn bộ cơ thể. Nó không tạo ra một đại biểu, nó chỉ đơn giản là mượn cú pháp biểu thức lambda để đơn giản hóa việc viết các phần thân đơn giản dẫn đến một biểu thức.

(nhấn mạnh, tác giả)

Cập nhật 1: @ JörgWMittag cho biết

Điều này không có ý nghĩa. "giới hạn điều này với các biểu thức và câu lệnh đơn giản"? Huh? Nó thậm chí không hoạt động với các câu lệnh, chỉ với các biểu thức!

Nó xuất hiện các tác giả ban đầu có thể đã sai chính tả. Để làm rõ, từ C # 6.0 mới và được cải tiến :

Các hàm thân biểu thức là một đơn giản hóa cú pháp khác trong C # 6.0. Đây là các chức năng không có cơ quan tuyên bố. Thay vào đó, bạn thực hiện chúng với một biểu thức theo sau khai báo hàm.

Để rõ ràng, điều này không làm cho một phương thức hoặc thuộc tính một Biểu thức . Nó sử dụng cú pháp Biểu thức để giảm các dòng mã (và số lượng dấu ngoặc nhọn).

Đề xuất ban đầu của tôi vẫn đứng vững: Sử dụng nó khi nó làm cho mã của bạn rõ ràng và dễ hiểu hơn, không chỉ đơn giản vì bạn có thể sử dụng nó.


2
Điều này không có ý nghĩa. "giới hạn điều này với các biểu thức và câu lệnh đơn giản "? Huh? Nó thậm chí không hoạt động với các câu lệnh, chỉ với các biểu thức! Tôi cũng không tin rằng việc thêm lộn xộn (hai dấu ngoặc đơn và returntừ khóa) có thể dẫn đến dễ đọc hơn. Rốt cuộc, biểu thức phức tạp vẫn là cùng một biểu thức phức tạp, chỉ bị chôn vùi trong sự lộn xộn cú pháp.
Jörg W Mittag

3
Từ những gì tôi đã đọc thành viên thân thể biểu hiện không thực sự là biểu thức. Chúng là đường cú pháp. Trừ khi thông số C # đã thay đổi kể từ khi bài đăng trên blog, nó không hỗ trợ các phương thức với các kiểu trả về void.
Greg Burghardt

1
Tôi có thể sai, nhưng tôi tin rằng tác dụng phụ không được phép trong Tuyên bố biểu hiện. Vì vậy, với tôi, lợi ích của các tuyên bố biểu hiện là bạn đang nói với người đọc rằng "biểu thức" này là thuần túy và không có tác dụng phụ nào mà bạn, người đọc cần tìm kiếm.
Giăng

1
@ John "không được phép" là hoàn toàn sai. Bạn có thể thực hiện tất cả các shenanigans như tạo một hành động, bên trong khai báo hành động đặt các biến thành viên và sau đó gọi hành động. Do đó, tác dụng phụ rõ ràng là không được phép. Tôi chắc chắn sẽ làm họ nản lòng, họ bỏ lỡ điểm của cú pháp biểu thức.
Mafii

@Mafii. Cảm ơn. Tôi đã học được rằng bạn có thể thực hiện "tuyên bố biểu thức", được mô tả là "hiện đại". Đối với tôi, tuy nhiên, ý tưởng rất khó hiểu.
Giăng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.