Dart语法学习-变量

news2025/1/1 22:00:27

一、 创建Dart File

 Hello, World

void main() {
  print('Hello world');
}


Log:
Hello world

 

二、变量

1.Dart 支持类型推断。

  var name = 'Voyager I';
  var year = 1977;
  var antennaDiameter = 3.7;
  var flybyObjects = ['A1', 'A2', 'A3', 'A4'];
  var image = {
    'tags':['saturn'],
    'url':'www.baidu,com'
  };
void main() {
  var number = 42;
  printInteger(number);
}

void printInteger(int aNumber) {
  print('The number is $aNumber');
}

Log:
The number is 42

创建变量并对其进行初始化

var name = 'Bob';

 上面的例子中name 变量的类型被推断为 String,但可以通过指定它的类型来更改确认类型。

Object name = 'Bob';

显式声明将被推断的类型

String name = 'Bob';

 

2.默认值

可空类型的未初始化变量的初始值为空。

void main() {
  int? lineCount;
  print(lineCount == null);
}

Log:
true

错误使用

注意:不可空类型需要在使用前初始化。

void main() {
  int lineCount;
  print(lineCount == null);
}

31:9: Error: Non-nullable variable 'lineCount' must be assigned before it can be used.
  print(lineCount == null);
        ^^^^^^^^^

 

不可空变量必须在使用之前初始化它们的值。

int lineCount = 0;

注意:

不必在声明局部变量的地方对其进行初始化,但需要在使用前为其赋值。

void main() {
  int lineCount;
  lineCount = 1;
  print(lineCount);
}

Log
1

 变量被延迟初始化; 初始化代码在第一次使用变量时运行。

3.Late变量

late String description;

void main() {
  description = 'Feijoada!';
  print(description);
}

Log
Feijoada!

Dart 2.12 添加了 late 修饰符

  • 声明一个在声明后初始化的不可空变量。
  • 延迟初始化变量。

注意:如果未能初始化延迟变量,则在使用该变量时会发生运行时错误。

late String description;

void main() {
  //description = 'Feijoada!';
  print(description);
}

Log
Unhandled exception:
LateInitializationError: Field 'description' has not been initialized.
#0      description (file:///D:/androidmyproject/MyProject/MyApplication/app/src/main/java/com/example/myapplication/flutter/TestDart.dart)
#1      main (file:///D:/androidmyproject/MyProject/MyApplication/app/src/main/java/com/example/myapplication/flutter/TestDart.dart:44:9)
#2      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:297:19)
#3      _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:192:26)

 

当将变量标记为延迟( late )但在其声明时对其进行初始化时,初始化程序将在第一次使用该变量时运行。

  • 该变量可能不需要,并且初始化它的成本很高。
  • 正在初始化一个实例变量,它的初始化器需要访问它。
// This is the program's only call to readThermometer().
late String temperature = readThermometer(); // Lazily initialized.

4.final 和 const

如果从不打算更改变量,请使用 final 或 const 代替 var 使用。 final 变量只能设置一次; const 变量是编译时常量。 (const 变量是隐式最终的。)

注意:实例变量可以是 final 但不是 const。

final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';

 

不能修改final变量的值

void main() {
  final a = 1;
  a = 2;
}

Log
TestDart.dart:49:3: Error: Can't assign to the final variable 'a'.
  a = 2;
  ^

 

const声明编译时常量的变量。 如果 const 变量在类级别,则将其标记为 static const。 在声明变量的位置,将值设置为编译时常量,例如数字或字符串文字、const 变量或对常量进行算术运算的结果:

void main() {
  const bar = 1000000; // Unit of pressure (dynes/cm2)
  const double atm = 1.01325 * bar; // Standard atmosphere
  print(atm);
}

Log
1013250.0

const 关键字不仅仅用于声明常量变量。 还可以使用它来创建常量值,以及声明创建常量值的构造函数。 任何变量都可以有一个常量值。

var foo = const [];
final bar = const [];
const baz = []; // Equivalent to `const []`

 const 声明的初始化表达式中省略 const,例如上面的 baz。可以更改非 final、非常量变量的值,即使它曾经有一个 const 值:

void main() {
  var foo = const[];
  foo = [1, 2, 3];
  print(foo);
}

Log
[1, 2, 3]

不能更改 const 变量的值

void main() {
  const baz = [];
  baz = [1, 2, 3];
}

Log
TestDart.dart:66:3: Error: Can't assign to the const variable 'baz'.
  baz = [1, 2, 3];
  ^^^

 

 可以定义使用类型检查和强制转换(is 和 as)、集合 if 和传播运算符(... 和 ...?)的常量

