Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 31 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
31
Dung lượng
1,95 MB
Nội dung
Chương Một số tính quan trọng C# C# ngơn ngữ nhiều tính nhiều người lập trình chưa thơng thạo hết tính mà sách đề cập đến Trong chương mơ tả lại số tính hữu ích MVC mà người lập trình ứng dụng MVC cần biết thơng qua ví dụ đưa sách Nội dung gồm tổng quan ngắn gọn tính năng, người đọc muốn sâu vào ngơn ngữ C# LINQ tìm xem qua : For a complete guide to C#, Introducing Visual C#, để nghiên cứu sâu LINQ, tìm đọc Pro LINQ in C# Những ví dụ chi tiết NET hỗ trợ lập trình khơng đồng (asynchronous programming) , tìm đọc Pro net parallel Programming in C# Tất sách phát hành Apress Chuẩn bị Project cho ví dụ Để tiến hành mơ tả tính ngơn ngữ lập trình chương này, tạo project tên LanguageFeatures sử dụng template ASP.NET MVC Web application Chọn Emty project cho phần nội dung lúc đầu chọn mục MVC để dựng sẵn folders phần liên quan (Xem chương 2) Những tính ngơn ngữ vừa miêu tả không dành riêng cho MVC, VS 2013 Express cho Web khơng hỗ trợ tạo project viết console bạn nên tạo ứng dụng MVC muốn theo kịp ví dụ Chúng ta cần controller để diễn tả tính ngơn ngữ lập trình, chúng tạ tạo lớp HomeController.cs folder Controllers Các làm: nhấp chuột phải folder Controllers cửa sổ Solution explorer, chọn Add >Controller Trong phần pop-up menu, chọn MVC Controller-Emty phần Add Scafold menu , sau nhấn nút Add Đặt tên lớp HomeController hộp thoại Add Controller nhấn nút Add để tạo lớp Controller List 4-1 Chúng ta tạo action method đơn giản cho ví dụ, kết nhận Index action method thông điệp đơn giản Chú ý: Lớp HomeController không biên dịch thời điểm khai báo namespace LanguageFeatures.Models Namespace khơng tạo thêm lớp vào folder Models.Chúng ta làm việc ví dụ phần Để hiển thị kết action method Chúng ta chuột phải vào tên Index action method> chọn Add View tạo view đặt tên result (list 4-2)(Không quan trọng chọn option hộp thoại Add View thay nội dung ban đầu file với đoạn code list 4-2) Chúng ta thấy strongly typed view , model type kiểu String hầu hết phần Ví dụ sau khơng phải ví dụ phức tạp biểu diễn kết đoạn string đơn giản Thêm System.Net.Http Assembly Trong phần sau chương này, sử dụng ví dụ dựa vào System.Net.Http assembly Tính mặc định không thêm vào MVC Chọn Add Reference Visual Studio Project menu để mở cửa sổ Reference Manager Đảm bảo chọn section Assemblies danh sách bên trái sau nhấn chọn System.Net.Http (Hình 4-1) Sử dụng tính Automatically Implemented Properties Tính property C# cho phép người dùng triển khai phần liệu cách tách cách liệu đặt lấy (Listing 4-3) có chứa ví dụ lớp tên Product Chung ta thêm lớp vào folder Models project với tên gọi Product.cs Thuộc tính Name in đậm Câu lệnh get (hoặc gọi getter) thực liệu đọc câu lệnh set (hoặc gọi settle) thực giá trị điền vào cho thuộc tính (biến biện value thể cho giá trị điền vào) Một thuộc tính sử dụng lớp khác xem field Hình 4-4 cho thấy AutoProperty action method thêm vào lớp Homecontroller Chúng ta thấy giá trị thuộc tính đọc đặt giá trị field bình thường Sử dụng properties ưa chuộng so với fields thay đổi câu lệnh phần code get set mà không cần thay đổi lớp phụ thuộc thuộc tính Mẹo Chúng ta để ý ràng đặt đối số thứ hai vào View đối tượng (listing 4-4) Điều View method phần tham số cho phép chứa đối số dạng string khác so với phần tham số cho phép chuỗi đối tượng Để tránh gọi nhầm, khai báo tường minh tham số thứ hai Chúng ta đề cập đến phần tham số cho view Method chương 20 Chúng ta kiểm tra hiệu cách khởi động project hướng đến địa /Home/AutoProperty (nhắm đến AutoProperty action method phần để kiểm thử ví dụng chương này) Bởi chưa truyền chuỗi string vào từ action method đến view Đây kết dạng text, thay hình chụp Đây kết action method listing 4-4 Tất thuộc tính tốt đẹp, nhiên chúng trở nên khó khăn có class chứa nhiều thuộc tính, tất chúng đưa vào field, tạo nên file class rườm rà cách khơng cần thiết Ví dụ 4-5 cho thấy thêm số thuộc tính vào lớp Product file Product.cs Chúng ta muốn có mềm dẻo thuộc tính mà khơng cần cấp số nhân lượng getter setter Giải pháp tự động thực thao tác property, gọi automatic property Với tính tạo đoạn code cho sẵn thuộc tính mà khơng cần đặt lại đoạn code getter setter Hình 4-6 Chú ý không định nghĩa phần thân getter setter đặt cho thuộc tính Cả hai thuộc tính thược cho người dùng thông qua hệ thống biên dịch C# Sử dụng tính thuộc tính tự động khơng khác biệt so với việc viết gettter setter cho thuộc tính thông thương Đoạn code list 4-4 hoạt động mà không cần điều chỉnh Bằng cách sử dụng thuộc tính tự động, rút ngắn thời gian nhập code, tạo đoạn code dễ đọc đồng thời hỗ trợ tính mềm dẻo mà thuộc tính cung cấp Nếu lúc thay đổi cách vận hành thuộc tính, quay lại cách thiết lập thuộc tính truyền thống Như list 4-7, cần phải chỉnh sửa cần thay đổi cách thức thuộc tính Name thiết lập Chú ý: phải chỉnh getter lẫn setter để trả thuộc tính thơng thường C# không hỗ trợ việc trộn lẫn chế độ tự động nhập liệu thông thường getter setter thuộc tính Sử dụng Object Collection Initializers Một cơng việc buồn chán q trình lập trình cấu trúc đối tượng đưa vào giá trị cho thuộc tính List 4-8 miêu tả hành động thêm vào CreatProduct action method Home controller Chúng ta qua ba bước để tạo đối tượng Product tạo kết quả: tạo đối tượng, đặt giá trị tham số sau gọi đến View method để trả kết thơng qua view May mắn thay, sử dụng tính object initializer, cho phép tạo biểu diễn instance đối tượng Product bước đơn giản List 4-9 Trong dấu ({ }) sau lời gọi Product mẫu Initializer cho phép cung cấp giá trị vào thơng số phần q trình cấu trúc đối tượng Tính tương tự cho phép khởi tạo nội dung danh sách phần trình cấu trúc List 4-10 Đoạn code miệu tả cách cấu trúc khởi tạo dãy lớp từ thư viện collection Tính cú pháp hiệu Giúp cho C# trở nên thân thiện mà không gây thêm tác động hay đem lại lợi ích khác Sử dụng Extension Methods Extension Method thêm method vào class mà không sở hữu điều chỉnh trực tiếp cách thuận lợi.List 4-11 biểu diễn lớp ShoppingCart, thêm vào folder Models file tên ShoppingCart.cs thể đối tượng Product Đây lớp hoạt động gói danh sách đối tượng Product (Đây lớp đơn giản phục vụ cho ví vụ) Gỉa sử cần xác định tổng giá trị đối tượng Product lớp ShoppingCart khơng để chỉnh sửa lớp trực tiếp, đóng vai trò bên thứ không nắm giữ phần source code Chúng ta thêm extension method để thêm tính mà cần List 4-12 biểu diễn lớp MyExtensionMethods thêm vào folder Models file MyExtensionMethods.cs Keyword “this” đứng trước tham số TotalPrices đánh dấu extension method Tham số cho NET biết extension method áp dụng vào lớp ShoppingCart trường hợp Chúng ta tham khảo instance ShoppingCart mà extension method áp dụng để sử dụng tham số cartParam Method liệt kệ đối tượng Products ShoppingCart sau trả tống giá Product (dựa vào thuộc tính Product.Price) List 4-13 cho thấy cách thêm extension method action method tên UseExtension mà thêm trong Homecontroller Chúng ta tiến thêm bước, lọc đối tượng Product sử dụng tiêu chí đặt phần đại diện phải định nghĩa Func cho kiểu lọc muốn, ý tưởng hướng đến Một cách để giảm bớt dài dòng sử dụng lambda expression, định dạng xúc tích nhừng thể phần thân method đại diện Chúng ta dùng để định nghĩa đại diện action method: List 4-21 Phần lambda expression tô đậm Tham số biểu diễn mà không cần định nghĩa kiểu, nghĩa suy cách tự động Phần ký tự ‘=>’ hiểu nghĩa đến sau phần link đến tham số cho kết lambda expression Trong ví dụ này, tham số Product gọi prod trả kết kiểu bool, nghĩa trả kết true tham số Category prod Soccer Chúng ta xây dựng câu lệnh chặt chẽ cách bỏ hồn tồn từ khóa Func List 4-22 Trong ví dụ cung cấp lambda expression tham số cho hàm Filter Đây cách hay tự nhiên để thể cách lọc mà muốn áp dụng Chúng ta kết hợp nhiều lọc cách mở rộng kết lambda expression List 4-23 Khi thực hiện, chương trình kiểm tra xem đối tượng Product có thuộc tính Category Soccer có thuộc tính giá Price lớn 20 Một số mẫu cho Lambda expression Chúng ta không cần định nghĩa logic cho đại diện lambda expreesion, dễ dàng gọi đến method sau Nếu cần lambda expression cho đại diện có nhiều tham số, nhóm tham số vào dấu ngoặc : Và cuối cần hàm logic lambda expression cần nhiều câu lệnh, dùng dấu ({ }) hoàn tất với câu lệnh return Chúng ta không thiết sử dụng Lambda expression phần code nhiên chúng công cụ khéo léo xử lý hàm phức tạp cách tường minh dễ đọc Công cụ sử dụng xuyên suốt sách Sử dụng Automatic Type Interface Từ khóa var C# cho phép định nghĩa biến mà không cần định nghĩa kiểu biến cách rõ ràng List 4.24 Nhưng khơng có nghĩa biến myVariable khơng có kiểu, u cầu trình biên dịch suy từ phần code Chúng ta thấy câu lệnh, trình biên dịch cho phép thành phần lớp liên quan (trong trường hợp Product) gọi Sử dụng kiểu ẩn danh (Anoymous Types) Bằng cách kết hợp khởi tạo đối tượng kiểu suy ra, chó thể tạo kho liệu đối tượng mà không cần định nghĩa lớp kiến trúc tương ứng … Trong cí dụ này, myAnonType đối tượng có kiểu ẩn danh Điều khơng có nghĩa dạng dynamic định nghĩa JavaScript biến dynamic Điều mang nghĩa định nghĩa kiểu tạo cách tự động trình biên dịch Điều kiện kiểu mạnh áp dụng Ví dụ : Chúng ta get set thuộc tính định nghĩa phần khởi tạo Trình biên dịch C# sinh class dựa theo tên kiểu từ tham số phần khởi tạo Hai đối tượng có kiểu ẩn danh có tên thuộc tính kiểu thuộc tính giống tự động tạo thành class Có nghĩa tạo dãy các đối tượng có kiểu ẩn danh List 4-26 CreateAnonArray action method thêm vào lớp Home controller Chú ý dùng var để định nghĩa dãy biến Chúng ta phải làm chưa định nghĩa kiểu so với định nghĩa kiểu cho dãy thông thường Mặc dù chưa xác định lớp cho đối tượng này, liệt kê nội dung dãy đọc giá trị thuộc tính Name từ đối tượng Điều quan trọng khơng có tính tạo dãy đối tượng có kiểu ẩn danh tạo dãy khơng thể thao tác Chúng ta thấy kết cho chạy ví dụ điều hướng đến action method tương ứng Thực câu lệnh truy vấn tích hợp ngơn ngữ Tất tính đề cập sử dụng tốt LINQ LINQ phần tuyệt vời hấp dẫn thêm vào NET Nếu bạn chưa sử dụng LINQ, bạn bỏ lỡ nhìêu thứ LINQ truy vấn liệu có cấu trúc giống với SQL Tưởng tượng có nhóm đối tượng Product muốn tìm ba sản phẩm với giá cao truyền đến View method Nếu không sử dụng LINQ, phải thực Listing 4-27(thêm FindProduct action method vào Home controller) Với LINQ, tối giản đáng kể trình truy vấn (Listing 4-18) Cách làm khéo léo nhiều Chúng ta thấy câu truy vấn dạng SQL tô đậm Chúng ta xếp đối tượng Product theo thứ tự giảm dần dùng câu lệnh select để lấy giá trị kiểu ẩn danh bao gồm thuộc tính Name Price Phong cách LINQ gọi query syntax kiểu mà nhà phát triển cảm thấy thoải mái họ bắt đầu sử dụng LINQ Một điểm chưa tốt câu truy vấn trả kiểu ẩn danh cho đối tượng Product dãy ta dùng câu lệnh truy vấn Vì cần thao tác kết trả để nhận ba giá trị in thông tin chi tiết chúng Tuy nhiên bạn sẵn sàng từ bỏ tính đơn giảm query syntax Chúng ta nhận nhiều điểm mạnh dùng LINQ Một số hướng thay phong cách dot-notation syntax ngắn gọn dot-notation dựa extension method List 4-29 miêu tả cách làm thay dùng đối tượng Product Câu truy vấn LINQ tô đậm, nhiên khơng dễ nhìn so với query syntax khơng phải tính LINQ dựa từ khóa C# Cho câu truy vấn LINQ thực sự, cần sử dụng extension methods Mỗi LINQ extension methods danh sách đựng áp dụng vào IEnumerable trả kết IEnumerabler Cho phép liên kết method với câu truy vấn phức tạp Lưu ý: Tất LINQ extension methods lấy namespace System.linq Nghĩa phải sử dụng câu lệnh using muốn sử dụng truy vấn Visual Studio thêm namespace System.linq vào lớp controller cách tự động nhiên phần khác project MVC, phải thêm vào thao tác thủ công OrderByDescending method xếp lại item liệu gốc, lambda expression trả giá trị mà dùng để so sánh Take method trả số cụ thể item kết trả (không thể dùng query syntax) Select method cho phép xây dựng kết trả về, định dạng kiến trúc mà muốn Trong trường hợp này, xây dựng đối tượng ẩn danh bao gồm thuộc tính Name Price Mẹo: ý không cần định dạng tên cho thuộc tính kiểu ẩn danh C# suy từ thuộc tính chọn select method Bảng 4-2 mô tả số LINQ extension method hữu dụng Chúng ta sử dụng LINQ xuyên suốt phần lại sách Bảng hữu dụng bắt gặp extension method mà bạn chưa gặp trước Tất LINQ method bảng hoạt động IEnumerable Tìm hiểu khái niệm Deferred truy vấn LINQ Chúng ta ý bảng có cột tên Deferred Co biến đổi đáng ý cách extension method thực thi truy vấn LINQ Một câu truy vấn chứa deferred method (hàm trì hỗn) khơng thực thi chừng item kết chưa liệt kệ List 4-30 miêu tả thay đổi đơn giản FindProduct action method Giữa việc định nghĩa câu truy vấn LINQ query liệt kê kết quả, thay đổi item dãy Products Phần xuất kết cho ví dụ sau Chúng ta thấy câu truy vấn khơng thực đến kết liệt kê thêm đối tượng có thuộc tính Name = Stadium vào dãy Product nên thể phần kết xuất Mẹo: Một chức bật deferred LINQ extension methods câu truy vấn thực từ đầu lần kết liệt kê Nghĩa thực truy vấn lặp lại lần liệu nguồn thay đổi nhận kết thể trạng thái liệu Đối nghịch với đó, sử dụng non-deferred extension method (khơng tạm hoãn) buộc câu truy vấn LINQ thực Listing 4-31 cho thấy SumProducts action method thêm vào Home controller Ví dụ sử dụng Sum method (hàm tính tổng), hàm khơng bị hỗn (deferred) trả kết quả: Chúng ta thấy item Stadium với giá cao không nằm kết kết từ hàm Sum thực gọi thay hỗn lại đến kết sử dụng Sử dụng Async Methods Một cải tiến lớn gần cho C# cách xử lý asynchronous methods (Hàm không đồng bộ) Asynchronous methods hoạt động tầng báo lại cho chúng hồn tất cơng việc, cho phép phần code xử lý tác vụ khác phần công việc backgroud hoạt động Asynchronous methods công cụ quan trọng để loại bỏ tượng nút cổ chai cho phép ứng dụng tận dụng ưu xử lý đa tác vụ hoạt động song song C# NET hỗ trợ suất sắc Asynchronous methods phần code dài dòng người phát triển khơng quen với việc lập trình song song thường bị sa lầy vào cú pháp khác thường Listing 4-32 biểu diễn Asynchronous method tên GetPageLength, định nghĩa lớp MyAsyncMethods folder Models Method nằm lớp MyAsyncMethod.cs Chú ý: Ví dạu cần lời gọi đến System.Net.Http assembly, thêm vào project từ ví dụ trước Đây method sử dụng đối tượng System.Net.Http.HttpClient để yêu cầu nội dung từ trang chủ Apress trả độ dài Phần method gây nhầm lẫn làm lên, phần điển hình task continuation .NET biểu diễn cơng việc đươc thực Asynchronous method Task Đối tượng Task kiểu mạnh dựa kết mà cơng việc background trả Vì gọi HttpClient.GetAsync method, nhận Task Nó cho biết yêu cầu thực background kết yêu câu đối tượng HttpResponseMessage Mẹo: Khi sử dùng từ khóa background, bỏ nhiều nội dung tầm quan trọng khái niệm MVC .NET hỗ trợ suất sắc Asynchronous method lập trình song song nên tìm hiểu kỹ thực muốn xây dựng ứng dụng với hiệu hoạt động tốt tận dụng ưu công nghệ đa lõi va đa tác vụ phần cứng Chúng ta quay lại Asynchronous method cho MVC chương 19 Phần khiến lập trình viên sa lầy vào phần continuation (nối tiếp) chế xác định bạn muốn làm sau tác vụ background thực xong Ví dụ, chún ta sử dụng hàm Continuewith để gọi đến đối tượng HttpResponseMessage lấy từ HttpClient.GetAsync method Chúng ta sử dụng lambda expression để trả giá trị thuộc tính độ dài nội dung lấy từ Apress Web Server Chú ý sử dụng từ khóa retun lần Đây phần gây đau đầu Trước tiên dùng từ khóa return để xác định trả đối tượng Task Khai task hoàn thành trả giá trị ContenLenght Phần header ContenLenght header trả giá trị kiểu long? (giá trị long chấp nhận giá trị = null) có nghĩa kết cùa GetPageLength Task sau Đừng lo lắng thấy vơ nghĩa Đâu ví dụ cho thấy tính phức tạp Asynchronous Method dây chuyền lượng lớn Task sử dụng ContinueWith method, gây phân đoạn code khó đọc khó bảo trì Áp dụng Async Await Kaywords Microsoft giới thiệu từ khóa cho C# với mục đích đơn giản hóa việc sử dụng asynchronous methods HttpCient.getAsync Từ khóa async await, xem cách sử dụng chúng Listing 4-33 Chúng ta sử dụng từ khóa await gọi asynchronous method, việc báo cho trình biên dịch C# biết muốn đợi kết từ Task mà GetAsync method trả tiếp tục thực câu lệnh lại method Áp dụng từ khóa await nghĩa xử lý kết từ GetAsync method method bình thường định đối tượng HttpResponseMessage trả tham biến Chúng ta sử dụng return cách bình thường để trả kết từ method khác Trong trường hợp giá trị thuộc tính ContentLength Đây kỹ thuật tự nhiên giúp không lo ContinueWith method dử dụng return nhiều lần Khi sử dụng từ khóa await, phải thêm từ khoá asynce vào phần signature method cí dụ Kiểu kết trả khơng thay đổi Trong ví dụ GetPageLength method trả Task Điều await async sử dụng số thủ thuật khéo léo cho phép cú pháp tự nhiên khơng làm thay đổi xảy bên method mà chúng đưa vào Một số người bảo GetPageLength method phải xử lý với kết Task tác vụ background trả giá trị null kiểu long Tuy nhiên, dĩ nhiên người lập trình chọn sử dụng từ khóa async await Ghi chú: để ý thấy sách ví dụ để thử nghiệm async await Điều asynchronous methods đòi hỏi kỳ thuật đặc biệt cần thêm nhiều thông tin trước giới thiệu chương 19 Tổng hợp Trong chương này, có nhìn tổng quan tính C# hoạt động hiệu mơ hình MVC Những tính kết hơp với LINQ, dùng chúng để truy vấn liệu sách LINQ đóng vai trò quan trọng ứng dụng MVC Ngồi tìm hiểu từ khóa async await giúp làm việc asynchronous dễ dàng Chủ đề đề cập lại chương 19 học thêm số kỹ thuật nâng cao lập trình tích hợp khơng đồng MVC controller Trong chương tiếp theo, tập trung vào Razor View Engine, chế truyền liệu động vào view ... Automatically Implemented Properties Tính property C# cho phép người dùng triển khai phần liệu cách tách cách liệu đặt lấy (Listing 4-3) có chứa ví dụ lớp tên Product Chung ta thêm lớp vào folder... danh sách theo interface IEnumerable có chút khác thường Chúng ta xem nội dung interfaces tài liệu MSDN Công cụ hỗ trợ xử lý trình biên dịch nên phần code phần C# trước hoạt động Chúng ta... câu truy vấn thực từ đầu lần kết liệt kê Nghĩa thực truy vấn lặp lại lần liệu nguồn thay đổi nhận kết thể trạng thái liệu Đối nghịch với đó, sử dụng non-deferred extension method (khơng tạm hỗn)