गैर-अशक्त (डिफ़ॉल्ट रूप से)
गैर-अशक्त (डिफ़ॉल्ट रूप से) प्रयोग वर्तमान में nullsafety.dartpad.dev पर पाया जा सकता है ।
ध्यान रखें कि आप यहां पूरी युक्ति और पूर्ण रोडमैप पढ़ सकते हैं ।
डिफ़ॉल्ट रूप से गैर-अशक्त क्या है?
void main() {
String word;
print(word); // illegal
word = 'Hello, ';
print(word); // legal
}
जैसा कि आप ऊपर देख सकते हैं, एक चर डिफ़ॉल्ट रूप से गैर-अशक्त होने का मतलब है कि सामान्य रूप से घोषित किया गया प्रत्येक चर नहीं हो सकता है null
। नतीजतन, चर को असाइन करने से पहले किसी भी ऑपरेशन को सौंपा गया है वह अवैध है।
इसके अतिरिक्त, null
गैर-अशक्त चर को असाइन करने की भी अनुमति नहीं है:
void main() {
String word;
word = null; // forbidden
world = 'World!'; // allowed
}
यह मुझे कैसे मदद करता है?
यदि एक चर गैर-अशक्त है , तो आप सुनिश्चित कर सकते हैं कि यह कभी नहीं है null
। जिसकी वजह से, आपको इसे पहले से जांचने की आवश्यकता नहीं है।
int number = 4;
void main() {
if (number == null) return; // redundant
int sum = number + 2; // allowed because number is also non-nullable
}
याद है
यदि वे अशक्त नहीं हैं, तो कक्षाओं में उदाहरण क्षेत्रों को आरंभीकृत किया जाना चाहिए :
class Foo {
String word; // forbidden
String sentence = 'Hello, World!'; // allowed
}
late
इस व्यवहार को संशोधित करने के लिए नीचे देखें ।
अशक्त प्रकार ( ?
)
आप चर प्रकार पर प्रश्न चिह्न लगाकर अशक्त प्रकारों का उपयोग कर सकते हैं ?
:
class Foo {
String word; // forbidden
String? sentence; // allowed
}
एक अशक्त चर का उपयोग करने से पहले इसे आरंभ करने की आवश्यकता नहीं है। यह null
डिफ़ॉल्ट रूप से आरंभिक है :
void main() {
String? word;
print(word); // prints null
}
!
!
किसी भी वेरिएबल पर अप्लाई करने पर e
एक रनटाइम एरर आएगा, अगर e
यह शून्य है और अन्यथा इसे नॉन-न्युलेबल वैल्यू में बदल दिया जाए v
।
void main() {
int? e = 5;
int v = e!; // v is non-nullable; would throw an error if e were null
String? word;
print(word!); // throws runtime error if word is null
print(null!); // throws runtime error
}
late
कीवर्ड का late
उपयोग उन चर को चिह्नित करने के लिए किया जा सकता है जिन्हें बाद में आरम्भ किया जाएगा , अर्थात जब वे घोषित नहीं किए जाते हैं लेकिन जब वे एक्सेस किए जाते हैं। इसका अर्थ यह भी है कि हमारे पास गैर-अशांत उदाहरण क्षेत्र हो सकते हैं, जिन्हें बाद में आरम्भ किया गया है:
class ExampleState extends State {
late String word; // non-nullable
@override
void initState() {
super.initState();
// print(word) here would throw a runtime error
word = 'Hello';
}
}
word
आरंभ करने से पहले एक्सेस करना एक रनटाइम त्रुटि को फेंक देगा।
late final
अंतिम चर अब देर से भी चिह्नित किए जा सकते हैं:
late final int x = heavyComputation();
यहां पहुंचने के heavyComputation
बाद ही कॉल किया जाएगा x
। इसके अतिरिक्त, आप late final
बिना एक आरंभक के भी घोषणा कर सकते हैं , जो कि केवल एक late
चर होने के समान है , लेकिन इसे केवल एक बार सौंपा जा सकता है।
late final int x;
// w/e
x = 5; // allowed
x = 6; // forbidden
ध्यान दें कि एक शुरुआती के साथ सभी शीर्ष-स्तरीय या स्थिर चर का अब मूल्यांकन किया जाएगा late
, चाहे वे कोई भी हों final
।
required
पूर्व में एक एनोटेशन ( @required
), जिसे अब एक संशोधक के रूप में बनाया गया है। यह किसी भी नामित पैरामीटर (कार्यों या कक्षाओं के लिए) को चिह्नित करने की अनुमति देता है required
, जो उन्हें गैर-अशक्त बनाता है:
void allowed({required String word}) => null;
इसका अर्थ यह भी है कि यदि कोई पैरामीटर गैर-अशक्त होना चाहिए , required
तो उसे डिफ़ॉल्ट मान के रूप में चिह्नित किया जाना चाहिए :
void allowed({String word = 'World'}) => null;
void forbidden({int x}) // compile-time error because x can be null (unassigned)
=>
null;
किसी अन्य नामित पैरामीटर को अशक्त होना चाहिए :
void baz({int? x}) => null;
?[]
अशक्त जागरूक ?[]
ऑपरेटर को इंडेक्स ऑपरेटर के लिए जोड़ा गया था []
:
void main() {
List<int>? list = [1, 2, 3];
int? x = list?[0]; // 1
}
सिंटैक्स निर्णय के बारे में यह लेख भी देखें ।
?..
कैस्केड ऑपरेटर के पास अब एक नया अशक्त ऑपरेटर भी है ?..
:।
यह निम्न कैसकेड संचालन का कारण बनता है केवल प्राप्तकर्ता निष्पादित नहीं होने पर निष्पादित किया जाता है । इसलिए, ?..
कैस्केड अनुक्रम में पहला कैस्केड ऑपरेटर होना चाहिए:
void main() {
Path? path;
// Will not do anything if path is null.
path
?..moveTo(3, 4)
..lineTo(4, 3);
// This is a noop.
(null as List)
?..add(4)
..add(2)
..add(0);
}
Never
भ्रम से बचने के लिए: यह ऐसा कुछ नहीं है जिसके बारे में डेवलपर्स को चिंता करनी होगी। मैं इसे संपूर्णता के लिए उल्लेख करना चाहता हूं।
Never
में पहले से मौजूद Null
( नहींnull
) की तरह एक प्रकार होने जा रहा है dart:core
। इन दोनों वर्गों को विस्तारित, कार्यान्वित या मिश्रित नहीं किया जा सकता है, इसलिए उनका उपयोग करने का इरादा नहीं है।
अनिवार्य रूप से, Never
इसका मतलब है कि किसी भी प्रकार की अनुमति नहीं है और Never
खुद को तत्काल नहीं किया जा सकता है।
कुछ भी नहीं है लेकिन Never
सूची List<Never>
के सामान्य प्रकार की बाधा को संतुष्ट करता है, जिसका अर्थ है कि इसे खाली होना है । List<Null>
हालाँकि, इसमें शामिल हो सकते हैं null
:
// Only valid state: []
final neverList = <Never>[
// Any value but Never here will be an error.
5, // error
null, // error
Never, // not a value (compile-time error)
];
// Can contain null: [null]
final nullList = <Null>[
// Any value but Null will be an error.
5, // error
null, // allowed
Never, // not a value (compile-time error)
Null, // not a value (compile-time error)
];
उदाहरण: कंपाइलर List<Never>
एक खाली के लिए अनुमान लगाएगा const List<T>
।
Never
जहाँ तक मैं चिंतित हूँ, प्रोग्रामर द्वारा उपयोग नहीं किया जाना चाहिए।
Never
उपयोग किया जा सकता है?