void main() {
  const Object i = 3; // Where i is a const Object with an int value...
  print(i);
  const list = [i as int]; // Use a typecast.
  print(list);
  const map = {if (i is int) i: 'int'}; // Use is and collection if.
  print(map);
  const set = {if (list is List<int>) ...list}; // ...and a spread.
  print(set);
}

Log
3
[3]
{3: int}
{3}

注意:虽然无法修改final修饰的对象,但可以更改其字段。 相比之下,const 对象及其字段不能更改:它们是不可变的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/189854.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

王道操作系统笔记(四)———— 进程同步与互斥

文章目录一、同步与互斥的概念1.1 同步与互斥的基本概念1.2 临界资源与共享资源1.3 独占设备与共享设备二、实现临界区互斥的基本方法2.1 软件实现方法2.1.1 单标志法2.1.2 双标志先检查法2.1.3 双标志后检查法2.1.4 Peterson 算法2.1.5 软件实现方法总结2.2 硬件实现方法2.2.1…

【电子通识】查找硬件学习资料的方法

做为一名硬件工程师&#xff0c;在工作中会经常遇到一些问题&#xff0c;这些问题最开始可能也并不知道是什么原因。对于这些异常现象&#xff0c;我们可能需要深入去了解电路原理或器件特性等方式&#xff0c;从原理上理解并解决。当再次遇到相同或相似的问题时&#xff0c;我…

Python爬虫2--数据解析方法:bs4库的使用和案例

目录标题数据解析1、BeautifulSoup库1.1 BeautifulSoup库入门1.1.1 BeautifulSoup类的基本元素&#xff1a;1.1.2 基于bs4库的HTML内容遍历方法1.1.3 基于bs4库的HTML格式化和编码1.2 信息组织和提取方法1.2.1 信息标记的三种形式&#xff1a;xml,json,yaml1.2.2 三种信息标记形…

360数据恢复如何操作?360安全卫士恢复误删文件的方法(详解)

3 60安全 卫士属于一款杀毒软件&#xff0c;这是很多人都知道的事情。但是你知道吗&#xff1f;3 60安全 卫士还有一个免费功能&#xff0c;就是文件恢复功能。 当文件被误删&#xff0c;电脑回收站又找不到&#xff0c;你可以尝试通过3 60里面的文件恢复功能来进行数据恢复。…

Leetcode:62. 不同路径、63. 不同路径 II(C++)

目录 62. 不同路径 问题描述&#xff1a; 实现代码与解析&#xff1a; 深度优先&#xff08;超时&#xff09;&#xff1a; 原理思路&#xff1a; 动态规划&#xff1a; 原理思路&#xff1a; 数学方法&#xff1a; 原理思路&#xff1a; 63. 不同路径 II 问题描述&…

AcWing蓝桥杯AB组辅导课09、复杂DP

文章目录前言一、复杂DP例题例题1&#xff1a;AcWing 1050. 鸣人的影分身&#xff08;线性dp&#xff09;分析题解&#xff1a;DP例题2&#xff1a;AcWing 1047. 糖果&#xff08;背包问题变形&#xff09;分析题解&#xff1a;DP&#xff08;01背包问题变形&#xff09;例题3&…

静态库与动态库的生成与使用

一、库文件 预编译——>编译——>汇编——>链接&#xff08;使用库&#xff09;——>可执行文件 二、生成库&#xff1a;把大量的已经实现的代码打包起来 生成动态库&#xff1a; 1、将源码遍历汇编生成二进制指令 gcc -fPIC -c child.c -o child.o 2、将所有二进…

即时通讯开发之详解TCP/IP中的UDP 协议

UDP 是传输层协议,和 TCP 协议处于一个分层中,但是与 TCP 协议不同,UDP 协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议。UDP 协议头2.1UDP 端口号由于很多软件需要用到 UDP 协议,所以 UDP 协议必须通过某个标志用以区分不同的程序所需要的数据包。端口号的功能…

C 语言零基础入门教程(二十一)

C 头文件 头文件是扩展名为 .h 的文件&#xff0c;包含了 C 函数声明和宏定义&#xff0c;被多个源文件中引用共享。有两种类型的头文件&#xff1a;程序员编写的头文件和编译器自带的头文件。 在程序中要使用头文件&#xff0c;需要使用 C 预处理指令 #include 来引用它。前…

Linux | 编辑器gcc/g++的使用【动静态库的认识】

