Tổng hợp 31+ câu hỏi phỏng vấn C# thường được hỏi nhất
Buổi phỏng vấn lập trình viên C# đang đến gần và bạn cần sự chuẩn bị tốt nhất? Đừng lo lắng! ITNavi đã tổng hợp các câu hỏi phỏng vấn C# được nhà tuyển dụng hỏi nhiều nhất. Hãy đọc bài viết dưới đây để nắm vững kiến thức và tự tin tham gia buổi phỏng vấn. Đừng để bất kỳ câu hỏi lập trình nào khiến bạn bối rối!
Câu hỏi phỏng vấn C# fresher, intern
Dưới đây là các câu hỏi phỏng vấn C# cùng câu trả lời tham khảo dành cho những ứng viên mới ra trường hoặc có dưới 1 năm kinh nghiệm về lập trình C#.
Bạn hãy chú ý, có thể lồng ghép thêm các ví dụ thực tế mà bạn đã từng làm hoặc trải nghiệm cá nhân để câu trả lời thêm phần thuyết phục.
1. C# là gì?
C# (C Sharp) là ngôn ngữ lập trình hướng đối tượng, thuộc họ ngôn ngữ lập trình .Net framework và .NET Core, được dùng để phát triển để phát triển phần mềm cho nhiều nền tảng gồm Windows, macOS, Linux, Android.
2. Giải thích các loại comment trong C# bằng ví dụ
Có các loại comment trong C# gồm Single line, Multiple line (/* */) và XML Comments (///).
- Single line
Ví dụ:
//Đây là single line comment
- Multiple line (/* */)
Ví dụ:
/*Đây là multiple line comment
Dòng thứ 2
Dòng cuối của comment câu hỏi phỏng vấn C#*/
- XML Comments (///).
Ví dụ:
/// summary;
/// Cài thông báo lỗi cho đa ngôn ngữ.
/// summary
3. Sự khác biệt giữa các tham số ref và out là gì?
Nói ngắn gọn, sự khác biệt giữa ref và out nằm ở chỗ:
- Tham số ref: Biến phải được khởi tạo trước khi gọi hàm và cho phép thay đổi giá trị trong phương thức.
- Tham số out: Không yêu cầu biến được khởi tạo trước khi gọi hàm, nhưng phải gán giá trị trong phương thức trước khi kết thúc.
Có thể tham khảo bảng so sánh ref và out dưới đây để hình dung rõ hơn:
Tính năng |
Tham số ref |
Tham số out |
Biến truyền vào phải được khởi tạo trước khi chuyển phương thức |
Có |
Không |
Cho phép hàm thay đổi giá trị của biến truyền vào trong phương thức |
Có |
Có |
Có thể sử dụng để trả về giá trị từ hàm |
Không |
Có |
4. Câu lệnh 'using' trong C# có tác dụng gì?
Khối 'using' được sử dụng để giải phóng tài nguyên không cần thiết (ví dụ như kết nối CSDL, tệp, đối tượng,...), sau đó tự động loại bỏ khi quá trình thực thi khối hoàn tất. ‘using’ còn được sử dụng để tạo Namespace mà bạn muốn sử dụng trong code của mình.
5. Bạn hãy cho biết, chúng ta có thể sử dụng lệnh “this” trong một phương thức tĩnh không?
Không thể. Vì chỉ có thể sử dụng các biến/phương thức tĩnh trong một phương thức tĩnh (static method) trong C#. Trong đó, lệnh “this” được dùng để tham chiếu đến đối tượng hiện tại của một lớp (instance). Còn phương thức tĩnh thì không có đối tượng hiện tại, mà chỉ hoạt động trên lớp chính nó.
6. Bạn hãy phân biệt hằng số (constants) và biến chỉ đọc (read-only)
- Hằng số (Constants) được khai báo và khởi tạo tại thời điểm biên dịch, không thể thay đổi giá trị sau đó. Ví dụ như để định nghĩa các giá trị không thay đổi như số PI (π),...
- Biến chỉ đọc (readonly) là giá trị không thay đổi, chỉ được sử dụng khi chúng ta muốn gán giá trị tại thời điểm khởi tạo.
7. Loại giá trị (value types) và loại tham chiếu (reference types) là gì?
- Loại giá trị (value types): Lưu trữ giá trị của chúng trực tiếp trong biến ở trong không gian bộ nhớ của chính nó. Kiểu dữ liệu số nguyên, số thực, bool, char,... đều là loại giá trị (value types).
Ví dụ:
int a = 30;
- Kiểu tham chiếu (reference types) lưu trữ địa chỉ của đối tượng nơi giá trị đang được lưu trữ. Hay nói cách khác, kiểu tham chiếu là một con trỏ tới vị trí bộ nhớ khác. Kiểu dữ liệu lớp, interface, array,... là loại tham chiếu (reference types).
Ví du:
string b = "Hello ITNavi với câu hỏi phỏng vấn C# hay!!";
8. Các lớp kín (sealed classes) trong C# là gì?
Lớp kín (Sealed classes) trong C# là loại lớp mà không được kế thừa hay mở rộng, tức là không được tạp lớp con từ lớp kín.
Công cụ sửa đổi kín (Sealed modifier) được sử dụng để ngăn chặn việc bắt nguồn từ một lớp (class). Nếu chúng ta buộc phải chỉ định một sealed class làm lớp cơ sở thì sẽ xảy ra lỗi thời gian biên dịch.
9. Method overloading là gì?
Method overloading là một tính năng trong C# cho phép tạo nhiều phương thức có cùng tên với các chữ ký duy nhất trong cùng một lớp (class). Hãy nói đơn giản là Method overloading cho phép có nhiều phương thức cùng tên trong một lớp nhưng phải có các tham số khác nhau.
Khi biên dịch, trình biên dịch sử dụng overload resolution để xác định phương thức cụ thể sẽ được gọi.
Ví dụ về Method overloading:
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public double Add(double a, double b)
{
return a + b;
}
public string Add(string str1, string str2)
{
return str1 + str2;
}
}
10. Bạn hãy nêu sự khác nhau giữa Array và Arraylist
- Trong một mảng (array), chúng ta chỉ có thể có các mục cùng loại, kích thước của mảng được cố định khi so sánh.
- Danh sách mảng (Arraylist) tương tự như mảng nhưng không có kích thước cố định.
Để phân biệt array và arraylist kỹ hơn, bạn có thể dùng bảng dưới đây:
Tính năng |
Array |
ArrayList |
Kích thước |
Cố định |
Thay đổi |
Tham chiếu |
Lưu trữ giá trị |
Lưu trữ tham chiếu |
Tối ưu hóa |
Cho truy cập ngẫu nhiên |
Cho truy cập theo thứ tự |
Tính linh hoạt |
Ít linh hoạt |
Linh hoạt hơn |
Hiệu suất |
Cao hơn |
Thấp hơn |
11. Bạn làm thế nào để sắp xếp các phần tử của mảng theo thứ tự giảm dần?
Sử dụng phương thức Sort() sau đó dùng phương thức Reverse().
12. Viết cú pháp C# để xử lý (catch) một ngoại lệ (exception)
Ta sử dụng khối try-catch. Catch blocks có thể có tham số thuộc loại system.Exception type.
Ví dụ:
try {
GetAllData();
}
catch (Exception ex) {
}
13. Sự khác biệt giữa phương thức Finalize() và Dispose() là gì?
- Dispose() được gọi khi chúng ta muốn release bất kỳ tài nguyên không được quản lý nào và thực hiện tác vụ dọn dẹp khác. Dispose() có kiểm soát hơn khi giải phóng tài nguyên, cho phép thực hiện các tác vụ dọn dẹp bổ sung như đóng CSDL, giải phóng cache,...
- Finalize() được gọi bởi garbage collector, dùng để thu gom các đối tượng không còn được tham chiếu (tức là những tài nguyên không còn được quả lý) nhưng nó không đảm bảo việc thu gom rác của một đối tượng.
14. Làm thế nào để kế thừa một class này sang class khác trong C#?
Trong C#, dấu hai chấm được sử dụng như toán tử kế thừa. Vì vậy, chỉ cần tên class sau dấu hai chấm là đã thực hiện được kế thừa class này sang class khác.
Ví dụ:
public class DerivedClass : BaseClass
15. Tại sao bạn không thể chỉ định công cụ sửa đổi khả năng truy cập cho các phương thức bên trong interface?
Trong interface, chúng ta có các phương thức ảo không có định nghĩa phương thức. Tất cả các phương thức đều được ghi đè trong lớp dẫn xuất. Đó là lý do tại sao tất cả chúng đều được công khai. Ngoài ra còn các lý do khác đó là:
- Các thực thi interface không nhất thiết phải có cùng khả năng truy cập, nhưng bắt buộc có cùng tên, kiểu tham số.
- Nếu chỉ định khả năng truy cập cho phương thức trong interface có thể làm code của bạn trở nên dài dòng và hạn chế tính linh hoạt của interface do các lớp thực thi bị ràng buộc bởi khả năng truy cập bị chỉ định.
16. Điểm khác nhau giữa “” và String.Empty là gì?
- "" là một chuỗi literal có độ dài bằng 0 và sẽ tạo thêm 1 đối tượng khi làm việc với nó (so sánh, copy…)
- String.Empty là một hằng số trong C#, đại diện cho chuỗi trống, không chứa bất cứ ký tự nào, nằm trong mscorlib. Để kiểm tra nhanh chóng xem 1 string có rỗng hay không thì dùng String.Length == 0.
17. Bạn hãy phân biệt giữa Property và Field?
- Property: Là thành viên của class, dùng để quản lý cách truy cập đến Field. Trong một số trường hợp, ta dùng Property để đảm bảo Field không bị gán các giá trị không hợp lệ.
- Field: Là một biến được khai báo trong class, có thể được public, protected hoặc private.
18. Nêu sự khác nhau giữa interface và abstract class?
- Interface được dùng để mô tả hành vi chung của class mà không cần cung cấp methods thực thi. Một class hoặc class con có thể triển khai nhiều interface.
- Abstract class có thể chứa phân hàm và các phương thức trừu tượng, được dùng để cung cấp tinh năng chung mà class con có thể kế thừa và bổ sung thêm tính năng riêng. Abstract class không có tính kế thừa.
19. Phương thức private virtual có bị ghi đè không?
Không, bởi vì chúng không thể truy cập được bên ngoài class. Một phương thức private chỉ có thể truy cập được đối với class mà nó được định nghĩa.
20. Phân biệt == và phương thức Equals
- Equals là phương thức được kế thừa từ class cơ sở Object và có thể bị ghi đè trong các class con. Equal so sánh theo kiểu tham chiếu nội dung của đối tượng.
- == là toán tử so sánh bằng, dùng để so sánh theo kiểu dữ liệu giá trị như số nguyên, số thực, chuỗi, các kiểu dữ liệu nguyên thủy,...
Các câu hỏi phỏng vấn senior C#
Nhóm câu hỏi phỏng vấn C# level nâng cao hơn thường được nhà tuyển dụng lựa chọn để đánh giá kiến thức của ứng viên có kinh nghiệm từ 2 - 5 năm kinh nghiệm lập trình C#. Kèm theo các câu hỏi, ITNavi cũng có các câu trả lời gợi ý để bạn tham khảo.
1. Phạm vi của biến Protected Internal trong một class C# là gì?
Protected internal access specifier xác định quyền truy cập của biến (field), thuộc tính (property), phương thức (method), hoặc lớp (class) trong một lớp. Đây là sự kết hợp của hai phạm vi Protected và Internal:
- Protected cho phép biến có thể truy cập từ các lớp con.
- Internal cho phép biến có thể truy cập từ bên trong cùng một assembly mà biến hoặc thành viên đó được định nghĩa.
Ví dụ:
class access
{
// String Variable declared as protected internal
protected internal string name;
public void print()
{
Console.WriteLine("\nMy name is " + name);
}
}
2. Constructor Chaining C# là gì?
Constructor Chaining là một cách tiếp cận trong đó một hàm khởi tạo (constructor) của một lớp gọi một hàm khởi tạo khác của cùng một lớp hoặc của lớp cơ sở (base class). Constructor Chaining dùng để khởi tạo các thuộc tính của đối tượng theo thứ tự.
Ví dụ:
public class MyClass
{
public MyClass() : this(0) { }
public MyClass(int value)
{
// Khởi tạo đối tượng với giá trị value trong câu hỏi phỏng vấn C#
}
}
3. Phân biệt toán tử “is” và “as” trong C#
- Toán tử “is” được sử dụng để kiểm tra tính tương thích của một đối tượng với một kiểu nhất định và nó trả về kết quả dưới dạng Boolean. Tức là nếu biến thuộc về kiểu được kiểm tra thì trả về giá trị true, còn nếu không thì trả về false.
Ví dụ: if (someObject is StringBuilder) ...
- Toán tử “as” được sử dụng để chuyển một đối tượng sang một kiểu hoặc một lớp. Nếu biến không thuộc kiểu được kiểm tra thì trả về giá trị NULL. Toán tử “as” thường được dùng trong trường hợp không chắc chắn về kiểu của đối tượng và muốn tránh các lỗi chuyển đổi không hợp lệ.
Ví dụ:
StringBuilder b = someObject as StringBuilder;
if (b != null) ...
4. Hãy tạo một hàm trong C# mà có thể chấp nhận số lượng đối số khác nhau
Bằng cách sử dụng tham số mảng params hoặc tham số tùy chọn (optional parameters) để chỉ định một tham số của phương thức nhận một số lượng đối số thay đổi, gồm cả số lượng đối số bằng 0.
Ví dụ:
public void MyFunction(string name, int age = 30, string city = "Unknown")
{
// Thân hàm
Console.WriteLine($"Name: {name}, Age: {age}, City: {city}");
}
// Gọi hàm với các đối số khác nhau
MyFunction("Alice"); // Name: Alice, Age: 30, City: Unknown
MyFunction("Bob", 25); // Name: Bob, Age: 25, City: Unknown
MyFunction("Charlie", 40, "New York"); // Name: Charlie, Age: 40, City: New York
5. Khi nào nên dùng các delegate trong C#?
Sử dụng delegate trong các tình huống sau:
- Event handling - Xử lý sự kiện.
- Predicate
- Start các thread.
- Callback function (ví dụ: đối với API bất đồng bộ).
- Phát triển giao diện (Interfaces).
- Action Delegation
- …
6. Tác dụng của câu lệnh lock trong C#?
Từ khóa lock đảm bảo rằng chỉ một thread được truy cập vào một khối code tại một thời điểm, giúp ngăn chặn tình trạng tranh chấp tài nguyên.
Cơ chế hoạt động của “lock’ như sau: Khi một luồng đang thực hiện câu lệnh lock thì nó sẽ khóa đối tượng được chỉ định bằng khóa và ngăn các luồng khác truy cập vào đối tượng. Cho đến khi đối tượng được release khỏi luồng thì sẽ thực hiện luồng tiếp theo.
Ví dụ:
private static object lockObject = new object();
public void SomeMethod()
{
lock (lockObject)
{
// Thao tác với tài nguyên tại đây
}
}
7. Có thể thực hiện đa kế thừa trong C# hay không?
Không. C# không hỗ trợ đa kế thừa (multiple inheritance) mà chỉ hỗ trợ kế thừa đơn. Tức là các lớp chỉ có thể kế thừa từ một lớp cơ sở trực tiếp.
Tuy vậy, C# có hỗ trợ một số tính năng để thực hiện được đa kế thừa, đó là:
- Interface
- Kế thừa từ lớp trừu tượng
8. Làm cách nào để triển khai mẫu thiết kế đơn (singleton) trong C#?
Trong mẫu singleton, một lớp chỉ có thể có một instance và cung cấp một điểm truy cập toàn cục đến instance đó.
Ví dụ:
Public sealed class Singleton
{
Private static readonly Singleton _instance = new Singleton();
}
9. Có thể thực thi nhiều khối lệnh catch trong C# không?
Có, có thể thực thi nhiều khối lệnh catch trong C# để xử lý nhiều loại ngoại lệ khác nhau. Bạn hoàn toàn có thể sử dụng nhiều catch blocks liên tiếp trong cấu trúc try...catch. Nếu có nhiều khối lệnh catch được khai báo thì trình biên dịch sẽ thực hiện theo thứ tự khai báo từ trên xuống.
Câu hỏi về các vấn đề của C#
Dưới đây là các câu hỏi phỏng vấn C# khác về các vấn đề hoặc chủ đề có liên quan.
1. Làm cách nào để có thể thiết lập class được kế thừa nhưng ngăn chặn phương thức bị ghi đè?
Khai báo lớp là công khai và phương thức sealed để tránh bị ghi đè.
2. Điều gì xảy ra nếu các interface kế thừa có tên phương thức xung đột?
Khi các interface kế thừa (interface inheritance) có tên phương thức xung đột thì sẽ gặp phải tình trạng lỗi biên dịch (compile-time error). Để xử lý tình trạng này, lớp implement interface sẽ phải cung cấp một phương thức trùng có cùng tên và kiểu trả về như phương thức xung đột. Đây được gọi là phương thức trùng lặp.
3.Việc xử lý exception trong C# được thực hiện như thế nào?
Có thể sử dụng các cấu trúc trong C# bao gồm:
- try - Chứa một khối code mà exception sẽ được kiểm tra.
- catch - Khối catch được thực thi nếu exception được ném vào khối try.
- finally - Khối code được thực thi bất kể exception có bị bắt hay không.
Tìm việc lập trình viên C# JD rõ ràng ở đâu?
Bạn còn đang ngụp lặn trong chuỗi ngày dài tìm việc ngành CNTT thì ITNavi chính là cánh cửa cơ hội tốt nhất cho bạn!
Trực thuộc VTI Group, ITNavi là công ty công nghệ cung cấp các giải pháp tuyển dụng việc làm và nhân sự IT hàng đầu, cũng là cầu nối đáp ứng nhu cầu của Nhà tuyển dụng và Ứng viên, đồng thời tiên phong trong việc xây dựng định hướng sự nghiệp cho nhân sự IT.
Với danh sách 2000+ việc làm lập trình C#, Java, PHP,... có JD rõ ràng, uy tín từ hơn 100 công ty công nghệ TOP đầu Việt Nam, ITNavi đem đến cho bạn cơ hội nhận offer tốt với mức thu nhập hấp dẫn.
Đăng ký ngay qua form để nhận gợi ý việc làm phù hợp nhất!
Cần chuẩn bị những gì cho buổi hẹn phỏng vấn C#
Buổi phỏng vấn quyết định đến 80% khả năng bạn được nhận công việc lập trình C#. Ngoài các kiến thức chuyên môn, bạn cũng cần lưu ý chuẩn bị các kỹ năng và tinh thần. Cụ thể:
- Tìm hiểu về xu hướng công nghệ C#, thông tin công ty, vị trí công việc ứng tuyển.
- Luyện tập và cải thiện kỹ năng diễn đạt ý tưởng, truyền đạt quan điểm, lắng nghe và đặt câu hỏi.
- Luôn mang theo sổ bút ghi chép.
- Trong buổi phỏng vấn luôn giữ tinh thần bình tĩnh, tự tin, thái độ hòa nhã, cầu tiến, cầu thị, tinh thần trách nhiệm, ham học hỏi.
- Đặt câu hỏi phù hợp cho nhà tuyển dụng hoặc người phỏng vấn chuyên môn.
- Sau buổi phỏng vấn nên gửi email cảm ơn ngắn gọn tới nhà tuyển dụng.
Phỏng vấn lập trình viên C# như một kỳ thi vấn đáp đầy chông gai, bởi ngoài kiến thức chuyên môn, bạn còn cần thể hiện nhiều phẩm chất, kỹ năng khác phù hợp với công việc và văn hoá công ty. Với những câu hỏi phỏng vấn C# và kinh nghiệm chuẩn bị mà ITNavi chia sẻ trên đây, chúc bạn có buổi phỏng vấn hoàn hảo và nhận offer như ý!
ITNavi - Nền tảng kết nối việc làm IT
Nguồn: Tổng hợp 31+ câu hỏi phỏng vấn C# thường được hỏi nhất