Các Toán Tử và Cấu Trúc Điều Khiển trong Dart

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
}

Thẻ: Dart toán tử Cấu trúc điều khiển ngoại lệ assert

Đăng vào ngày 4 tháng 6 lúc 22:00