Dart语言特性必备了解!

学习Dart语言,必须将以下的概念熟记于心:

  • 在dart语言中,一切皆为对象。所有的对象都是一个类的实例。甚至整数、函数、null也看做是对象。所有的对象都继承于Object类
  • 尽管Dart是强类型语言,但是变量的类型指定不一定要标明,因为Dart可以推断出它的类型。比如说变量number就可以被推测出是int类型。如果你想明确表示这个变量不想被任何一个类型指定,那就使用特殊类型dynamic来表示。
  • Dart语言支持通用类型,比如List<int>表示整数集列表,List<dynamic>表示元素集为任意类型对象的列表
  • Dart支持顶级函数(如main()),以及绑定到类或对象的函数(分别是静态方法和实例方法)。您还可以在函数中创建函数(嵌套函数或本地函数)。
  • 类似的,Dart支持顶级变量,以及绑定到类或对象(静态和实例变量)的变量。实例变量有时称为字段或属性。
  • 有别于JAVA语言,dart语言中没有public、protected和private这些关键字。在dart里面,如果标识符以下划线(_)开头,那么它对其库是私有的
  • Dart里面的标志符号由_、字母和数字组成,只能以_或者字母开头
  • Dart既有表达式(具有运行时值),也有语句(不具有运行时值)。比如传统的表达式condition ? expr1 : expr2会有一个值,expr1或者expr2。相比较于if-else语句,则没有值。一个语句通常包括一个或者多个表达式,但是一个表达式不能直接包含一个语句。
  • Dart工具会向你发出两种类型问题:警告和错误。警告则是指出你的代码存在问题,但是不会阻止你正在执行的程序。错误则会发生在编译时和运行时。编译时的错误会完全阻止你代码的运行。运行时错误导致代码执行时引发异常。

变量

定义一个变量name并初始化一个String类型的值zeng:

var name = ‘zeng‘

这个name变量的类型会自动推断出String类型,但是你也可以通过其他方法来改变类型。如果你不想让一个变量仅仅受限为一个类型,你可以指定这个变量是Object或者dynamic类型,如下面的做法:

dynamic name = ‘zeng‘

还有一个做法就是显示的声明你即将定义的变量的类型,如:

String name = ‘zeng‘

如果你定义了一个变量而没有初始化值,则这个变量有一个默认值null。即使变量是个数值类型(int),也是null,因为在dart语言中,一切皆为对象。

int a;
assert(a == null)

final 和 const

如果你不想改变一个变量,使用final和const是最好的选择。final变量只能设置一次 ,const变量是一个编译时常量。顶层final或者class变量在第一次使用时就初始化 了。

定义一个final变量:

final name = ‘zeng‘;//没有一个类型声明
final String nickName = ‘lucky‘;

上面定义的final变量如果你改变他的值,则会报错:

name = ‘fan‘;//Error: a final variable can only be set once.

用const来定义一个编译时的变量。如果const变量位于class级别,则将其标记为静态const。在声明变量的地方,将值设置为编译时常量,如数字或字符串文字、常量变量或对常量进行算术运算的结果:

const a = 1000;
const double b  = 1.05 * a;

数据类型

Dart语言有以下七种内置数据类型

  • numbers
  • strings
  • booleans
  • lists (also known as arrays)
  • maps
  • runes (for expressing Unicode characters in a string)
  • symbols

Numbers

Dart有两种数值类型

int整数型

整数型的值不超过64位,取决于平台。如果在Dart VM平台,整数值的取值范围是 -263 ~ 263 - 1。dart如果是编译为javascript语言中javascript numbers,则取值为-253  ~ 253 - 1。

doubel浮点型

int和double类型都是数值型的子类型,这数值类型包括一些基本的运算符操作如 + 、- 、/ 和*,当然还有一些其他方法 abs()、ceil()、floor()。

int就是没有小数点的数值。比如:

var x = 1;
var y = 0xDEADBEEF;

而如果是有小数点的数值,它就是一个浮点型,比如:

var y = 1.1;
var exponents = 1.42e5;

在Dart2.1版本中,在必要的时候,整数型的数值会自动转换成浮点型的数值。比如

