Những câu hỏi phỏng vấn C#/.Net (Basic)
1. 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.
2. 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ệ.
3. Sự khác biệt giữa câu lệnh continue và break trong C # là gì?
- Sử dụng câu lệnh break, bạn có thể nhảy ra khỏi vòng lặp.
- Sử dụng câu lệnh continue, bạn có thể nhảy qua một lần lặp và sau đó tiếp tục thực hiện vòng lặp của mình.
4. Serialization là gì?
- Là sự chuyển chuyển đối tượng thành 1 luồng các bytes.
5. 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.
6. 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.
7. Khác nhau giữa ActionResult và JsonResult?
- ActionResult thường được sử dụng khi bạn muốn trả về 1 view hoặc file hoặc jsondata hoặc điều hướng tới 1 url khác.
- JsonResult thường được sử dụng khi bạn muốn trả về jsondata tới 1 client.
- JsonResult là 1 loại ActionResult trong MVC. Nó giúp gửi dữ liệu theo chuẩn format JavaScript Object Notation (JSON).
Cũng như vậy, JsonRequestBehavior là gì? Nếu bạn cần gửi JSON trong 1 request có phương thức là GET, bạn cần phải cho phép hành động này bằng cách dùng JsonRequestBehavior. AllowGet là tham số thứ 2 trong phương thức Json. Tuy nhiên đây cũng là cơ hội để hacker có thể truy cập vào phần tải dữ liệu JSON thông qua 1 quá trình gọi là JSON Hijacking.
[HttpGet]
public JsonResult GetListEmail()
{
List<string> list = new List<string>() { "email 1", "email 2", "email 3"};
return Json(list, JsonRequestBehavior.AllowGet);
}
8. 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#).
9. Dot NET có hỗ trợ thừa kế từ nhiều lớp hay không (multiple inheritance)?
- 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 static readonly và const?
- Const là hằng số được khởi tạo khi biên dịch chương trình.
- Static readonly là hằng số được khởi tạo khi thực thi chương trình.
11. 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.
12. 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.
13. Property Accessors là gì?
Các phần hoặc khối get và set của một thuộc tính được gọi là accessors (trình truy cập).
class Person
{
private string name; // field
public string Name // property
{
get { return name; } // get method
set { name = value; } // set method
}
}
Chúng rất hữu ích để hạn chế khả năng truy cập của một thuộc tính.
- set chỉ định rằng chúng ta có thể gán một giá trị cho một trường riêng tư (private) trong một thuộc tính, và nếu không có thuộc tính set này, trường nói trên sẽ giống như một trường chỉ để đọc (read-only field).
- Với get, chúng ta có thể truy cập giá trị của trường riêng tư. Một bộ truy cập get chỉ định rằng chúng ta có thể truy cập công khai giá trị của một trường.
14. Sự khác nhau giữa == và phương thức Equals?
- Equals so sánh theo kiểu tham chiếu.
- == so sánh theo kiểu giá trị.
15. 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.
16. 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.
17. 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.
18. Sự khác nhau giữa abstract class và interface?
Giống nhau:
- Abstract class và Interface đều không thể khởi tạo đối tượng bên trong được.
- Abstract class và Interface đều có thể khai báo các phương thức nhưng không thực hiện chúng.
- Abstract class và Interface đều bao gồm các phương thức abstract.
- Abstract class và Interface đều được thực thi từ các class con hay còn gọi kế thừa, dẫn xuất.
- Abstract class và Interface đều có thể kế thừa từ nhiều interface.
Khác nhau:
- Abstract class:
- Cho phép khai báo field.
- Các phương thức có thể có thân hàm hoặc không có thân hàm.
- Class dẫn xuất chỉ kế thừa được từ 1 abstract class và nhiều interface.
- Có chứa constructor.
- Các phương thức có từ khóa access modifier.
- Interface:
- Chỉ khai báo không có thân hàm.
- Class triển khai có thể triển khai nhiều interface.
19. 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.
20. Sự khác nhau giữa try{}catch{} và try{}catch{Exception ex}?
- Không có sự khác nhau.
21. Object là gì?
Theo MSDN, “một định nghĩa lớp hoặc cấu trúc giống như một bản thiết kế chỉ định những gì kiểu có thể làm. Về cơ bản một Object là một khối bộ nhớ đã được cấp phát và cấu hình theo bản thiết kế. Một chương trình có thể tạo ra nhiều Object của cùng lớp. Các Object còn được gọi là instance và chúng có thể được lưu trữ trong một biến hoặc trong một mảng hoặc trong một tập hợp. Mã client là mã sử dụng các biến này để gọi các phương thức và truy cập các thuộc tính chung của đối tượng. Trong một ngôn ngữ hướng đối tượng như C #, một chương trình điển hình bao gồm nhiều Object tương tác động”.
Các Object giúp chúng ta truy cập thành viên của một lớp hoặc cấu trúc hoặc chúng có thể là trường, phương thức hoặc thuộc tính bằng cách sử dụng “.“.
22. Sự khác nhau giữa Dispose, Destructor và Finalize?
- Destructor sẽ được chuyển thành Finalize khi biên dịch.
- 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ớ.
23. 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.
24. 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ý.
25. 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.
26. 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ớ.
- 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.
27. Mục đích của thừa kế (inheritance)?
- Để tái sử dụng.