Toán Tử
Toán Tử Số Học
Trong Dart, toán tử ~/ được sử dụng để thực hiện phép chia lấy phần nguyên.
assert(10 - 4 == 6);
assert(10 / 3 == 3.3333333333333335);
assert(10 ~/ 3 == 3); // Kết quả là một số nguyên
assert(10 % 3 == 1); // Phần dư
assert('10/3 = ${10 ~/ 3} dư ${10 % 3}' == '10/3 = 3 dư 1');
var x, y;
x = 5;
y = ++x; // Tăng x trước khi gán giá trị cho y.
assert(x == y); // 6 == 6
x = 5;
y = x++; // Tăng x SAU khi gán giá trị cho y.
assert(x != y); // 6 != 5
Toán Tử Quan Hệ
assert(10 == 10);
assert(10 != 20);
assert(20 > 10);
assert(10 < 20);
assert(20 >= 20);
assert(10 <= 20);
Toán Tử Kiểm Tra Kiểu
Toán tử as thực hiện ép kiểu, trong khi is kiểm tra kiểu.
(user as Customer).email = 'alice@example.com';
if (user is Customer) {
// Kiểm tra kiểu
user.email = 'alice@example.com';
}
Toán Tử Gán
Dart cung cấp các toán tử gán và toán tử kết hợp.
// Gán giá trị cho biến a
a = value;
// Gán giá trị cho b nếu b là null; ngược lại, b giữ nguyên giá trị
b ??= value;
var a = 5; // Gán bằng =
a *= 2; // Gán và nhân: a = a * 2
assert(a == 10);
Toán Tử Bitwise
Dart hỗ trợ các toán tử thao tác bit.
final value = 0x44;
final bitmask = 0x0f;
assert((value & bitmask) == 0x04); // AND
assert((value & ~bitmask) == 0x40); // AND NOT
assert((value | bitmask) == 0x4f); // OR
assert((value ^ bitmask) == 0x4b); // XOR
assert((value << 2) == 0x110); // Dịch bit sang trái
assert((value >> 2) == 0x11); // Dịch bit sang phải
Toán Tử Điều Kiện
Toán tử ba ngôi ? : và toán tử null-aware ?? rất hữu ích.
var accessLevel = isAdmin ? 'admin' : 'user';
String getUserName(String name) => name ?? 'Anonymous';
// Phiên bản dài hơn sử dụng toán tử ?:
String getUserName(String name) => name != null ? name : 'Anonymous';
Dấu Chấm Tiếp Theo (Cascade Notation)
Cho phép thực hiện nhiều thao tác trên cùng một đối tượng.
final config = (SettingsBuilder()
..theme = 'dark'
..fontSize = 14
..soundEnabled = true)
.build();
// Tương đương với
var settings = SettingsBuilder().build();
settings.theme = 'dark';
settings.fontSize = 14;
settings.soundEnabled = true;
Câu Lệnh Điều Khiển
Câu lệnh if-else
// if else
if (user.isLoggedIn()) {
showDashboard();
} else if (user.isGuest()) {
showLogin();
} else {
showProfile();
}
Vòng lặp for
var log = StringBuffer('Dart is powerful');
for (var i = 0; i < 3; i++) {
log.write('!');
}
// Ví dụ về giá trị bị bắt
var actions = [];
for (var i = 0; i < 2; i++) {
actions.add(() => print(i));
}
actions.forEach((action) => action()); // 0 1
// Vòng lặp for-in
var numbers = [10, 20, 30];
for (var num in numbers) {
print(num); // 10 20 30
}
Vòng lặp while, do-while, break, continue
// Vòng lặp while
while (!data.isLoaded()) {
loadData();
}
// Vòng lặp do-while
do {
processTask();
} while (!taskQueue.isEmpty());
// Câu lệnh break
while (true) {
if (stopSignal()) break;
executeTask();
}
// Câu lệnh continue
for (int i = 0; i < items.length; i++) {
var item = items[i];
if (item.isExpired()) {
continue;
}
processItem(item);
}
Câu lệnh switch
Câu lệnh `switch` trong Dart có thể kiểm tra các giá trị và hỗ trợ `fall-through`.
var gameState = 'PLAYING';
switch (gameState) {
case 'PAUSED':
pauseGame();
break;
case 'GAME_OVER':
endGame();
break;
case 'PLAYING':
startGame();
break;
default:
showMenu();
}
// Sử dụng continue để thực hiện fall-through
var status = 'ERROR';
switch (status) {
case 'ERROR':
logError();
continue recover;
recover:
case 'RECOVERING':
attemptRecovery();
break;
}
Câu lệnh assert
Dùng để kiểm tra các điều kiện trong quá trình phát triển.
// Đảm bảo biến không null
assert(data != null);
// Đảm bảo giá trị nằm trong một khoảng
assert(score >= 0 && score <= 100);
// Đảm bảo một điều kiện phức tạp
assert(user.age > 18, 'Người dùng phải trên 18 tuổi.');
Xử Lý Ngoại Lệ
Câu lệnh throw
Để ném một ngoại lệ hoặc lỗi.
throw FormatException('Dữ liệu không hợp lệ');
throw 'Lỗi hệ thống!';
void calculateDistance(Point p) => throw UnimplementedError();
Câu lệnh try-catch
Dùng để bắt và xử lý các ngoại lệ.
try {
connectToServer();
} on ConnectionTimeoutException {
showTimeoutMessage();
} on Exception catch (e) {
print('Lỗi không xác định: $e');
} catch (e, s) {
print('Chi tiết lỗi: $e');
print('Ngăn xếp gọi: $s');
}
// Câu lệnh rethrow
void handleRequest() {
try {
processRequest();
} catch (e) {
print('Yêu cầu bị xử lý một phần: ${e.runtimeType}.');
rethrow; // Cho phép các hàm gọi thấy ngoại lệ.
}
}
Câu lệnh finally
Đoạn mã trong `finally` luôn được thực thi, dù có ngoại lệ hay không.
try {
openFile();
} catch (e) {
print('Lỗi: $e');
} finally {
closeFile(); // Luôn đóng file
}