double z = 1; // Equivalent to double z = 1.0.

下面的是演示怎样让字符型转换成数值型,反之亦然:

// String -> int
var one = int.parse(‘1‘);
assert(one == 1);

// String -> double
var onePointOne = double.parse(‘1.1‘);
assert(onePointOne == 1.1);

// int -> String
String oneAsString = 1.toString();
assert(oneAsString == ‘1‘);

// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == ‘3.14‘);

int类型也可进行按位操作(<<,>>)(&)、(|)

assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111

数字字面量是编译时的常量。许多算术运算表达式也是编译时的常量,只要他们的操作数是编译时常量,计算结果是数字就行。比如:

const a = 100;
const b = 10;
const c = a * b;

String字符串

Dart字符串是一系列UTF-16代码单元组成。你可以用单引号或者双引号括起来组成一个字符串。

var s1 = ‘use single quotes.‘;
var s2 = "use double quotes.";

通过 ${expression} 这个方法可以把表达式的值放入一个string中,如果这个表达式是个标识符,你也可以省略这个{}

var s = ‘string interpolation‘;

assert(‘Dart has $s, which is very handy.‘ ==
    ‘Dart has string interpolation, ‘ +
        ‘which is very handy.‘);
assert(‘That deserves all caps. ‘ +
        ‘${s.toUpperCase()} is very handy!‘ ==
    ‘That deserves all caps. ‘ +
        ‘STRING INTERPOLATION is very handy!‘);

下面是连接字符串的方法:

var s1 = ‘String ‘
    ‘concatenation‘
    " works even over line breaks.";
assert(s1 ==
    ‘String concatenation works even over ‘
    ‘line breaks.‘);

var s2 = ‘The + operator ‘ + ‘works, as well.‘;
assert(s2 == ‘The + operator works, as well.‘);

如果你要写多行的字符串,你可以使用三个单引号或者三个双引号来标记:

var s1 = ‘‘‘
You can create
multi-line strings like this one.
‘‘‘;

var s2 = """This is also a
multi-line string.""";

可以通过r方法,让你的字符串代码原样输出:

var s = r‘this is a test \n ,tell me‘;

Booleans布尔类型

Dart使用bool类型来表示布尔值。ture 和false是bool的两个对象,同时这两个也是编译时常量

在dart语言中,我们不能使用javascript中的判断语句,比如:

var a = ‘‘;
//在javascript中
if(a){
  console.log(‘nice‘)
}
//但是在dart语言中,不能这样进行判断。而要使用下面的方法
if(a.isEmpty)

//检查是否为nullvar b ;assert(b == null)

//检查是否为NaNvar c = 0/0;assert(c.isNaN)

Lists列表型

数组(array)几乎是所有编程语言中最常见的集合。但在Dart语言中,数组就是List对象。

dart中的list就像是javascript中的Array。通过下面的例子了解dart中的list

var list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);

list[1] = 1;
assert(list[1] == 1);

Lists也有length,list中数据的表示方法也和数组一样可以通过索引号码来访问特定的元素,比如List[1]。

Maps

通常来说,map是键值对类型的对象。key和value可以是任意类型的对象。但是不能出现相同的key,每个key只能出现一次,而相同的值可以多次出现。

var gifts = {
  // Key:    Value
  ‘first‘: ‘partridge‘,
  ‘second‘: ‘turtledoves‘,
  ‘fifth‘: ‘golden rings‘
};
//新增一个key-value对gifts[‘fourth‘] = ‘nice baby‘;
var nobleGases = { 2: ‘helium‘, 10: ‘neon‘, 18: ‘argon‘, };

如上,key值中有了first,就不能再出现key为first的一项,不然会报错。除了通过上面的字面量方法来创建map,也可以通过map构造器来创建对象

var gifts = Map();
gifts[‘first‘] = ‘partridge‘;
gifts[‘second‘] = ‘turtledoves‘;
gifts[‘fifth‘] = ‘golden rings‘;

var nobleGases = Map();
nobleGases[2] = ‘helium‘;
nobleGases[10] = ‘neon‘;
nobleGases[18] = ‘argon‘;

如果你查找map对象里面不存在的key,则会返回一个null

