---
# System prepended metadata

title: Symbol
tags: [基本類型]

---


# [Symbol](https://api.dart.dev/dart-core/Symbol-class.html) 
在 Dart 語言中，Symbol 是一個特別的類，用於表示程序中的標識符名稱，例如變數名、方法名、類名等。它的主要作用是幫助處理反射和動態操作的場景，讓你能夠以動態方式引用或操作標識符。

以下是關於 Symbol 的詳細解釋和用途：

1. Symbol 的特性
**標識符的表示方式**：Symbol 代表的是程序中某個標識符的名字，而不是標識符的值或類型。它用於以動態的方式訪問或操作標識符。
**不可變性**：一旦創建，Symbol 是不可變的。
**反射用途**：Symbol 通常與 Dart 的 dart:mirrors 庫結合使用，用於反射場景（例如動態調用方法或訪問屬性）。
**內存優化**：Dart 使用 Symbol 來有效地管理標識符名稱的內存，減少重複名稱的存儲。
2. 如何創建 Symbol
你可以通過以下兩種方式創建 Symbol：
(1) 使用 Symbol 構造函數
`Symbol mySymbol = Symbol('myIdentifier');`
(2) 使用符號文字 (#)
`var mySymbol = #myIdentifier;`
3. 使用範例
(1) 基本的 Symbol
```
void main() {
  Symbol symbol1 = Symbol('example');
  Symbol symbol2 = #example;

  print(symbol1); // Output: Symbol("example")
  print(symbol2); // Output: Symbol("example")
}
```
(2) 用於動態調用方法（需要反射庫 dart:mirrors）
在某些場景下，Symbol 可以用於動態訪問或調用類的成員：

```
import 'dart:mirrors';

class Example {
  void sayHello() => print('Hello, Dart!');
}

void main() {
  var example = Example();
  var instanceMirror = reflect(example);

  // 使用 Symbol 動態調用方法
  instanceMirror.invoke(#sayHello, []);
  // Output: Hello, Dart!
}
```
4. Symbol 的主要作用
(1) 反射操作
Dart 的 dart:mirrors 庫提供了反射功能，而 Symbol 是其中的一個重要組成部分。
你可以使用 Symbol 動態調用方法、訪問屬性，或者查找類或方法的名稱。
(2) 確保命名的唯一性
使用 Symbol 可以避免命名衝突，因為它是一種底層的表示方式，無需直接處理具體的名稱字串。
(3) 高效處理標識符名稱
在需要大量處理標識符名稱的場景中，Symbol 提供了一種內存高效的解決方案。
5. Symbol 的比較與操作
Symbol 可以進行比較，因為 Dart 保證相同名稱的 Symbol 是相等的：
```
void main() {
  var symbol1 = #example;
  var symbol2 = Symbol('example');

  print(symbol1 == symbol2); // Output: true
}
```
即使創建方式不同，但只要名稱相同，這些 Symbol 就是相等的。

6. 限制
**無法直接存取標識符的值或類型**：
Symbol 只代表標識符的名稱，不能提供其對應的值或類型。
**反射在現代 Dart 中使用有限**：
由於 Dart 更傾向於靜態類型和編譯時檢查，反射功能在現代 Dart 中使用得較少，尤其在 Web 和 Mobile 領域。
**動態操作性能開銷**：
使用反射和 Symbol 進行動態操作時，性能可能不如靜態方法高效。
7. 結論
在 Dart 中，Symbol 的作用主要是提供一種高效、靈活的方式來表示標識符名稱，並支持反射操作。雖然它的應用場景在現代 Dart 中相對有限，但在需要動態操作、反射或處理元數據的場景中，Symbol 依然非常有用。
你可以將其理解為一種工具，用於處理標識符的名字而非具體的值或邏輯操作。