# Variables

---

`Variables` are named containers to store data.

In Dart:

```dart
void main() {
  String name = 'Ali';
  int age = 22;
  double score = 95.5;
  bool isStudent = true;

  print(name); // Ali
}
```

الاتنين صحيح، لكن الأفضل في Dart هو:

```dart
print("My name is $name");
```

لأنه:
- أنظف وأسهل قراءة
- الطريقة القياسية في Dart ([[string interpolation]])

والثانية:

```dart
print("My name is " + name);
```

تعمل أيضًا، لكنها أقل استخدامًا.

Common ways:

```dart
var city = 'Cairo';      // type inferred
final country = 'Egypt'; // set once
const pi = 3.14;         // compile-time constant
```

فهمني
- `var` = inferred type  
- `final` = assigned once (runtime)  
- `const` = compile-time constant

وإزاي مش واضع نوع المتغير قبله؟

ممتاز، خليني أبسطها:

- `var` = **type inference**  
يعني Dart تحدد `type` من أول قيمة:

```dart
var name = 'Ali';   // String
var age = 20;       // int
```

بعد كده النوع يثبت، يعني ما ينفعش:

```dart
var x = 'Ali';
x = 10; // Error
```

- `final` = **assigned once (runtime)**  
القيمة تتحدد مرة واحدة فقط وقت التشغيل:

```dart
final now = DateTime.now(); // runtime value
```

ينفع بدون كتابة النوع لأن Dart تستنتجه:

```dart
final String city = 'Cairo'; // explicit type (optional)
final city = 'Cairo';        // inferred type
```

- `const` = **compile-time constant**  
لازم القيمة تكون معروفة قبل التشغيل:

```dart
const pi = 3.14;
const appName = 'MyApp';
```

ده غلط لأن مش compile-time:

```dart
const time = DateTime.now(); // Error
```

سؤالك: إزاي بدون type قبله؟  
الإجابة: Dart فيها **type inference**، فالـ compiler يعرف النوع من القيمة الأولى تلقائيًا.  
ولو تحب الوضوح أكثر، اكتب النوع صراحة (`String`, `int`) وهذا صحيح أيضًا.

بالضبط، دي أهم فايدة `variables`: **تغيّر من مكان واحد بدل ما تعدّل في كل سطر**.

بدل:

```dart
print('There once was a man named Ahmed');
print('He was 50 years old');
print('He really liked the name Ahmed');
print('But he did not like being 50');
```

استخدم:

```dart
void main() {
  String name = 'Ahmed';
  int age = 50;

  print('There once was a man named $name');
  print('He was $age years old');
  print('He really liked the name $name');
  print('But he did not like being $age');
}
```

الآن لو غيّرت:
- `name = 'Ali'`
- `age = 22`

كل الجمل تتحدث تلقائيًا.  
هذا يخلي الكود **أسرع في التعديل، أقل أخطاء، وأسهل صيانة**.

[[String Functions]]

[[Numbers Functions]]

[[Data Type]]

[[property]]

[[Sound Null Safety (Dart)]]