var gifts = {‘first‘: ‘partridge‘};
assert(gifts[‘fifth‘] == null);

可以通过.length的方法获取map中的键值对数量:

var gifts = {‘first‘: ‘partridge‘};
gifts[‘fourth‘] = ‘calling birds‘;
assert(gifts.length == 2);

Functions函数集

bool isNoble(int atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

声明函数类型可以提升函数执行效率,如果省略这些类型,也是可以执行的:

isNoble(atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

如果只有一个表达式,你可以简写为:

bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;

函数可选参数

当调用一个函数,你需要指明参数paramName: value,比如:

enableFlags(bold: true, hidden: false);

当定义一个函数,你可以使用{param1,param2,....}来命名参数:

void enableFlags({bool bold, bool hidden}) {...}

如果是一个必须传入的参数,则需要使用@required来指明参数:

const Scrollbar({Key key, @required Widget child})

我们也可以在[]中放置一个可选的参数:

String say(String from, String msg, [String device]) {
  var result = ‘$from says $msg‘;
  if (device != null) {
    result = ‘$result with a $device‘;
  }
  return result;
}

在上面的[]中的参数,可传也可以不传。如果我们想给一个参数一个默认的值,就可以使用如下的方法:

String say(String from, String msg,
    [String device = ‘carrier pigeon‘, String mood]) {
  var result = ‘$from says $msg‘;
  if (device != null) {
    result = ‘$result with a $device‘;
  }
  if (mood != null) {
    result = ‘$result (in a $mood mood)‘;
  }
  return result;
}
assert(say(‘Bob‘, ‘Howdy‘) ==
    ‘Bob says Howdy with a carrier pigeon‘);

当调用say函数时,没有传入device参数和mood参数,但是device参数有一个默认值‘carrrer pigeon’,所以不传这个参数,则会默认把默认值放入到函数中运行。

main()函数

每个app都必须有main()函数,main()函数是作为app的入口函数。一个web app的入口函数如下:

void main() {
  querySelector(‘#sample_text_id‘)
    ..text = ‘Click me!‘
    ..onClick.listen(reverseText);
}

注:..是一种级联操作符,它返回调用者本身,这样就可以连续调用同一个对象上的多个方法,实现链式操作!

函数可以作为另一个函数的参数运行,如

void printElement(int element) {
  print(element);
}

var list = [1, 2, 3];

// Pass printElement as a parameter.
list.forEach(printElement);


类型检查操作符

as、 is、 is!

比如:

if (emp is Person) {
  // Type check
  emp.firstName = ‘Bob‘;
}

分配符

// Assign value to a
a = value;
// Assign value to b if b is null; otherwise, b stays the same
b ??= value;

原文地址:https://www.cnblogs.com/zengfp/p/10032623.html

时间: 2024-08-30 16:45:13

Dart语言特性必备了解!的相关文章

C# 动态语言特性,dynamic 关键字研究

原文:C# 动态语言特性,dynamic 关键字研究 1       动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 JavaScript 根本没使用过,别人一定把你当成从火星回来的吧! 很多使用过 JavaScript 的程序员,刚开始对其动态特性深恶痛绝,欲除之而后快,但是一旦熟悉这个语言以后,又会发疯般的爱上她(我的野蛮女友). 以创建一个“人”为例, Java

Go的语言特性总结

写在前面: 近来关于对Golang的讨论有很多,七牛的几个大牛们也断定Go语言在未来将会快速发展,并且很可能会取代Java成为互联网时代最受欢迎的编程语言.Go语言是google推出的编程语言,在已经成功的给世人创造了改变人们生活的操作系统之后,google似乎感觉有必要再为世人带来一款强大的编程语言,而Go语言依靠自己众多友好的特性也不负众望正在被开发者接触,我有幸在学习高性能并发编程的时候认识了Go语言,在了解了Go的一些特性之后决定系统的学习一番.我发现关于Go的学习资料并不多,以至于我需

Java基础学习(一)——语言特性及开发环境搭建

学习了一段时间的Java,想通过几篇文章做一下这一段时间的学习总结.由于有c/c++的一些基础,总的来说Java语言还是挺具有亲和感的.虽然经常到博客园找资料,但是也一直没有自己动手写过博客,现在练练手,也为日后有个回忆吧. 一,Java简介 1.语言起源 语言起源:Java是SUN ( Stanford University Network 斯坦福大学网络公司 ) 1995年推出的一门高级编程语言.Java名称的来源Java最初被命名为Oak,目标在于家用电器等小型系统的编程语言,随着市场的变

国内可外用免费语料库下载资源汇总, 语言翻译必备:国内外23个语料库推荐

国内可外用免费语料库下载资源汇总 (一) 国家语委1.国家语委现代汉语语料库http://www.cncorpus.org/现代汉语通用平衡语料库现在重新开放网络查询了.重开后的在线检索速度更快,功能更强,同时提供检索结果下载.现代汉语语料库在线提供免费检索的语料约2000万字,为分词和词性标注语料. 2.古代汉语语料库http://www.cncorpus.org/login.aspx网站现在还增加了一亿字的古代汉语生语料,研究古代汉语的也可以去查询和下载.同时,还提供了分词.词性标注软件.词

Atitit.rust语言特性&#160;attilax&#160;总结

Atitit.rust语言特性 attilax 总结 1. 创建这个新语言的目的是为了解决一个顽疾:软件的演进速度大大低于硬件的演进,软件在语言级别上无法真正利用多核计算带来的性能提升.1 2. 不会出现Null指针等等1 2.1.1. Rust 1.1 稳定版 更新内容1 2.1.2. Rust 1.2 测试版 更新内容2 3. RAII2 3.1. 无数据竞争(Data Race)…无需竞争的并发,Rust能够确保在并发编程中的数据安全3 4. 是基于继承的组合,Rust能基于继承实现组合,

我想要的程序开发语言特性&mdash;&mdash;之&ldquo;面向对象&rdquo;&mdash;&mdash;之&ldquo;退化&rdquo;

先从一个例子开始讲起,以下是jdk1.7中的迭代器接口的代码(去掉了注释的部分): public interface Iterator<E> {    boolean hasNext();    E next();    void remove();} 程序开发的老油条们都不太喜欢这个接口的remove方法,原因可能是: 我们为自己实现Iterator接口时,基本不需要这个方法,但我们却不得不@Override它,此时通常我们会直接在方法体中写一行throw new UnsupportedOp

特殊用途语言特性:默认实参,内联函数和constexpr函数,调试帮助

重点: 1.三种函数相关的语言特性:默认实参,内联函数和constexpr函数. 2.默认实参:某些函数有一种形参,在函数的很多次调用中它们都被赋予一个相同的值. 3.一旦某个形参被赋予了默认值之后,它后面的所以形参都必须要默认值. 4.若想使用默认形参,只要在调用函数时省略该实参即可. Tip:Window = screen ( , , ‘?’ );//错误:只能省略尾部的实参! 5.对于函数的声明来说,习惯将其放在头文件当中,在给定的作用域中一个形参只能赋予一次默认实参. NOTE:通常,应

C高级篇(非BUG的语言特性)

许多新手程序员经常会犯的一种错误,就是将 i = 3; 与 i == 3 相互混淆,前者表示一个赋值语句,而后者常常作为判断的条件.还有的程序员想将指针指向NULL时,写成了p == NULL; 这样的话变成了什么?不过不用担心,这种错误编译器能够辨别. NUL与NULL:在C语言中,NUL表示一个字符串的结束,用字符表示为'\0',我们通常用'\0'这种字符常量作为判断条件而不是NUL.NULL表示为空,用NULL表示什么也不指向(即空指针). switch.case.default:在用sw

study Mvc step by step (三)C#语言特性扩展方法

C#3.0之后推出了扩展方法.我们通常看到的方法都是和声明它的类相关联.扩展方法特性扩展这个边界,允许编写的方法和声明它的类之外的类关联. 要想知道可以如何使用这个特性,请看下面的代码.它包含类MyPerson.该类存贮了3个double类型的值,并含有一个构造函数和一个名称为sum的方法,该方法返回3个存储值得和. using System; using System.Collections.Generic; using System.Linq; using System.Text; usin