Dart变量学习

Dart变量学习,第1张

Dart变量
  • var可变变量
  • dynamic变量
  • Object变量
  • final变量
  • const变量
  • 空安全类型变量
  • 字符串相关
  • 集合相关
  • 注意:

var可变变量

可变变量如果在声明的时候就赋值,那么在赋值之后就定类型了。如下,赋值之后,Dart会自动进行类型推断,推断出int型,n就只能为int型。

	var n = 1;

但是如果只声明,不赋值,则其实默认微dynamic变量(待确认),如下:

var n;
n = 1;
n = "abc";

注意: Dart建议在声明局部变量的时候使用var。也就是说,大多数情况下,还是应该明确类型来声明变量。

dynamic变量

可以赋值任意对象,并且后面也可以变类型。

	dynamic n;
	//下述正确
	n =1;
	n ="11";
	//下述编译无异常,运行会出现异常
	n.width;

上述代码n的赋值都是可行的,但是在对n的调用的时候,由于dynamic是不确定n的类型的,所以编译正常,但是运行时会异常。
有一种说法是:当明确不需要类型的时候,才使用特殊类型dynamic。

Object变量

可以赋值任意对象,并且后面也可以变类型。
原因:Object是所有类型的根基类,所以可以赋值任意对象类型。
与dynamic区别: Object对象只能用Object的方法。

	Object n = "";
	//下述会报异常,编译阶段就报了
	n.length;
final变量

类似于JAVA的final,第一次初始化之后就不能改变。当然也和JAVA类似,final声明的对象类型,对象的属性是可以修改的。

final n = "ab";
final String m = "abc";

final的变量是在实际运行的过程中才会确认值的,所以可以类似如下赋值:

final n = "ab";
final m = n;
const变量

只能声明常量值,编译阶段直接替换成常量了。

const n = "ab";
const String m = "abc";

const的变量是在编译的时候赋值的。如下的代码在回在编译的时候直接报错。:

const n = "ab";
const m = n;//报错,不能赋值给一个不确定的变量。

也就是说,const定义的对象是不能改变属性的。
同时,利用const定义的构造方法,由于是常量型的构造方法,创建两个对象的时候,如果属性一样,会创造同一个对象。如下:

var person1 = const Person(18);
var person2 = const Person(18);
//这里的p1和p2其实是同一个对象,person1==person2;

class Person{
	final int age ;
	const Person(this.age)
}
空安全类型变量

默认变量都是不可空的,可主动声明为可空对象,与kotlin类似。

	int n;//不可空的
	int? n;//可空的
	//调用也可以有语法糖,如:
	string?.length//只有string不为null的时候才会执行。
字符串相关
  1. Dart中的String类型(字符串类型),可以单引号‘a’,也可以双引号“a”

  2. Dart中字符串拼接可以使用${},具体例子如下:

    String a = "me"String b = "you";
    String c = "Its ${a}, not ${b}"
    //String c = "Its me, not you"
    

    这里最好都加上{}来判断具体$对应的范围。避免歧义等。

  3. Dart中支持相邻字符串拼接,如

    String temp = "its me "
    	"not "
    	"you";
    //等同于String temp = "its me not you"
    
  4. Dart中,可以使用三个单引号或者双引号来包裹输出多行字符串,如:

    String temp = """
    第一行
    第二行
    第三行
    """;
    
  5. Dart中,可以在字符串前加一个 “r” 来标记不转义。如:

    String m = r"/n"//此处的m = “/n”
    
  6. Dart中,字符串的==判断是用来判断内容是否相同(字符序列);但是java中,==比较的是内存。

集合相关
  1. 集合允许在初始化的时候就进行赋值(Java中不允许),如:

    Map<String,String> map1 = {"a":"an","b":"bi"};
    //key:value
    
  2. 展开运算符(…),代表可以将…之后的集合展开填充。如:

    Map<String,String> map1 = {"a":"an","b":"bi"};
    Map<String,String> map2 = {...map1};
    //map2中的内容和map1一致
    
  3. 空展开运算符(…?),在展开运算符的基础上增加了判空。 如果…?后跟的集合为null,则不执行任何 *** 作,如:

    Map<String,String> map1 = {"a":"an","b":"bi"};
    Map<String,String> map2 = null;
    Map<String,String> map3 = {...?map1, ...?map2};
    //map3的内容和map1一致。
    Map<String,String> map3 = {...map1, ...map2};
    //执行会抛出异常,map2为null。
    
  4. 在集合中运用if。如:

    bool need = false;
    Map<String,String> map1 = {"a":"an",if(need) "b":"bi"};
    //map1中只有一个a:an
    
  5. 在集合中运用for。如:

    Map<String,String> map1 = {"a":"an", for(int i = 0;i < 5;i++) "b":"bi"};
    //map中会有6个元素,一个a:an ,5个b:bi
    
注意:
  1. Dart中所有的一切都是变量。包括null,123等。
  2. Dart中所有变量都默认赋值null。
  3. Dart中没有基本数据类型,只有内置类型(包含数字,列表,集合等)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/792930.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存