当前位置: 首页 > news >正文

Dart 3.5语法 28-29

028问号可选类型可空类型保存null空String的isEmpty和NotEmpty

?问号可选类型可空类型保存null叹号强制解包??双冒号运算符String的isEmpty和isNotEmpty

  • ? 问号可选类型,可空类型

  • 可选类型可以保存null,就是空的意思

  • String.isEmpty 是判断是否是空白字符串,他并不是null,不是空,依然有值,只不过值是空白字符串""

  • isNotEmpty跟isEmpty完全相反,是判断是否不是空白字符串

  • 如果给可选类型赋值null,那么isEmpty不能运行

  • !强制解包,把可选类型变成非可选类型,例如把String?变成String,把int? 变成int但是如果可选类型里面保存的值是null,那么运行报错

  • str!; //!强制解包,把?可选类型变成正常的String类型,但是因为str!强制解包以后,里面真的是一个null,运行会报错

  • 双冒号?? 运算符,代表,如果?? 左边是null,那么就返回右边的值,如果左边不是null,那么就返回做编制

1. 问号可选类型(可空类型)

 main() {// ? 问号可选类型,可空类型int? i1 = 100;i1 = null; // null代表空print(i1);}

运行结果

 null

解释

  • int? i1 = 100; 定义了一个可选类型(可空类型)的变量 i1,它可以存储 int 类型的值,也可以是 null

  • i1 = null;i1 赋值为 null,表示该变量不保存任何有效值。

  • print(i1); 输出 null,因为 i1 被赋值为 null


2. 可选类型的默认值

 main() {// 如果可选类型没有赋值初始值,那么默认值是nullint? i2;print(i2);}

运行结果

 null

解释

  • int? i2; 声明了一个可选类型的变量 i2,但是没有给它赋初值。

  • Dart 中可选类型(?)的变量如果没有显式赋值,则默认值是 null

  • print(i2); 输出 null,因为 i2 没有赋值,默认值为 null

3. 字符串可选类型

 main() {String? str;str = "abc";print(str);}

运行结果

 abc

解释

  • String? str; 声明了一个可选类型的字符串变量 str,它可以存储一个 String 类型的值或 null

  • str = "abc";str 赋值为一个非空字符串 "abc"

  • print(str); 输出 abc,因为 str 被赋值为字符串 "abc"

4. 使用 isEmptyisNotEmpty 判断字符串是否为空

 main() {String? str;str = "abc";​bool r1 = str.isEmpty;  // 判断str是否为空字符串(""),此时str为"abc",返回falser1 = str.isNotEmpty;  // 判断str是否不是空字符串,此时str为"abc",返回true​print(r1);}

运行结果

 true

解释

  • str.isEmpty; 判断 str 是否为空字符串。由于 str 的值是 "abc",它不是空字符串,因此 isEmpty 返回 false

  • str.isNotEmpty; 判断 str 是否不是空字符串。由于 str 的值是 "abc",它不是空字符串,因此 isNotEmpty 返回 true

  • print(r1); 输出 true,因为最后 r1 保存的是 str.isNotEmpty 的返回值。

029可空类型叹号强制解包问号双问号运算符trycatch捕获异常

1. 强制解包(!

 // 因为可选类型不能进行 运算,例如 判断是否 >60,所以用 !强制解包,把 可选类型变成普通的非空类型// !强制解包,把可选类型变成非可选类型,例如把String?变成String,把int? 变成int但是如果可选类型里面保存的值是null,那么运行报错//把可选类型当做函数形参/*try{//容易出错的代码}catch(e){//出错后执行的代码}*/
  • score! 是 Dart 中的 强制解包运算符。它的作用是将一个可选类型(例如 int?,即可以为 nullint 的类型)转换为非空类型(int)。

  • score 是一个 int? 类型的变量,意味着它可以存储一个 int 或者 null。但通过 ! 运算符,开发者明确告诉 Dart 编译器:“我确定 score 不是 null,请将其作为非空的 int 来处理。”

  • 如果 score 的值为 null,在执行 score! 时,Dart 会抛出一个运行时异常,程序会中断。

 fn1(int? score) {// 强制解包try {score!; // 当强制解包里面存的值是null的时候,程序会中断if (score > 60) {print("及格");} else {print("不及格");}} catch (e) {print("e=$e");}​var s2 = score; // 上面的强制解包在try里面,作用于不一样,这里score没有去掉null,还是可选类型score = 100;// score!; // 这里运行会有警告,因为上面已经给score赋值了0,那么编译器已经把score当做int类型来看,不能再使用强制解包}

运行结果

  • 如果传递

     null

     score

    ,程序会抛出异常并输出:

     e=NoSuchMethodError: The method '>' was called on null.
  • 如果传递

     100

     score

    ,程序会输出:

     及格

解释

  • score! 是强制解包,它将可选类型(int?)转换为非空类型(int)。如果 scorenull,解包时程序会抛出异常。

  • try-catch 语句中,catch 捕获了异常并打印了错误信息。

  • score 被赋值为 100 后,强制解包就不会再出错,程序判断并输出 "及格"

2. 警告:强制解包后的类型

 score = 100;score!;  // 这里运行会有警告,因为score已经被赋值为int类型

运行结果

没有输出,但会在编译时显示警告:

 Warning: Operand of null-aware operation '!' has type 'int' which excludes null.

解释

  • score 已经被赋值为 100,它的类型变成了 int,不再是可选类型 int?。此时,再使用 ! 强制解包会导致编译时警告,因为 score 已经是一个非空类型,! 强制解包不再适用。

3. 双问号运算符(??

 fn2(String? str) {var str2 = str ?? "默认值";print("str2=$str2");str=“abc”;str;//这里已经变成了String//这里因为str是String所以不能用 ??去运算,会有警告Warning: Operand of null-aware operation '??' has type 'String' which excludes null.}

运行结果

  • 如果传递

     "abc"

     str

    ,输出:

     str2=abc
  • 如果传递

     null

     str

    ,输出:

    str2=默认值

解释

  • 这段代码处理了 null 值的情况,当 strnull 时,提供一个默认值。

  • 双冒号?? 运算符,代表,如果?? 左边是null,那么就返回右边的值,如果左边不是null,那么就返回左边的值

  • str.isEmpty;//注意可选类型不能直接使用在String的方法,需要先转化成String类型

  • var str2 = str!;//之前我们用强制解包,但是如果遇到null就会中断,需要用try catch来捕获异常

4. 使用 ?. 运算符

fn3(String? str) {var r1 = str?.isEmpty ?? false;print("r1=$r1");
}

运行结果

  • 如果传递

    "abc"

    str

    ,输出:

    r1=true
  • 如果传递

    null

    str

    ,输出:

    r1=false

解释

  • ?. 运算符是可空类型的安全访问运算符。它会检查 str 是否为 null,如果是 null,则直接返回 null,否则调用 isEmpty 方法。

  • 如果 strnullr1 会被赋值为 false(通过 ?? 提供默认值)。如果 str 是非 null 字符串,则调用 isEmpty 方法判断字符串是否为空。

5. 综合示例:强制解包与空值判断

main() {fn1(null);   fn1(100);   int? i1 ;i1 > 100;var i2=i1;fn2("abc");  fn2(null);   fn3("abc"); fn3(null);  
}

运行结果

e=NoSuchMethodError: The method '>' was called on null.
及格
str2=abc
str2=默认值
r1=true
r1=false

解释

  • fn1(null):传递 nullscore,程序会抛出异常并输出错误信息。

  • fn1(100):传递 100score,程序不会抛出异常,并输出 "及格"

  • fn2("abc"):传递 "abc"str,返回 str 本身,输出 "str2=abc"

  • fn2(null):传递 nullstr,返回默认值 "默认值",输出 "str2=默认值"

  • fn3("abc"):传递 "abc"str,检查是否为空,输出 r1=true

  • fn3(null):传递 nullstr,由于 strnull,输出 r1=false

相关文章:

Dart 3.5语法 28-29

028问号可选类型可空类型保存null空String的isEmpty和NotEmpty ?问号可选类型可空类型保存null叹号强制解包??双冒号运算符String的isEmpty和isNotEmpty ? 问号可选类型,可空类型 可选类型可以保存null,就是空的意思 String.isEmpty 是判断是否是空白字符串,他并不是null…...

利用AFE+MCU构建电池管理系统(BMS)

前言 实际BMS项目中,可能会综合考虑成本、可拓展、通信交互等,用AFE(模拟前端)MCU(微控制器)实现BMS(电池管理系统)。 希望看到这篇博客的朋友能指出错误或提供改进建议。 有纰漏…...

【教学类-89-06】20250220新年篇05——元宵节灯笼

背景需求: 每年元宵、国庆都回带孩子做灯笼。用python对"对折灯笼“的纸模进行不同图案的填充(区分物权) 【教学类-39】A4红纸-国旗灯笼纸模(庆祝中华人民共和国成立74周年)_a4 打印 灯笼-CSDN博客文章浏览阅读1…...

C++ Primer 类的静态成员

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...

【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记

本文内容为重写上一节课中的单链表,将其重构成更易于用户使用的链表,实现多种操作链表的方法。 1. 重构单链表SLList 在上一节课中编写的 IntList 类是裸露递归的形式,在 Java 中一般不会这么定义,因为这样用户可能需要非常了解…...

【科研绘图系列】R语言绘制小提琴图、散点图和韦恩图(violin scatter plot Venn)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载画图1画图2画图3画图4画图5画图6画图7参考介绍 【科研绘图系列】R语言绘制小提琴图、散点图和韦恩图(violin & scatter plot & Venn) 加载R包 library…...

Linux中POSIX应用场景

Linux 提供了丰富的 POSIX(Portable Operating System Interface)标准接口,这些接口可以帮助开发者编写可移植、高效的应用程序。POSIX 标准定义了一系列系统调用和库函数,涵盖了文件操作、进程管理、线程管理、信号处理、同步机制…...

量子算法导论

重学了量子算法,不知道是温故而知新,还是之前的教材没有讲过这个概念。 如果把(图灵机)计算机比作一个查询机器,输入x通过f(x)作用得出结果,而查询的过程就是计算的过程。 中文解释…...

nasm - BasicWindow_64

文章目录 nasm - BasicWindow_64概述笔记my_build.batnasm_main.asmEND nasm - BasicWindow_64 概述 学习网上找到的demo. x64和x86的汇编源码还差挺多的。 x64的汇编代码不好写,细节整不对,程序就不运行。 如果要查为啥不运行,也要看和正向…...

SpringBoot:SSL证书部署+SpringBoot实现HTTPS安全访问

一、前言 SSL协议介于TCP/IP协议栈的第四层(传输层)和第七层(应用层)之间,为基于TCP的应用层协议(如HTTP)提供安全连接。它通过在客户端和服务器之间建立一个加密的通道,确保数据在传…...

selenium爬取苏宁易购平台某产品的评论

目录 selenium的介绍 1、 selenium是什么? 2、selenium的工作原理 3、如何使用selenium? webdriver浏览器驱动设置 关键步骤 代码 运行结果 注意事项 selenium的介绍 1、 selenium是什么? 用于Web应用程序测试的工具。可以驱动浏览…...

Spark提交任务

1、Spark提交任务到Yarn 1.1、DwKuduApp spark-submit --class com.io.etl.dwkudu.DwKuduApp \ --files /etl/etl-dwkudu/conf/doris.property,/etl/etl-dwkudu/conf/redis.property,/etl/etl-dwkudu/conf/log4j.property \ --master yarn --deploy-mode cluster \ --driver-…...

游戏引擎学习第113天

仓库:https://gitee.com/mrxiao_com/2d_game_2 黑板:优化的基本过程 在游戏编程中,优化是一个非常重要的学习内容,尤其是想要成为专业开发者时。优化的核心是理解代码的执行速度,以及如何提升其性能。在这个阶段,已经…...

token是什么

在自然语言处理(NLP)和机器学习的背景下,token 是指模型在处理文本时的最小单位。通常,这个单位可以是单词、字符,或者词的一部分。具体来说,token 的定义取决于你使用的模型和它的分词方式。 举个例子&am…...

23. AI-大语言模型-DeepSeek赋能开发-Spring AI集成

文章目录 前言一、Spring AI 集成 DeepSeek1. 开发AI程序2. DeepSeek 大模型3. 集成 DeepSeek 大模型1. 接入前准备2. 引入依赖3. 工程配置4. 调用示例5. 小结 4. 集成第三方平台(已集成 DeepSeek 大模型)1. 接入前准备2. POM依赖3. 工程配置4. 调用示例…...

IPv6报头40字节具体怎么分配的?

目录 IPv6报头结构 字段详解 示例代码:IPv6报头的Python实现 输出示例 IPv6协议是为了解决IPv4地址耗尽问题而设计的下一代互联网协议。与IPv4相比,IPv6不仅提供了更大的地址空间,还简化了报头结构,提高了网络设备的处理效率。…...

驱动开发、移植

一、任务明确:把创龙MX8的驱动 按照我们的要求 然后移植到 我们的板子 1.Linux系统启动卡制作, sd卡 先按照 《用户手册—3-2-Linux系统启动卡制作及系统固化》 把创龙的Linux系统刷进去。 2. 把TLIMX8-EVM的板子过一遍 把刚刚烧好系统的sd卡插入 创…...

BFS与Flood Fill:算法原理、实现细节与复杂度分析

目录 1. 概述 2. BFS 的基本原理 3. Flood Fill 算法 4. BFS 实现 Flood Fill 的步骤 5. C 实现 6. 代码解析 7. 复杂度分析 8. 应用场景 总结 1. 概述 Flood Fill 算法是一种用于填充封闭区域的算法,常用于图像处理、绘图工具和游戏开发中。BFS&#xff08…...

计算机网络基础杂谈(局域网、ip、子网掩码、网关、DNS)

目录 1. 简单局域网的构成 2. IP 地址 3. 子网掩码 4. IP地址详解自定义IP 5. IP 地址详解 6. 网关 7. DNS 域名解析 8. ping 1. 简单局域网的构成 交换机是组建局域网最重要的设备,换句话说,没有交换机就没法搭建局域网 交换机不能让局域网连…...

雷龙CS SD NAND(贴片式TF卡)测评体验

一、产品概述 近期获赠雷龙科技(Longsto)推出的CS系列贴片式SD NAND存储解决方案,包含两片工业级贴片式NAND芯片(CSNP16GCR01-AOW)及全兼容转接板。该方案支持TF卡形态扩展,实现高可靠性嵌入式存储应用。 …...

Keras深度学习多分类实战:从数据预处理到模型部署

1. 深度学习多分类实战:基于Keras的完整指南在计算机视觉和自然语言处理领域,多分类问题就像一位超市理货员需要将商品准确归到不同货架——MNIST手写数字识别要把图像分到0-9共10个类别,新闻主题分类则需将文章划入政治、经济或体育等板块。…...

Qwen3.5-9B-AWQ-4bit实战案例:工厂巡检表单图→填写规范检查+异常项标红

Qwen3.5-9B-AWQ-4bit实战案例:工厂巡检表单图→填写规范检查异常项标红 1. 项目背景与需求分析 在工业生产环境中,每日巡检是保障设备安全运行的重要环节。传统的人工巡检表单检查存在以下痛点: 效率低下:质检员需要逐项核对数…...

AI 时代最大的谎言:你以为在学习,其实在欠债—思维决定上限的反焦虑框架

文章目录1、写在前面:我为什么不再写"AI 焦虑"2、本文速览3、AI 焦虑的真实闭环:你不是在错过 AI3.1、焦虑的来源不是机会,是怕3.2、机会从来不属于"绝大多数人"3.3、对你的实际意义4、MIT 认知负债:所有 AI …...

概率分布实战指南:从基础到应用

1. 概率分布入门指南概率分布就像天气预报中的降水概率图——它能告诉我们不同结果出现的可能性大小。作为数据分析、机器学习和统计建模的基础工具,理解概率分布相当于掌握了量化不确定性的语言。我在金融风控和AB测试领域工作十年,每天都要和各种分布打…...

交通数据存证:Java区块链3大“不可篡改”密码,篡改成本高到哭!

🔥关注墨瑾轩,带你探索编程的奥秘!🚀 🔥超萌技术攻略,轻松晋级编程高手🚀 🔥技术宝库已备好,就等你来挖掘🚀 🔥订阅墨瑾轩,智趣学习不…...

Semantic Kernel 在企业级 Harness 开发中的应用

Semantic Kernel 在企业级 Harness 开发中的应用:打造 AI 原生的内部开发平台(IDP) 摘要 随着企业数字化转型的深入,云原生CI/CD平台Harness已经成为众多中大型企业构建内部开发平台(IDP)的首选方案,但Harness的YAML编排复杂度高、排障耗时久、自定义扩展门槛高、知识…...

AI环境管理框架AEnvironment:解决多模型开发部署难题

1. 项目概述与核心价值最近在折腾一个挺有意思的项目,叫inclusionAI/AEnvironment。乍一看这个名字,可能有点抽象,但如果你正在做AI应用开发,特别是涉及到多模型、多环境、复杂依赖管理的场景,这个项目很可能就是你一直…...

C语言命令行参数的使用

### C语言中命令行参数的用法与示例在C语言中,main函数可以通过两个参数来接收命令行参数:int argc 和 char *argv。其中,argc表示命令行参数的数量(包括程序名本身),而argv是一个字符串数组,存…...

机器学习损失函数:原理、选择与实战技巧

1. 机器学习中的损失函数:原理与实战解析在训练机器学习模型时,损失函数就像一位严格的教练,不断告诉模型"你现在的表现离完美还有多远"。作为从业十余年的算法工程师,我见过太多项目因为损失函数选择不当而导致效果不佳…...

重构仿真工作流:从手动操作到智能自动化的范式革命

重构仿真工作流:从手动操作到智能自动化的范式革命 【免费下载链接】MPh Pythonic scripting interface for Comsol Multiphysics 项目地址: https://gitcode.com/gh_mirrors/mp/MPh 在当今的工程研发和科学研究中,多物理场仿真已成为产品设计和性…...