Kính gửi quý độc giả, những C# Interview Questions đã được thiết kế đặc biệt để giúp bạn làm quen với bản chất của các câu hỏi mà bạn có thể gặp phải trong cuộc phỏng vấn cho chủ đề C#. Theo kinh nghiệm của tôi, những người phỏng vấn giỏi hầu như không định hỏi bất kỳ câu hỏi cụ thể nào trong cuộc phỏng vấn của bạn, thông thường các câu hỏi bắt đầu với một số khái niệm cơ bản về chủ đề và sau đó họ tiếp tục dựa trên thảo luận sâu hơn và những gì bạn trả lời -
C # là một ngôn ngữ lập trình hướng đối tượng hiện đại, đa năng, được phát triển bởi Microsoft. C # được thiết kế cho Cơ sở hạ tầng ngôn ngữ chung (CLI), bao gồm mã thực thi và môi trường thời gian chạy cho phép sử dụng nhiều ngôn ngữ cấp cao khác nhau trên các nền tảng và kiến trúc máy tính khác nhau.
Mảng răng cưa là một mảng của các mảng.
Bạn có thể khởi tạo một mảng răng cưa dưới dạng:
int[][] scores = new int[2][]{new int[]{92,93,94},new int[]{85,66,87,88}};
Trong đó, điểm số là một mảng gồm hai mảng số nguyên - điểm số [0] là một mảng 3 số nguyên và điểm số [1] là một mảng 4 số nguyên.
Có ba cách mà các tham số có thể được truyền cho một phương thức:
Value parameters- Phương thức này sao chép giá trị thực của một đối số vào tham số chính thức của hàm. Trong trường hợp này, các thay đổi được thực hiện đối với tham số bên trong hàm không ảnh hưởng đến đối số.
Reference parameters- Phương thức này sao chép tham chiếu đến vị trí bộ nhớ của một đối số vào tham số hình thức. Điều này có nghĩa là các thay đổi được thực hiện đối với tham số sẽ ảnh hưởng đến đối số.
Output parameters - Phương thức này giúp trả về nhiều hơn một giá trị.
Đúng! Sử dụng các tham số đầu ra. Một câu lệnh trả về có thể được sử dụng để trả về chỉ một giá trị từ một hàm. Tuy nhiên, sử dụng các tham số đầu ra, bạn có thể trả về hai giá trị từ một hàm.
Các tham số đầu ra tương tự như các tham số tham chiếu, ngoại trừ việc chúng truyền dữ liệu ra khỏi phương thức chứ không phải vào nó. Tham số tham chiếu sao chép tham chiếu đến vị trí bộ nhớ của một đối số vào tham số chính thức. Điều này có nghĩa là các thay đổi được thực hiện đối với tham số sẽ ảnh hưởng đến đối số.
Không gian tên được thiết kế để cung cấp một cách để giữ một bộ tên riêng biệt với một bộ tên khác. Tên lớp được khai báo trong một không gian tên không xung đột với các tên lớp tương tự được khai báo trong vùng tên khác.
using từ khóa được sử dụng để bao gồm một không gian tên trong chương trình. Một chương trình thường có nhiều câu lệnh sử dụng.
Các biến kiểu giá trị có thể được gán giá trị trực tiếp. Chúng có nguồn gốc từ lớp System.ValueType.
Các loại giá trị trực tiếp chứa dữ liệu. Một số ví dụ là int, char và float, lưu trữ các số, bảng chữ cái và số dấu phẩy động, tương ứng. Khi bạn khai báo kiểu int, hệ thống sẽ cấp phát bộ nhớ để lưu giá trị.
Các kiểu tham chiếu không chứa dữ liệu thực tế được lưu trữ trong một biến, nhưng chúng chứa một tham chiếu đến các biến.
Nói cách khác, chúng đề cập đến một vị trí bộ nhớ. Sử dụng nhiều biến, các kiểu tham chiếu có thể tham chiếu đến một vị trí bộ nhớ. Nếu dữ liệu trong vị trí bộ nhớ bị thay đổi bởi một trong các biến, thì biến kia sẽ tự động phản ánh sự thay đổi này về giá trị. Ví dụ về các kiểu tham chiếu dựng sẵn là: đối tượng, động và chuỗi.
Kiểu Đối tượng là lớp cơ sở cuối cùng cho tất cả các kiểu dữ liệu trong Hệ thống Kiểu chung C # (CTS). Đối tượng là một bí danh cho lớp System.Object. Các kiểu đối tượng có thể được gán giá trị của bất kỳ kiểu nào khác, kiểu giá trị, kiểu tham chiếu, kiểu được xác định trước hoặc do người dùng xác định. Tuy nhiên, trước khi gán giá trị, nó cần chuyển đổi kiểu.
Khi một kiểu giá trị được chuyển đổi thành kiểu đối tượng, nó được gọi là quyền anh.
Khi một loại đối tượng được chuyển đổi thành một loại giá trị, nó được gọi là unboxing.
Bạn có thể lưu trữ bất kỳ loại giá trị nào trong biến kiểu dữ liệu động. Kiểm tra kiểu cho các loại biến này diễn ra tại thời điểm chạy.
Cú pháp để khai báo một kiểu động là:
dynamic <variable_name> = value;
Ví dụ,
dynamic d = 20;
Kiểu động tương tự như kiểu đối tượng ngoại trừ việc kiểm tra kiểu cho các biến kiểu đối tượng diễn ra tại thời điểm biên dịch, trong khi việc kiểm tra kiểu đối với các biến kiểu động diễn ra tại thời điểm chạy.
Các biến kiểu con trỏ lưu trữ địa chỉ bộ nhớ của kiểu khác. Con trỏ trong C # có cùng khả năng với con trỏ trong C hoặc C ++.
Cú pháp khai báo kiểu con trỏ là:
type* identifier;
Ví dụ
char* cptr;
int* iptr;
là toán tử xác định xem một đối tượng có thuộc một kiểu nhất định hay không.
If (Ford là Xe) // kiểm tra xem Ford có phải là một đối tượng của lớp Xe hay không.
khi toán tử ép kiểu mà không tăng ngoại lệ nếu quá trình ép kiểu không thành công.
Object obj = new StringReader("Hello");
StringReader r = obj as StringReader;
Đóng gói được định nghĩa "là quá trình bao bọc một hoặc nhiều mục trong một gói vật lý hoặc lôgic". Tính đóng gói, trong phương pháp luận lập trình hướng đối tượng, ngăn cản quyền truy cập vào các chi tiết triển khai.
Việc đóng gói được thực hiện bằng cách sử dụng các chỉ định truy cập.
Một chỉ định truy cập xác định phạm vi và khả năng hiển thị của một thành viên lớp.
Bộ chỉ định truy cập công khai cho phép một lớp hiển thị các biến thành viên và các hàm thành viên của nó với các hàm và đối tượng khác. Mọi thành viên công cộng đều có thể được truy cập từ bên ngoài lớp.
Bộ xác định quyền truy cập riêng tư cho phép một lớp ẩn các biến thành viên và các hàm thành viên của nó khỏi các hàm và đối tượng khác. Chỉ các hàm của cùng một lớp mới có thể truy cập các thành viên riêng của nó. Ngay cả một thể hiện của một lớp cũng không thể truy cập các thành viên riêng tư của nó.
Bộ chỉ định truy cập được bảo vệ cho phép một lớp con truy cập các biến thành viên và các hàm thành viên của lớp cơ sở của nó. Bằng cách này, nó giúp thực hiện kế thừa.
Bộ chỉ định truy cập nội bộ cho phép một lớp hiển thị các biến thành viên và hàm thành viên của nó với các hàm và đối tượng khác trong hợp ngữ hiện tại. Nói cách khác, bất kỳ thành viên nào có chỉ định truy cập nội bộ đều có thể được truy cập từ bất kỳ lớp hoặc phương thức nào được xác định trong ứng dụng mà thành viên đó được xác định.
Bộ định nghĩa truy cập nội bộ được bảo vệ cho phép một lớp ẩn các biến thành viên và các hàm thành viên của nó khỏi các đối tượng và hàm của lớp khác, ngoại trừ một lớp con trong cùng một ứng dụng. Điều này cũng được sử dụng trong khi thực hiện kế thừa.
C # cung cấp một kiểu dữ liệu đặc biệt, kiểu nullable, mà bạn có thể gán phạm vi giá trị bình thường cũng như giá trị null.
Ví dụ: bạn có thể lưu trữ bất kỳ giá trị nào từ -2,147,483,648 đến 2,147,483,647 hoặc null trong biến Nullable <Int32>. Tương tự, bạn có thể gán true, false hoặc null trong biến Nullable <bool>.
Toán tử kết hợp null được sử dụng với các kiểu giá trị và kiểu tham chiếu có thể null. Nó được sử dụng để chuyển đổi một toán hạng sang kiểu của một toán hạng kiểu giá trị có thể null (hoặc không) khác, nơi có thể chuyển đổi ngầm định.
Nếu giá trị của toán hạng đầu tiên là null, thì toán tử trả về giá trị của toán hạng thứ hai, ngược lại nó trả về giá trị của toán hạng đầu tiên.
Bằng cách sử dụng từ khóa params, một tham số phương thức có thể được chỉ định để nhận một số lượng thay đổi đối số hoặc thậm chí không có đối số.
Không! các tham số bổ sung không được phép sau từ khóa params trong khai báo phương thức. Chỉ cho phép một từ khóa params trong khai báo phương thức.
Lớp Mảng là lớp cơ sở cho tất cả các mảng trong C #. Nó được định nghĩa trong không gian tên Hệ thống. Lớp Array cung cấp các thuộc tính và phương thức khác nhau để làm việc với mảng.
Sử dụng hàm Array.sort (mảng). Nó sắp xếp các phần tử trong toàn bộ Mảng một chiều bằng cách sử dụng cài đặt IComp so sánh được của từng phần tử của Mảng.
Đầu tiên sắp xếp mảng bằng cách sử dụng Array.sort (mảng) sau đó đảo ngược tương tự bằng cách sử dụng phương thức Array.reverse (mảng).
Trong C #, cấu trúc là một kiểu dữ liệu kiểu giá trị. Nó giúp bạn tạo một biến duy nhất giữ dữ liệu liên quan của nhiều kiểu dữ liệu khác nhau. Từ khóa struct được sử dụng để tạo cấu trúc.
Các cấu trúc được sử dụng để biểu diễn một bản ghi. Để xác định một cấu trúc, bạn phải sử dụng câu lệnh struct. Câu lệnh struct xác định một kiểu dữ liệu mới, với nhiều hơn một thành viên cho chương trình của bạn.
Lớp và Cấu trúc có những khác biệt cơ bản sau:
các lớp là kiểu tham chiếu và cấu trúc là kiểu giá trị.
cấu trúc không hỗ trợ kế thừa.
cấu trúc không thể có hàm tạo mặc định.
Một kiểu liệt kê là một tập hợp các hằng số nguyên được đặt tên. Một kiểu liệt kê được khai báo bằng từ khóa enum.
Các kiểu liệt kê trong C # là kiểu dữ liệu giá trị. Nói cách khác, phép liệt kê chứa các giá trị riêng của nó và không thể kế thừa hoặc không thể truyền thừa kế.
Thông số truy cập mặc định cho một loại lớp là nội bộ.
Quyền truy cập mặc định cho các thành viên là riêng tư.
Một trong những khái niệm quan trọng nhất trong lập trình hướng đối tượng là tính kế thừa. Tính kế thừa cho phép chúng ta xác định một lớp theo nghĩa của một lớp khác, giúp tạo và duy trì một ứng dụng dễ dàng hơn. Điều này cũng tạo cơ hội để sử dụng lại chức năng mã và tăng tốc thời gian thực hiện.
Khi tạo một lớp, thay vì viết các thành viên dữ liệu hoàn toàn mới và các hàm thành viên, lập trình viên có thể chỉ định rằng lớp mới sẽ kế thừa các thành viên của một lớp hiện có. Lớp hiện có này được gọi là lớp cơ sở và lớp mới được gọi là lớp dẫn xuất.
Ý tưởng kế thừa thực hiện mối quan hệ IS-A. Ví dụ, động vật có vú LÀ Động vật, chó IS-Động vật có vú, do đó chó IS-A động vật, v.v.
Không! C # không hỗ trợ đa kế thừa.
Một lớp có thể được dẫn xuất từ nhiều lớp hoặc giao diện, có nghĩa là nó có thể kế thừa dữ liệu và chức năng từ nhiều lớp hoặc giao diện cơ sở. Cú pháp được sử dụng trong C # để tạo các lớp dẫn xuất như sau:
<acess-specifier> class <base_class>
{
...
}
class <derived_class> : <base_class>
{
...
}
Từ đa hình có nghĩa là có nhiều dạng. Trong mô hình lập trình hướng đối tượng, tính đa hình thường được thể hiện là 'một giao diện, nhiều chức năng'.
Tính đa hình có thể là tĩnh hoặc động. Trong đa hình tĩnh, phản hồi đối với một hàm được xác định tại thời điểm biên dịch. Trong đa hình động, nó được quyết định tại thời điểm chạy.
C # cung cấp hai kỹ thuật để triển khai tính đa hình tĩnh. Họ là -
Quá tải chức năng
Người vận hành quá tải
Cơ chế liên kết một hàm với một đối tượng trong thời gian biên dịch được gọi là liên kết sớm. Nó còn được gọi là ràng buộc tĩnh.
Bạn có thể có nhiều định nghĩa cho cùng một tên hàm trong cùng một phạm vi. Định nghĩa của hàm phải khác nhau theo kiểu và / hoặc số lượng đối số trong danh sách đối số. Bạn không thể nạp chồng các khai báo hàm chỉ khác nhau theo kiểu trả về.
Tính đa hình động được thực hiện bởi các lớp trừu tượng và các hàm ảo.
Khi một lớp được khai báo là niêm phong, nó không thể được kế thừa.
Không! Nó không thể được tạo vì các lớp trừu tượng không thể được khai báo là niêm phong.
Khi bạn có một hàm được xác định trong một lớp mà bạn muốn được triển khai trong (các) lớp kế thừa, bạn sử dụng các hàm ảo. Các hàm ảo có thể được triển khai khác nhau trong các lớp kế thừa khác nhau và lệnh gọi các hàm này sẽ được quyết định trong thời gian chạy.
Bạn có thể xác định lại hoặc nạp chồng cho hầu hết các toán tử tích hợp sẵn có trong C #. Do đó, một lập trình viên cũng có thể sử dụng các toán tử với các kiểu do người dùng xác định.
Toán tử được nạp chồng là các hàm có tên đặc biệt là toán tử từ khóa theo sau là ký hiệu cho toán tử đang được định nghĩa. Tương tự như bất kỳ hàm nào khác, toán tử nạp chồng có kiểu trả về và danh sách tham số.
n giao diện được định nghĩa như một hợp đồng cú pháp mà tất cả các lớp kế thừa giao diện phải tuân theo. Giao diện xác định phần 'cái gì' của hợp đồng cú pháp và các lớp dẫn xuất xác định phần 'cách' của hợp đồng cú pháp.
Giao diện xác định các thuộc tính, phương thức và sự kiện, là các thành viên của giao diện. Giao diện chỉ chứa phần khai báo của các thành viên. Lớp dẫn xuất có trách nhiệm xác định các thành viên. Nó thường giúp cung cấp một cấu trúc chuẩn mà các lớp dẫn xuất sẽ tuân theo.
Các chỉ thị tiền xử lý cung cấp hướng dẫn cho trình biên dịch để xử lý trước thông tin trước khi quá trình biên dịch thực sự bắt đầu.
Tất cả các chỉ thị tiền xử lý đều bắt đầu bằng # và chỉ các ký tự khoảng trắng mới có thể xuất hiện trước một chỉ thị tiền xử lý trên một dòng. Các chỉ thị tiền xử lý không phải là các câu lệnh, vì vậy chúng không kết thúc bằng dấu chấm phẩy (;).
Bạn có thể sử dụng chỉ thị #if để tạo một chỉ thị có điều kiện. Các chỉ thị có điều kiện rất hữu ích để kiểm tra một ký hiệu hoặc các ký hiệu để kiểm tra xem chúng có đánh giá là đúng hay không. Nếu chúng đánh giá là true, trình biên dịch sẽ đánh giá tất cả mã giữa #if và chỉ thị tiếp theo.
Các ngoại lệ của C # được đại diện bởi các lớp. Các lớp ngoại lệ trong C # chủ yếu có nguồn gốc trực tiếp hoặc gián tiếp từ lớp System.Exception. Một số lớp ngoại lệ bắt nguồn từ lớp System.Exception là các lớp System.ApplicationException và System.SystemException.
Lớp System.ApplicationException hỗ trợ các ngoại lệ do các chương trình ứng dụng tạo ra. Do đó, các ngoại lệ được định nghĩa bởi các lập trình viên nên bắt nguồn từ lớp này.
Lớp System.SystemException là lớp cơ sở cho tất cả các ngoại lệ hệ thống được xác định trước.
Hơn nữa, bạn có thể xem lại các bài tập trước đây mà bạn đã làm với chủ đề này và đảm bảo rằng bạn có thể nói một cách tự tin về chúng. Nếu bạn tươi tắn hơn thì người phỏng vấn không mong đợi bạn sẽ trả lời những câu hỏi rất phức tạp, thay vào đó bạn phải làm cho các khái niệm cơ bản của bạn thật vững chắc.
Thứ hai, nó thực sự không quan trọng lắm nếu bạn không thể trả lời một số câu hỏi nhưng điều quan trọng là bất cứ điều gì bạn trả lời, bạn phải trả lời một cách tự tin. Vì vậy chỉ cần cảm thấy tự tin trong cuộc phỏng vấn của bạn. Chúng tôi tại tutorialspoint chúc bạn may mắn có được một người phỏng vấn tốt và tất cả những điều tốt nhất cho nỗ lực trong tương lai của bạn. Chúc mừng :-)