Null Safety یکی از ویژگیهای جدید است که با اضافه شدن در نسخه 2.12 به دارت اضافه شده است. این ویژگی به برنامه نویسان کمک میکند تا در هنگام توسعه برنامهها، از خطاهای Null Reference بیشتری جلوگیری کنند.
در Null Safety، هر متغیر و پارامتری که تعریف میشود، به صورت پیشفرض غیر null تلقی میشود. به عبارت دیگر، اگر برای یک متغیری مقداری تعیین نشود، این متغیر به صورت خودکار null نخواهد شد و به جای آن، یک خطا ایجاد میشود.
برای استفاده از Null Safety در کلاسها در زبان دارت، شما میتوانید از علامت ? برای تعریف متغیرهای Null Safety استفاده کنید. این علامت به برنامه نویس کمک میکند تا به کامپایلر بگوید که میخواهد از متغیر Null Safety استفاده کند. به عنوان مثال، برای تعریف یک کلاس Student با Null Safety، میتوانید به صورت زیر عمل کنید:
class Student {
String? name;
int? age;
}
در مثال بالا متغیرهای name و age با استفاده از علامت ? به عنوان Null Safety تعریف شدهاند. این به برنامه نویس کمک میکند که در هنگام استفاده از این متغیرها، خطای Null Reference را از دست ندهد.
در کلاسهایی که از Null Safety استفاده میکنند، میتوانید از عملگر ? برای دسترسی به متغیرها استفاده کنید. این عملگر به برنامه نویس کمک میکند تا در هنگام دسترسی به متغیرها، از خطاهای Null Reference جلوگیری کند. به عنوان مثال، برای دسترسی به متغیر name در کلاس Student، میتوانید به صورت زیر عمل کنید:
class Student {
String? name;
int? age;
void printName() {
print(name?.toUpperCase());
}
}
در مثال قبل با استفاده از عملگر ? در متد printName()، برنامه نویس میتواند از خطاهای Null Reference جلوگیری کند. اگر متغیر name مقدار null داشته باشد، برنامه نویس با استفاده از عملگر ? میتواند خطای Null Reference را از دست بدهد و به جای آن یک مقدار null به عنوان خروجی دریافت کند.
به طور کلی استفاده از Null Safety در کلاسها در زبان دارت به برنامه نویسان کمک میکند تا در هنگام توسعه برنامهها، از خطاهای Null Reference بیشتری جلوگیری کنند و برنامههایی با عملکرد بهتر و امن تر تولید کنند.
همچنین در کلاسهایی که از Null Safety استفاده میکنند، میتوانید از علامت ! برای تعیین اینکه یک متغیر Null Safety حتما باید مقدار دهی شود استفاده کنید. این علامت به برنامه نویس کمک میکند تا به کامپایلر بگوید که متغیر Null Safety حتما باید مقدار دهی شود، در غیر این صورت یک خطا ایجاد میشود. به عنوان مثال:
class Person {
String name;
int age;
Person(this.name, this.age);
void printName() {
print(name!.toUpperCase());
}
}
در مثال قبل متغیر name با استفاده از علامت ! به عنوان یک متغیر Null Safety تعریف شده است، اما با توجه به اینکه متغیر name در constructor کلاس مقداردهی میشود، برنامه نویس میتواند از علامت ! استفاده کند و به کامپایلر بگوید که این متغیر حتما مقداردهی شده است و مقدار null ندارد.
به طور خلاصه، استفاده از Null Safety در کلاسها در دزبان دارت به برنامه نویسان کمک میکند تا در هنگام توسعه برنامهها، از خطاهای Null Reference بیشتری جلوگیری کنند و برنامههایی با عملکرد بهتر و امنتر تولید کنند. در کلاسهایی که از Null Safety استفاده میکنند، میتوانید از علامت ? و ! برای تعیین متغیرها در صورت نیاز به استفاده از متغیرهای Null Safety استفاده کنید و با استفاده از این قابلیتها، از خطاهای Null Reference جلوگیری کنید. همچنین، با استفاده از علامت !، میتوانید به کامپایلر بگویید که یک متغیر حتما مقداردهی شده است و مقدار null ندارد.
میتوان گفت که استفاده از Null Safety در زبان دارت یکی از ویژگیهای جدید و مهم این زبان برنامهنویسی است که به برنامهنویسان کمک میکند تا برنامههایی با کیفیت بهتر و امن تر تولید کنند. با استفاده از Null Safety، برنامهنویسان میتوانند از خطاهای Null Reference جلوگیری کنند و برنامههایی با امنیت بیشتر و عملکرد بهتر تولید کنند.
در ادامه 3 مثال از استفاده از Null Safety در زبان دارت را برای شما میآورم:
class User {
final String name;
final int? age;
User({required this.name, this.age});
void printDetails() {
print("Name: $name");
if (age != null) {
print("Age: $age");
}
}
}
در مثال بالا کلاس User شامل دو متغیر name و age است. متغیر name یک متغیر غیر Null Safety است و در constructor کلاس مقداردهی میشود. اما متغیر age یک متغیر Null Safety است و مقدار اولیه آن null میباشد. در روش printDetails، ابتدا نام کاربر را چاپ میکنیم و سپس با استفاده از if، بررسی میکنیم که آیا متغیر age مقدار null ندارد یا خیر. اگر مقدار null نداشته باشد، سپس سن کاربر را چاپ میکنیم.
class Car {
final String? make;
final String? model;
Car({this.make, this.model});
String getMakeAndModel() {
if (make == null || model == null) {
return "Unknown";
} else {
return "$make $model";
}
}
}
در مثال بالا کلاس Car شامل دو متغیر make و model است که هر دو متغیر Null Safety هستند. در constructor کلاس، این متغیرها مقداردهی میشوند اما ممکن است که مقداری از آنها null باشد. در روش getMakeAndModel، با استفاده از if، بررسی میکنیم که آیا هر دو متغیر make و model مقدار null ندارند یا خیر. اگر حداقل یکی از این متغیرها مقدار null داشته باشد، مقدار “Unknown” برگردانده میشود. اما اگر هر دو متغیر make و model مقدار داشته باشند، آنگاه مقدار “$make $model” برگردانده میشود.
class Shape {
final String name;
final double? width;
final double? height;
Shape({required this.name, this.width, this.height});
double getArea() {
if (width == null || height == null) {
return 0;
}
return width * height;
}
}
در مثال قبلی کلاس Shape شامل سه متغیر name، width و height است که name یک متغیر غیر Null Safety است و width و height دو متغیر Null Safety هستند. در constructor کلاس، مقدار name بدون مشکل مقداردهی میشود. اما مقدارهای width و height ممکن است null باشند. در روش getArea، ابتدا با استفاده از if، بررسی میکنیم که آیا هر دو متغیر width و height مقدار null ندارند یا خیر. اگر حداقل یکی از این متغیرها مقدار null داشته باشد، مقدار 0 برگردانده میشود. اما اگر هر دو متغیر width و height مقدار داشته باشند، آنگاه محاسبه مساحت شکل (width * height) انجام شده و مقدار حاصل برگردانده میشود.
با استفاده از Null Safety در زبان دارت، میتوانیم خطاهایی که از مقادیر null ناشی میشوند را به سادگی مدیریت کنیم و کدی ایمن تر بنویسیم.