文章目录一、对程序的认知 && 初识gcc1、程序是如何诞生的&#xff1f;2、gcc的初步认识3、如何使用gcc二、gcc逐步分析程序的翻译环境1、预编译【进行宏替换】2、编译【C语言——>汇编语言】3、汇编【汇编语言——>可重定位目标二进制文件】4、链接【生成可执行…

一篇文章学会写SQL

本篇文章主要讲如何写SQL&#xff0c;虽然我在之前有篇文章中写到过数据库的操作和概念&#xff0c;其中有讲到数据库和表的操作语句以及有哪些函数和查询关键字&#xff08;本篇不赘述&#xff09;&#xff0c;但毕竟理解概念和会实践书写是两码事。。 身为一名测试人员&#…

证明:lim (x->0+) x^x=1

原式&#xff1a;lim⁡x→0xx\lim _{x\to 0^{}} {x^{x}}x→0lim​xx 根据公式1:u(x)v(x)eu(x)ln⁡v(x)u(x)^{v(x)}e^{u(x)\ln v(x)}u(x)v(x)eu(x)lnv(x)则原式可以化为lim⁡x→0exln⁡x\lim _{x\to 0^{}} e^{x \ln x}x→0lim​exlnx 接下来利用倒代换进行进一步计算。&#xff…

【USB】USB video class (UVC)相关概念学习

UVC协议 IAD 全称Interface Association Descriptor This is used to describe that two or more interfaces are associated to the same function. An ‘association’ includes two or more interfaces and all of their alternate setting interfaces. IAD用来描述由两个…

一次JVM垃圾收集全过程

目录 JVM堆内存分配 JVM垃圾收集完整过程&#xff08;带图解&#xff09; 在介绍垃圾收集过程之前&#xff0c;有必要先对JVM堆内存做一个回顾&#xff0c;因为讲垃圾收集主要针对的是堆内存。 JVM堆内存分配 在JDK1.8之前&#xff0c;JVM堆内存主要分为新生代、老年代和永…

Kafka和Flink双剑合璧,Confluent收购Immerok引起业内广泛讨论

2023年开年开源界就出了一个大新闻&#xff0c;1月6日Kafka的商业化公司Confluent创始人宣布签署了收购 Immerok 的最终协议&#xff0c;而Immerok是一家为 Apache Flink 提供完全托管服务的初创公司&#xff0c;其创始团队正是Flink的创始团队。 无论是Kafka还是Flink&#x…

MQ 消息丢失、重复、积压问题,如何解决?

引入 MQ 消息中间件最直接的目的是&#xff1a;做系统解耦合流量控制&#xff0c;追其根源还是为了解决互联网系统的高可用和高性能问题。 系统解耦&#xff1a;用 MQ 消息队列&#xff0c;可以隔离系统上下游环境变化带来的不稳定因素&#xff0c;比如京豆服务的系统需求无论如…

你安全吗?丨生活中常见的黑产行为有哪

作者丨黑蛋电视剧《你安全吗&#xff1f;》我也追完了&#xff0c;到了终结篇。在结尾&#xff0c;网安黑产头子马平川终于因为陷害秦淮攻击虎迫系统被查出来就是虎迫内奸&#xff0c;随后也被一系列证据指出饮料厂等薅羊毛事件背后都有马平川的影子&#xff1a;今天我们就来聊…

python基础学习--数据类型、语句、函数

python的语法比较简单&#xff0c;采用缩进形式&#xff0c;如下&#xff1a; 在这里# print absolute value of an integer: a 100 if a > 0:print(a) else:print(-a)插入代码片以“#”开头的语句是注释。 注意&#xff1a;python是大小写敏感的&#xff0c;如果先写错了…

在线 OJ 项目(二) · 操作数据库 · 设计前后端交互的 API · 实现在线编译运行功能

一、操作数据库前的准备二、封装操作数据库数据的相关操作三、设计前后端交互的 API四、实现在线编译运行功能一、操作数据库前的准备 设计数据库表 我们需要对数据库中存储的题目进行操作. 创建一个 “题目表” oj_table 题目的序号 id. 作为题目表的自增主键。 标题 title.…

Android之常见的使用技巧

文章目录1.全局获取Context的技巧2.使用Intent传递对象Serializable方式Parcelable方式3.定制自己的日志工具4.深色主题5.Java和Kotlin代码之间的转换1.全局获取Context的技巧 在Android中&#xff0c;你会发现有很多地方都需要用到Context&#xff0c;例如&#xff1a;弹出To…