Bài viết này trình bày một số kiến thức về .NET mà các lập trình viên cần nắm được để phục vụ cho công việc của mình được tốt hơn.
1. Sự khác nhau giữa các lớp Trace và Debug?
– Trace dùng để theo dõi các hành động xảy ra. Nó hoạt động trong các đóng gói cả Debug lẫn Release. Trace là khả năng của chương trình tự đưa ra các thông tin về hành động của mình.
– Debug dùng để tìm và sửa các lỗi trong chương trình. Nó chỉ hoạt động trong đóng gói Debug.
2. Sự khác nhau giữa static readonly và const?
– Static readonly là hằng số được khởi tạo khi thực thi chương trình.
– Const là hằng số được khởi tạo khi biên dịch chương trình.
3. Sự khác nhau giữa String và StringBuilder?
– String là lớp không thay đổi. Mọi phương thức sẽ tạo ra một biến String mới.
– StringBuilder là lớp thay đổi. Các phương thức của biến sẽ ảnh hưởng đến đến biến StringBuilder hiện tại.
4. Sự khác nhau giữa “” và String.Empty?
– “” sẽ tạo thêm 1 đối tượng khi làm việc với nó (so sánh, copy…)
– String.Empty không tạo đối tượng nào cả. String.Emtpy nằm trong mscorlib.
Khi kiểm tra 1 String có rỗng hay không nên dùng String.Length == 0 để có tốc độ nhanh nhất.
5. Có thể gán một struct bằng null hay không?
– Có thể nếu bạn lập trình với C# 2.0. Ví dụ: int? var = 1; var = null;
6. Sự khác nhau giữa == và phương thức Equals?
– == so sánh theo kiểu giá trị.
– Equals so sánh theo kiểu tham chiếu.
7. Sự khác nhau giữa throw và throw ex?
– throw đế đưa lại toàn bộ các tầng theo dõi của lỗi ra.
– throw ex bỏ bớt các tầng theo dõi bên dưới phương thức gọi throw ex.
8. Connection Pooling dùng để làm gì?
– Cho phép tăng tốc độ của các ứng dụng Web bằng cách dùng lại các kết nối thay vì tạo các kết nối mới với mỗi yêu cầu.
9. .NET có hỗ trợ thừa kế từ nhiều lớp hay không (multiple inheritance)? Tại sao?
– Không. Vì sẽ không hiểu được khi gọi 1 phương thức mà 2 lớp cha cùng override nó.
10. Sự khác nhau giữa abstract class và interface?
– Có thể thừa kế từ nhiều interface nhưng chỉ có thể thừa kế từ 1 abstract class.
– Có thể viết sẵn các thực thi trong Abstract class, nhưng interface thì không.
– Interface dùng để gom các hành động cần được hiện thực , các khả năng của một đối tượng (ví dụ con người và xe cộ cùng có khả năng đi lại, nhưng con người không cùng tính chất với xe cộ), còn abstract class cho các lớp thừa kế cùng 1 loại, tính chất hay trạng thái (ví dụ đàn ông, phụ nữ, trẻ con, người già đều là con người).
– Abstract class có tốc độ thực thi nhanh hơn interface.
– Thêm 1 tính năng mới vào interface sẽ phá vỡ toàn bộ các lớp hiện thực, còn abstract thì không.
11. Hàm GetHasCode() trong System.Object dùng để làm gì?
– Trả về giá trị của một đối tượng. Chú ý hàm này mặc định không trả về giá trị duy nhất hoặc không đổi. Hàm này có thể override.
12. Sự khác nhau giữa DataSet và DataReader?
– DataSet có thể đọc và ghi trong khi DataReader chỉ có thể đọc.
– DataSet có thể chứa nhiều bảng còn DataReader chỉ có thể chứa 1 bảng.
– DataSet làm việc ở chế độ không kết nối còn DataReader làm việc ở chế độ kết nối.
– DataSet có thể di chuyển tới và trở lại còn DataReader thì chỉ có thể di chuyển tới.
– DataSet truy cập chậm hơn DataReader.
13. Sự khác nhau giữa các phuơng thức Copy và Clone?
– Clone chỉ copy cấu trúc trong khi Copy copy cả cấu trúc lẫn dữ liệu.
14. Sự khác nhau giữa Dispose, Destructor và Finalize?
– Destructor sẽ được chuyển thành Finalize khi biên dịch. Hàm Finalize được gọi bởi .NET Runtime và chúng ta không thể đoàn được nó được gọi khi nào, nhưng nó chắc chắn sẽ được gọi.
– Dispose sẽ giải phóng bộ nhớ ngay khi nó được gọi. Lưu ý nếu lớp nào override Dispose mà quên gọi thì các đối tượng sẽ không tự giải phóng bộ nhớ.
15. Serialization là gì?
– Là sự chuyển chuyển đối tượng thành 1 luồng các bytes.
16. Sự khác nhau giữa XmlSerializer, BinaryFormatter và SoapFormatter?
– XmlSerializer dùng cho dịch vụ Web.
– BinaryFormatter/SoapFormatter dùng cho Remoting.
– SoapFormatter dùng để tuần tự hóa 1 đối tượng thành SOAP.
– BinaryFormatter dùng để tuần tự hóa 1 đối tượng thành dạng nhị phân.
– XmlSerializer chỉ chuyển đổi các tính chất public còn BinaryFormatter/SoapFormatter chuyển đổi cả public lẫn private.
17. Sự khác nhau giữa overriding và shadowing?
– Overriding cung cấp sự hiện thực mới của 1 hàm ở lớp thừa kế nhưng không thay đổi số biến, kiểu trả về, mức truy cập còn shadowing thì có thể thay đổi (từ khóa new trong C#).
18. Sự khác nhau giữa class, object, struct và interface?
– Class là cấu trúc dữ liệu định nghĩa bởi người dùng chứa các tính chất và phương thức. Object là một trường hợp cụ thể của class. Class không chiếm bộ nhớ, còn Object được tạo trong bộ nhớ.
– Class là cấu trúc dữ liệu định nghĩa bởi người dùng chứa các tính chất và phương thức. Struct là kiểu giá trị được lưu trữ trong stack còn class là kiểu tham chiếu (các object) được lưu trữ trong heap.
– Khi struct được khởi tạo không bằng hàm khởi tạo người dùng sẽ phải khởi tạo tất cả các Fields trước khi sử dụng nó.
– Interface là một hợp đồng gồm một nhóm các phương thức cần được hiện thực.
19. Sự khác nhau giữa Property và Field?
– Property dùng để quản lý sự truy cập đến Field. Dùng Property để đảm bảo Field không bị gán các giá trị không hợp lệ.
20. Sự khác nhau giữa static Method, static constructor với method và constructor thông thường?
– Static method có thể gọi mà không cần khởi tạo biến. Static constructor chỉ được gọi đúng một lần khi object đầu tiên được khởi tạo.
21. Các biến tĩnh và chỉ dẫn chương trình được lưu ở đâu?
– Ở 1 vùng bộ nhớ đặc biệt gọi là Permanent Storage area.
22. Sự khác nhau giữa stack và heap?
– Stack và heap là các vùng bộ nhớ. Heap nằm giữa stack và Permanent Storage area, và độ lớn có thể thay đổi khi thực thi chương trình.
23. Sự khác nhau giữa Boxing and Un-Boxing?
– Boxing là chuyển đổi kiểu giá trị thành kiểu tham chiếu. Un-Boxing ngược lại.
24. Mục đích của thừa kế (inheritance)?
– Để tái sử dụng.
25. Mục đích của đa hình (poymophism)?
– Một hành động có thể xảy ra theo nhiều cách khác nhau.
26. Sự khác nhau giữa Compile Time Polymorphism và Run Time Polymorphism?
– Compile Time Polymorphism – ví dụ Overloading, một hàm có thể có nhiều cách biểu diễn.
– Run Time Polymorphism – ví dụ Overriding, một hàm có thể có nhiều cách xử lý.
27. Sự khác nhau giữa delegate và event?
– delegate là một lớp (class) đại diện cho hàm con trỏ kiểu an toàn hoặc hàm gọi (call backs) chỉ đến địa chỉ tham chiếu của một (hay nhiều) hàm. Con trỏ hàm chứa trong delegate được gắn vào một đối tượng đích (target) và khi delegate được kích hoạt phương thức sẽ được gọi ở đối tượng đích. Sự hữu ích của delegate không nằm ở chỗ giữ địa chỉ tham chiếu của các hàm mà để định nghĩa và dùng các tên hàm khi runtime thay vì compile time.
– event cho phép xác định một delegate sẽ được gọi khi có sự xuất hiện của “sự kiện” nào đó. event là một modifier trong khi delegate là một lớp. event cho phép một delegate được khai báo trong interface.
29. AppDomain là gì?
– Là một miền riêng biệt lưu trữ code và dữ liệu cho một application. Một process có thể chứa nhiều AppDomains.
Khi bạn copy một DLL mới vào bin, ASP.NET runtime sẽ không thể đưa nó vào một AppDomain đang chạy.Nó sẽ dừng từ từ AppDomain cũ (dừng hẳn khi nó dừng tất cả các requests) và mở một AppDomain mới.
30. Sự khác nhau giữa publish và published interfaces.
– publish interface là interface mà bạn có thể sửa tất cả những code nào dùng nó còn published interface là interface mà bạn không thể sửa code dùng nó.
31. Sự khác nhau giữa try{}catch{} và try{}catch{Exception ex}?
– Chúng giống hệt nhau.
32. Sự khác nhau giữa 1/0; và try{1/0;} catch {throw;}
– Chúng giống hệt nhau. Vì vậy nếu không xử lý catch thì đừng catch.
33. Sự khác nhau giữa Remoting và Web service?
– Web service không có trạng thái, không cần biết đến client chỉ sử dụng trên HTTP, hỗ trợ không đồng nhất các môi trường, tốc độ chậm hơn Remoting.
– Remoting có trạng thái kết nối, hỗ trợ nhiều giao thức hơn HTTP, TCP…, đòi hỏi môi trường đồng nhất, tốc độ nhanh đặc biệt khi dùng trên TCP.
34. Sự khác nhau giữa error và exception?
– Error là lỗi của chương trình còn exception là lỗi chương trình được phát hiện và có thể xử lý.
35. Sự khác nhau giữa Procedure và OO?
– Procedure gồm các hàm và các biến, tất cả các hàm đều có thể truy cập đến tất cả các biến. Không thể quản lý các biến.
– OO gom hàm và biến vào các đơn vị object. Các hàm và biến được quản lý trong nội bộ object. Các object tương tác với nhau thông qua các interfaces.
36. CLR, CTS, CLS, MSIL, JIT, PE, GAC là viết tắt của những gì?
– Là Common Language Runtime: môi trường để chạy các ứng dụng .NET
– Là Common Type System: mô tả các loại dữ liệu trong .NET.
– Là Common Language Specification: mô tả các quy định và chuẩn cho các ngôn ngữ trong .NET
– Là Microsoft Intermediate Language: ngôn ngữ thông dịch của .NET.
– Là Just In Time: trình biên dịch MSIL thành mã máy.
– Là Portable Executable: file chứa MSIL.
– Là Global Assembly Cache: nơi lưu trữ các Asembly dùng chung.
37. Các mâu thuẫn giữa OO và RDBMS?
– Cấu trúc cấp bậc trong OO có thể là vô tận trong khi ở RDBMS chỉ có 4 loại table, row, column, cell.
– Các đối tượng trong OO bản thân là phân biệt trong khi trong RDBMS cần phải có primary-key.
– Các đối tượng trong OO có thể tham chiếu đến nhau rất đơn giản nhưng trong RDBMS thì phức tạp thông qua JOIN
– Sự thừa kế trong OO là đơn giản trong khi trong RDBMS hầu như không có khái niệm đó. Một bảng cần chứa tất cả các tính chất, có khi là thừa.
– Các đối tượng trong OO có thể có các hành động tác động đến tối tương khác.trong RDBMS thì phức tạp thông qua TRIGGER
– Khả năng truy cập trong OO là hạn chế trong khi ở RDBMS là không giới hạn.
38. Sự khác nhau giữa Response.Redirect và Server.Transfer.
– Response.Redirect đơn thuần là chuyển bạn đến một trang mới giống như bạn gõ địa chỉ trang đó trên browser và request đến server.
– Server.Transfer cũng chuyển bạn đến trang mới nhưng ở phía server, làm giảm request đến server, giữa nguyên URL của bạn và có thể chuyển cả các query string và biến trên form đên địa chỉ mới, chỉ thực hiện giữa các trang trên cùng 1 host.
39. Vai trò của ASPX page và ASPX page code-behind trong MVC.
– ASPX page là View còn ASPX page code-behind là Controller.
40. Làm thế nào để try/catch trên toàn bộ 1 ASPX page.
– Dùng Page_Error event.
41. Sự khác nhau giữa Cohesion và Coupling
– Cohesion là sự liên kết giữa các thành phần trong một module. Một thiết kế tốt nên có sự liên kết giữa các thành phần thật chặt chẽ.
– Coupling là sự kết nối giữa các module với nhau. Một thiết kế tốt nên có sự kết nối thật lỏng lẽo giữa các module.
42. Refractoring là gì?
– Là sự thiết kế lại cấu trúc của code bằng cách thay đổi cấu trúc bên trong mà không ảnh hưởng đến các hành vi bên ngoài (interface) của đoạn code (module, system) đó.
43. Phân biệt HttpApplication, Session, ViewSate và HttpContext?
– Cả 4 thành phần trên đều dùng để lưu dữ liệu của một Web Application.
– HttpApplication có tác dụng trong toàn bộ quá trình thực thi của Web Application.
– Session có tác dụng trong 1 lần ghé thăm (visit) của người dùng. Nó kết thúc khi gặp timeout.
– ViewState có tác dụng trong trong 1 trang web.
– HttpContext có tác dụng trong 1 request.