Bạn có cần sử dụng từ khóa “mới” trong Dart không?


94

Trong ứng dụng dựa trên Dart của mình, tôi chỉ nhận thấy rằng tôi có thể bỏ qua newtừ khóa và mọi thứ hoạt động hoàn toàn tốt.

Thay vì final widget = new Widget();tôi cũng có thể sử dụng final widget = Widget();.

Điều này có ảnh hưởng gì trong mã không?

Câu trả lời:


119

Không nó không. Với Dart 2 (bấm vào để xem thông báo với nhiều thông tin hơn) các từ khóa newvà cả constcác từ khóa cũng được làm tùy chọn .

Điều này có nghĩa là nó new Widget()hoạt động tương tự như Widget()trên chính nó.


Các consttừ khóa có thể, tuy nhiên, thay đổi một giá trị đó sẽ không phải là một constngầm để một const.
Vì vậy, bạn sẽ phải chỉ định rõ ràng constkhi cần thiết.


6
Nhóm nghiên cứu Dart đã phải rút lại một chút cho bây giờ và có một số tình huống mà newhay constvẫn được yêu cầu (tôi không nhớ ví dụ hay quy tắc). Họ có thể thực hiện một nỗ lực khác sau Dart 2 để biến nó thành tùy chọn ở mọi nơi.
Günter Zöchbauer

1
Không có nơi nào newđược yêu cầu. Nếu bạn bỏ qua newmột chương trình đúng, chương trình đó sẽ luôn hoạt động như cũ. Nếu bạn xóa constkhỏi một chương trình đang làm việc, thì trong hầu hết các trường hợp bạn phải viết constđể chương trình có hiệu lực, nó vẫn có giá trị. Bất kỳ lúc nào đã có một constbiểu thức xung quanh, bạn có thể bỏ qua const lồng nhau.
lrn

20

Trong Dart 2, nếu bạn gọi một phương thức khởi tạo như một hàm, không có dấu newhoặc constở phía trước, thì nó tương đương với việc sử dụng new. Nếu bạn muốn một lệnh gọi const, thì bạn nên đặt constở phía trước.

Bên trong một biểu thức const, bạn không cần phải viết constlại và trong một số ngữ cảnh yêu cầu biểu thức const (như biểu thức trường hợp chuyển đổi và bộ khởi tạo của biến const), bạn thậm chí không cần const bên ngoài.

Vì vậy, bạn không bao giờ cần phải viết new.

Nhóm ngôn ngữ Dart muốn cho phép các biểu thức mà bạn có thể chèn một trong hai newhoặc constmà vẫn có lời gọi chính xác (nghĩa là, một hàm tạo const với các đối số không đổi) được mặc định để chèn constthay vì new, hy vọng trong bản cập nhật sớm cho Dart 2. Vì lý do đó , Tôi khuyên bạn nên viết newnó trước Object()hoặc bất kỳ hàm tạo const nào khác mà bạn cần đối tượng là một thể hiện mới. Đó là một trường hợp rất hiếm, thường là bạn không quan tâm đến danh tính của đối tượng bất biến của mình (đó là lý do tại sao việc chèn constđược coi là một ý tưởng hay).



5

Các newtừ khóa được đưa ra tùy chọn trong Dart 2. Tính đến bây giờ, gọi một lớp sẽ luôn luôn trả về một thể hiện mới của lớp đó. Theo khuyến nghị của tôi, bạn có thể sử dụng nó ( KHÔNG PHẢI MANDATORY ) bên ngoài định nghĩa Bố cục, nhưng bỏ qua trong Bố cục.

Một điểm nữa mà tôi muốn chia sẻ với các bạn là nếu bạn sử dụng newhoặc consttừ khóa trong khi khai báo widget , bạn cũng có thể nhìn thấy biểu tượng + mà bạn có thể sử dụng để thu gọn và mở rộng mã nội dung widget. Điều này hữu ích khi bạn muốn thu gọn / ẩn mã tiện ích còn lại trong tệp phi tiêu trong khi làm việc trên một mã tiện ích khác trong cùng tệp.



2
Hành vi thu gọn sẽ dành riêng cho IDE. Bạn nên trình bày rõ ràng nó áp dụng cho (những) cái nào.
jamesdlin

1
Ngoài ra, "gọi một lớp" (theo tôi giả sử bạn muốn nói là "gọi phương thức khởi tạo của một lớp") không phải lúc nào cũng trả về một thể hiện mới của lớp. Nếu bạn gọi một phương thức khởi tạo nhà máy , bạn có thể lấy lại một phiên bản hiện có . Đây là lý do tại sao newkhông được khuyến khích: sử dụng nó có vẻ như nó tạo ra một thể hiện mới một cách vô điều kiện trong khi nó có thể không.
jamesdlin
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.