C# Flashcards
IDE
integrated development environment (nơi viết code)
unity và cocos
nền tảng (game engines) để phát triển game
để code game có đồ họa nặng như genshin
nên dùng c++ hoặc c#
int là kiểu dữ liệu gì?
Kiểu dữ liệu số nguyên.
int age = 25;
Console.WriteLine(age);
Khai báo mảng trong C# như thế nào?
int[] numbers = {1, 2, 3, 4, 5};
Câu lệnh switch dùng để làm gì?
Dùng để kiểm tra giá trị của một biến với nhiều điều kiện khác nhau.
char grade = ‘A’;
switch (grade) {
case ‘A’:
Console.WriteLine(“Excellent!”);
break;
case ‘B’:
Console.WriteLine(“Good job.”);
break;
default:
Console.WriteLine(“Keep trying!”);
break;
}
Kết quả: Excellent!
Cách sử dụng if-else trong C#?
if (age >= 18) {
Console.WriteLine(“You are an adult.”);
} else {
Console.WriteLine(“You are underaged.”);
}
Cú pháp vòng lặp for trong C#?
for (int i = 0; i < 5; i++) {
Console.WriteLine(“Hello “ + i);
}
Vòng lặp nào dùng để duyệt qua từng phần tử của mảng?
Vòng lặp foreach.
int[] numbers = {1, 2, 3, 4, 5};
foreach (int number in numbers) {
Console.WriteLine(number);
}
Kết quả:
// 1
// 2
// 3
// 4
// 5
Cách khai báo một hàm không trả giá trị?
void SayHello( ) {
Console.WriteLine(“Hello!”);
}
Hàm có trả giá trị int sẽ khai báo như thế nào?
int Add(int a, int b) {
return a + b;
}
Lớp trong C# là gì?
Lớp là một khuôn mẫu để tạo đối tượng, chứa thuộc tính và phương thức.
class Animal {
public string Name;
public void Speak() {
Console.WriteLine(Name + “ says Hello!”);
}
}
Animal cat = new Animal();
cat.Name = “Kitty”;
cat.Speak(); Kết quả: Kitty says Hello!
Đặc điểm của kế thừa trong OOP?
Một lớp con có thể kế thừa thuộc tính và phương thức của lớp cha.
class Animal {
public void Speak() {
Console.WriteLine(“Animal speaks.”);
}
}
class Dog : Animal {
public void Bark() {
Console.WriteLine(“Dog barks.”);
}
}
Dog myDog = new Dog();
myDog.Speak(); Kết quả: Animal speaks.
myDog.Bark(); Kết quả: Dog barks.
Đa hình (Polymorphism) trong C# là gì?
Đa hình cho phép phương thức có cùng tên nhưng hành vi khác nhau tuỳ vào đối tượng gọi nó (overloading, overriding).
class Animal {
public virtual void Speak() {
Console.WriteLine(“Animal speaks.”);
}
}
class Dog : Animal {
public override void Speak() {
Console.WriteLine(“Dog barks.”);
}
}
Animal myAnimal = new Dog();
myAnimal.Speak(); Kết quả: Dog barks.
Cách sử dụng base trong kế thừa?
base gọi phương thức hoặc thuộc tính của lớp cha.
class Dog : Animal {
public void Speak() {
base.Speak(); // Gọi phương thức của lớp cha
Console.WriteLine(“Woof!”);
}
}
Cách sử dụng get và set trong C#?
public int Age {
get { return age; }
set { if (value >= 0) age = value; }
}
Kiểu dữ liệu float dùng để lưu trữ giá trị nào?
Lưu trữ số thực có dấu, có độ chính xác 7 chữ số thập phân.
float pi = 3.14159f;
Console.WriteLine(pi); Kết quả: 3.14159
Sự khác biệt giữa var và dynamic?
var: Xác định kiểu dữ liệu tại thời điểm biên dịch, không thể thay đổi kiểu sau đó.
dynamic: Xác định kiểu dữ liệu tại thời điểm chạy, có thể thay đổi kiểu.
var x = 10; int
dynamic y = 10; int
y = “Hello”; string (hợp lệ với dynamic)
Giá trị mặc định của kiểu dữ liệu bool là gì?
false.
Cách viết câu lệnh if rút gọn (ternary operator)?
condition ? trueExpression : falseExpression;
vd:
int age = 20;
string message = age >= 18 ? “Adult” : “Minor”;
Console.WriteLine(message); Kết quả: Adult
Câu lệnh else if có thể xuất hiện bao nhiêu lần?
Không giới hạn.
if (score >= 90) {
Console.WriteLine(“A”);
} else if (score >= 80) {
Console.WriteLine(“B”);
} else {
Console.WriteLine(“C”);
}
Khi nào dùng vòng lặp do-while thay vì while?
Khi cần đảm bảo khối lệnh thực thi ít nhất một lần, ngay cả khi điều kiện sai ngay từ đầu.
int count = 1;
do {
Console.WriteLine(“Hello “ + count);
count++;
} while (count <= 3);
Kết quả:
Hello 1
Hello 2
Hello 3
Cú pháp vòng lặp vô hạn trong C#?
while (true) {
// code
}
Hàm có thể trả về nhiều giá trị không?
Không trực tiếp, nhưng có thể sử dụng out hoặc Tuple.
(int, int) GetMinMax(int[] numbers) {
return (numbers.Min(), numbers.Max());
}
var result = GetMinMax(new[] {1, 2, 3, 4, 5});
Console.WriteLine(result.Item1); // Min
Console.WriteLine(result.Item2); // Max
Sự khác biệt giữa ref và out?
ref: Biến phải được gán giá trị trước khi gọi hàm.
out: Biến không cần gán giá trị trước, nhưng phải gán trong hàm.
Tính đóng gói (encapsulation) đảm bảo điều gì?
Dữ liệu chỉ có thể truy cập thông qua các phương thức hoặc thuộc tính được cấp quyền.
Interface khác gì Abstract Class?
Interface chỉ chứa khai báo, không có logic.
Abstract Class có thể chứa cả khai báo lẫn logic.
interface IAnimal {
void Speak();
}
abstract class Animal {
public abstract void Speak();
public void Eat() {
Console.WriteLine(“Eating…”);
}
}
sealed trong C# là gì?
Từ khóa sealed ngăn không cho lớp hoặc phương thức bị kế thừa.
sealed class Dog {
public void Bark() {
Console.WriteLine(“Woof!”);
}
}
// class Poodle : Dog { } // Lỗi biên dịch
override khác gì new trong phương thức?
override: Ghi đè phương thức của lớp cha.
new: Ẩn phương thức của lớp cha.
Sự khác biệt giữa throw và throw ex?
throw: Bảo toàn thông tin stack trace ban đầu.
throw ex: Xóa stack trace ban đầu.
try {
throw new Exception(“Error occurred!”);
} catch (Exception ex) {
throw; // Bảo toàn stack trace
}
Cú pháp try-catch-finally trong C#?
try {
// code có thể gây lỗi
} catch (Exception ex) {
// xử lý lỗi
} finally {
// khối lệnh luôn được thực thi
}
LINQ dùng để làm gì?
Truy vấn dữ liệu từ các nguồn khác nhau (mảng, danh sách, cơ sở dữ liệu) bằng cú pháp thống nhất.
int[] numbers = {1, 2, 3, 4, 5};
var evenNumbers = numbers.Where(n => n % 2 == 0);
foreach (var num in evenNumbers) {
Console.WriteLine(num);
}
// Kết quả:
// 2
// 4
Từ khóa const khác gì với readonly?
const: Giá trị cố định, phải được gán ngay khi khai báo.
readonly: Giá trị có thể được gán tại thời điểm khai báo hoặc trong constructor.
Biến có thể sử dụng trước khi khởi tạo giá trị không?
Không, biến phải được khởi tạo trước khi sử dụng.
Phạm vi của biến toàn cục (static) là gì?
Có phạm vi toàn cục, thuộc về lớp thay vì đối tượng cụ thể.
Câu lệnh switch trong C# có hỗ trợ so sánh kiểu chuỗi không?
Có.
string color = “red”;
switch (color) {
case “red”:
Console.WriteLine(“Red selected”);
break;
case “blue”:
Console.WriteLine(“Blue selected”);
break;
default:
Console.WriteLine(“No color selected”);
break;
}
Có thể sử dụng goto trong câu lệnh switch không?
Có, nhưng không được khuyến khích.
switch (choice) {
case 1:
Console.WriteLine(“Option 1”);
goto case 2;
case 2:
Console.WriteLine(“Option 2”);
break;
}
Lệnh break dùng để làm gì trong vòng lặp?
Dùng để thoát khỏi vòng lặp hiện tại.
Sự khác biệt giữa continue và break là gì?
break: Thoát hẳn khỏi vòng lặp.
continue: Bỏ qua lần lặp hiện tại, chuyển sang lần lặp kế tiếp.
Vòng lặp foreach có thể chỉnh sửa giá trị của các phần tử trong danh sách không?
Không, chỉ được phép đọc giá trị.
Hàm params dùng để làm gì?
Cho phép truyền một số lượng tham số không cố định vào hàm.
void PrintNumbers(params int[] numbers) {
foreach (int num in numbers) {
Console.WriteLine(num);
}
}
PrintNumbers(1, 2, 3, 4);
Tham số optional trong hàm là gì?
Là tham số có giá trị mặc định, có thể không được truyền vào khi gọi hàm.
void Greet(string name = “Guest”) {
Console.WriteLine(“Hello, “ + name);
}
Greet(); Kết quả: Hello, Guest
Hàm Main trong C# luôn trả về kiểu dữ liệu gì?
Có thể trả về void hoặc int.
Từ khóa this dùng để làm gì?
Dùng để tham chiếu đến chính đối tượng hiện tại.
class Person {
private string name;
public void SetName(string name) {
this.name = name; // Tham chiếu đến biến của lớp
}
}
Constructor có thể bị ghi đè không?
Không, nhưng có thể sử dụng nhiều constructor với tham số khác nhau (overloading).
Sự khác biệt giữa public, private, protected và internal là gì?
public: Truy cập được từ bất kỳ đâu.
private: Chỉ truy cập được bên trong lớp.
protected: Truy cập được trong lớp và lớp kế thừa.
internal: Chỉ truy cập được trong cùng một assembly.
Từ khóa base dùng để làm gì?
Gọi phương thức hoặc constructor của lớp cha.
Tại sao cần dùng tính đa hình (polymorphism)?
Để cho phép cùng một phương thức hoạt động khác nhau dựa trên đối tượng cụ thể.
Phương thức virtual có cần ghi đè không?
Không bắt buộc, nhưng có thể ghi đè khi cần.
Có thể sử dụng nhiều khối catch trong cùng một try không?
Có, mỗi catch xử lý một loại ngoại lệ cụ thể.
Làm sao để viết ngoại lệ tùy chỉnh (custom exception)?
Kế thừa lớp Exception.
class MyCustomException : Exception {
public MyCustomException(string message) : base(message) {}
}
LINQ có thể sắp xếp dữ liệu theo thứ tự giảm dần không?
Có, dùng OrderByDescending.
LINQ hỗ trợ các phương thức nào để nhóm dữ liệu?
Hỗ trợ GroupBy.
var grouped = students.GroupBy(s => s.Class);