Dart语法之变量声明与数据类型实例详解

目录
  • 前言
  • 1.安装与使用
    • 1.1 安装
    • 1.2 在 vscode 中使用
  • 2.类型声明
    • 2.1 变量声明
      • 2.1.1 var
      • 2.1.2 const 和 final
      • 2.1.3 dynamic 和 Object
      • 2.1.4 默认值
    • 2.2 数据类型
      • 2.2.1 Number
      • 2.2.2 String
      • 2.2.4 List
      • 2.2.5 Set
      • 2.2.6 Map
      • 2.2.7 Runes(字符)
      • 2.2.8 Symbols(符号)
      • 2.2.9 枚举类型

前言

最近在学习做 flutter 移动端开发。相比 React-Native 开发而言, 使用 Flutter 开发的话要使用 Dart 这门语言,导致学习负担更重一点。所以针对 Dart 语言的语法和使用做一下汇总。

以下内容参考自 Dart 官方文档

1.安装与使用

dart是由google公司开发的一门面向对象的编程语言。主要应用在移动端,配合 flutter 使用。dart2为现阶段使用的稳定版本

1.1 安装

因为学习 dart 大多数是为了写 flutter,所以推荐直接下载 flutter,下载的 flutter 中会带有 dart 的 SDK。

flutter 推荐去官网进行下载。下载完成后解压,dart 的 SDK 就在解压目录\bin\cache\dart-sdk下。

1.2 在 vscode 中使用

为了方便使用,我们可以将 dart 的 SDK 设置在环境变量中,将解压目录\bin\cache\dart-sdk\bin的完整路径设置好,在cmd 中输入 dart ,有响应就代表设置成功了。

然后就是如何在 vscode 中使用dart。为了使用 dart,我需要下载两个插件DartCode Runner,下载完成后创建一个文件main.dart,输入如下代码:

 // dart中的代码需要放入main方法中执行
 main(){
     print('Hello World');
 }

然后右键Run Code,如果控制台成功打印出Hello World证明我们已经能够在 vscode 中使用 dart 了。

2.类型声明

2.1 变量声明

在 dart 中有很多声明变量的关键字,可以使用能接受任何类型值的变量申明(类似 JavaScript),也可以使用只能接受固定类型值的变量声明(类似 JAVA)。

2.1.1 var

类似于JavaScript中的var,它可以接收任何类型的变量,但最大的不同是 dart 中var变量一旦在声明时被赋值(除了被赋值为 null,因为初始化的时候所有的值都为 null),类型便会确定,则不能再改变其类型,如:

 var t = "hi world";
 // 下面代码在dart中会报错,因为变量t的类型已经确定为String
 // 类型一旦确定后则不能再更改其类型
 t = 1000;

对于前端人员来说,其实看作是 TypeScript 的自动推断类型的功能就好。

但是如果一开始没有直接赋值,而是只定义,那么变量的类型默认会是dynamic类型,也就说和 JavaScript 中的声明的变量一样的用法了。

 var t;
 t = "hi world";
 // 下面代码在dart中不会报错
 t = 1000;

2.1.2 const 和 final

如果从未打算更改一个变量,那么使用 finalconst,不是var,也不是一个单独的类型声明(类型声明也是可以更改值的,当使用类型声明定义变量时,可以直接在前面加上constfinal关键字使其变成常量,但是我们一般建议省略类型声明)。

使用constfinal声明的变量都只能被设置一次,两者区别在于:

const常量是一个编译时常量(就是说必须要是一个在程序编译时就完全固定的常量),final常量不仅有const的编译时常量的特性,最重要的是它是运行时常量,final是惰性初始化的,即在第一次使用时才会初始化。

 // 可以省略String这个类型声明
 final str = "hi world";
 final String sstr = "hi world";
 const str1 = "hi world";
 const String sstr1 = "hi world";
 // 运行时常量在运行时才会被赋值
 // 获取当前时间,因为是动态获取的,所以不能通过const声明
 final t = new DateTime.now(); // OK
 const t1 = new DateTime.now(); // Error

注意:

虽然 final 是运行时常量,第一次被赋值也必须是在定义的时候赋值。

 final a; // Error
 a = 1;

实例变量可以是 final,但不能是 const。(实例变量定义在对象一级,它可以被类中的任何方法或者其他类中的方法访问,但是不能被静态方法访问)

 class A {}
 main() {
     final a = new A(); // OK
     const b = new A(); // Error
 }

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

 var foo = const [];
 final bar = const [];
 ​
 // 可以从const声明的初始化表达式中省略const
 const baz = []; // Equivalent to `const []` => const bar = const [];
 // 不能改变const变量的值
 baz = [42]; // Error: Constant variables can't be assigned a value.
 // 可以更改一个非final的非const变量的值,即使它曾经有一个const值
 foo = [1, 2, 3]; // Was const []

有些类提供常量构造函数。要使用常量构造函数创建编译时常量,请将 const 关键字放在构造函数名之前:

 class Person{
     const Person();
 }
 var p = const Person();

2.1.3 dynamic 和 Object

  • Object 是 dart 所有对象的根基类,也就是说所有类型都是Object的子类(包括FunctionNull),所以任何类型的数据都可以赋值给Object声明的对象。
  • dynamic是与int这样一样的类型关键词,改类型声明的变量也可以赋值任意对象。

dynamicObject相同之处在于,它们声明的变量可以在后期改变赋值类型(类似使用 JavaScript 或 TypeScript 中的any类型)。

 dynamic t;
 Object x;
 t = "hi world";
 x = 'Hello Object';
 // 下面代码没有问题
 t = 1000;
 x = 1000;

dynamicObject不同的是,dynamic声明的对象编译器会提供所有可能的组合(也就是相当于就是完完全全的 JavaScript变量),而Object声明的对象只能使用 Object 类的属性与方法,否则编译器会报错。

 dynamic a;
 Object b;
 main() {
     a = "";
     b = "";
     printLengths();
 }   

 printLengths() {
     // no warning
     print(a.length);
     // warning:
     // The getter 'length' is not defined for the class 'Object'
     print(b.length);
 }

2.1.4 默认值

未初始化的变量的初始值为 null。甚至具有数字类型的变量最初也是 null,因为在 dart 中所有的东西都是对象。

 int lineCount;
 assert(lineCount == null);

注意: 在生产环境中,assert()调用被忽略。在开发环境中当assert(condition)的 condition 条件不为真时抛出一个异常。

2.2 数据类型

我们要清楚的是,dart 中的所有类型的值全都是对象,所以在其他语言中常用的基本类型声明在 dart 中实质也是类的类型声明。

2.2.1 Number

Number 总共能使用三种类型:

  • num
  • int
  • double

Dart的数字有两种形式:

int:根据平台的不同,整数值不大于64位。在 Dart VM 上,值可以从-263263 - 1。编译成 JavaScript 的 Dart 使用 JavaScript 代码,允许值从-253253 - 1

整数是没有小数点的数。这里有一些定义整数字面量的例子:

 int x = 1;
 int hex = 0xDEADBEEF;

int 类型指定传统的(<<, >>)和(&),或(|)位操作符。例如:

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

double:64位(双精度)浮点数,由IEEE 754标准指定。

如果一个数字包含一个小数,它就是一个双精度数。这里有一些定义双精字面量的例子:

 double y = 1.1;
 double exponents = 1.42e5;

注: int 和 double 都是 num 的子类型。num 类型包括基本的操作符,如+、-、/和*,还可以在其中找到abs()、ceil()和floor()等方法。(位运算符,如>>,在int类中定义)如果 num 及其子类型没有要查找的内容,那么dart:math library可能会有。

以下是如何将字符串转换成数字的方法,反之亦然:

 // 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');

2.2.2 String

dart 字符串是 UTF-16 编码单元的序列。可以使用单引号或双引号创建一个字符串:

 var s1 = 'Single quotes work well for string literals.';
 var s2 = "Double quotes work just as well.";
 var s3 = 'It's easy to escape the string delimiter.';
 var s4 = "It's even easier to use the other delimiter.";

可以使用${expression}表达式的值放入字符串中。如果表达式是一个标识符,可以跳过{}。为了获得与对象对应的字符串,dart 会自动调用对象的toString()方法。

 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!');

注意: ==检验两个对象是否相等。如果两个字符串包含相同序列的代码单元,那么它们是等价的,这点与 JavaScript 类似。

可以使用相邻的字符串字面量(也可以看做是用空格)+ 运算符连接字符串:

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.');

对于创建多行字符串的方法:

  • 使用\n用做换行。
  • 使用带有单引号或双引号的三重引号。
var s = 'a \n multi-line string'
var s1 = '''
You can create
multi-line strings like this one.
''';
var s2 = """This is also a
multi-line string.""";

如果不想要转义字符你可以用r前缀创建一个原始字符串

var s = r'In a raw string, not even \n gets special treatment.';
// In a raw string, not even \n gets special treatment.

要注意一点,字符串字面量是编译时常量,只要任何内插表达式都是编译时常量,计算结果为 null 或数值、字符串或布尔值。

// These work in a const string.
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';
// These do NOT work in a const string.
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = [1, 2, 3];
const validConstString = '$aConstNum $aConstBool $aConstString';
// const invalidConstString = '$aNum $aBool $aString $aConstList'; // Error
/*
前三个错误因为使用var进行申明的,var声明的变量之后可以改变值,不符合常量定义,而后一个是因为不符合常量所需类型,也就是不符合null或数值、字符串或布尔值。即使使用toString()方法也会报错,这不符合编译时常量的定义,除非用final
*/
2.2.3 Boolean

为了表示布尔值,dart 有一个名为 bool 的类型。只有两个对象具有 bool 类型:布尔字面量 true 和 false,它们都是编译时常量。

dart 的类型安全性意味着不能使用if(非booleanvalue)assert(非booleanvalue)之类的代码。相反,显式地检查值,如:

 // Check for an empty string.
 var fullName = '';
 assert(fullName.isEmpty);
 ​
 // Check for zero.
 var hitPoints = 0;
 assert(hitPoints <= 0);
 ​
 // Check for null.
 var unicorn;
 assert(unicorn == null);
 ​
 // Check for NaN.
 var iMeantToDoThis = 0 / 0;
 assert(iMeantToDoThis.isNaN);

2.2.4 List

只要 List、Set、Map 等的基本用法见 dart 常用库的使用

Lst API 文档

也许几乎所有编程语言中最常见的集合就是数组或有序对象组。在 dart 中,数组是列表对象,所以大多数人把它们叫做列表。

dart 列表字面量看起来像 JavaScript 数组字面量。这是一个简单的 dart 列表:

 var list = [1, 2, 3];

注意: 上面的代码分析器推断该列表具有List<int>类型。如果试图向此列表添加非整型对象,则分析器或运行时将引发错误。

可以获取列表的长度,并引用列表元素,就像在JavaScript中那样:

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

要创建一个编译时常量列表(不能再之后改变值),需要在列表字面量之前添加 const(或者直接使用 const 申明变量):

var constantList = const [1, 2, 3];
// OR
const constantList = [1, 2, 3];
// constantList[1] = 1; // Uncommenting this causes an error.
// 这里不会在编译时报错,但是运行时会抛出异常

列表类型有许多便于操作列表的方法,在这里不说,在之后会进行详细说明。

2.2.5 Set

Set API 文档

dart 中的集合是一组无序的独特物品集合。因为集合是无序的,所以不能通过索引(位置)获得集合的项。

var ingredients = Set();
ingredients.addAll(['gold', 'titanium', 'xenon']);
assert(ingredients.length == 3);
// Adding a duplicate item has no effect.
ingredients.add('gold');
assert(ingredients.length == 3);
// Remove an item from a set.
ingredients.remove('gold');
assert(ingredients.length == 2);

使用contains()containsAll()来检查集合中是否有一个或多个对象:

var ingredients = Set();
ingredients.addAll(['gold', 'titanium', 'xenon']);
// Check whether an item is in the set.
assert(ingredients.contains('titanium'));
// Check whether all the items are in the set.
assert(ingredients.containsAll(['titanium', 'xenon']));

交集是一个集合,其项在另外两个集合中:

var ingredients = Set();
ingredients.addAll(['gold', 'titanium', 'xenon']);
// Create the intersection of two sets.
var nobleGases = Set.from(['xenon', 'argon']);
var intersection = ingredients.intersection(nobleGases);
assert(intersection.length == 1);
assert(intersection.contains('xenon'));

2.2.6 Map

Map API 文档

通常,map 是一个关联键和值的对象。键和值都可以是任何类型的对象。每个键只出现一次,但是您可以多次使用相同的值。dart 对 map 的支持是通过 map 字面量和 map 类型来提供的。(可以看做是混入了 JavaScript 对象字面量写法和 JAVA 的 HashMap 键值的对象)

var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};
var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

注意:

在上面的代码中,解析器推断 gifts 的类型为Map<String, String>,nobleGases 的类型为Map<int, String>。如果您试图向 map 添加错误类型的值,则分析器或运行时将引发错误。

dart 中的 map 和 JavaScript 中的对象是有区别的,键(key)可以是任意数据类型,并且如果是 String 类型的话不能省略引号,因为在 dart 中这样会将其解析为一个变量。

const a = '1';
var map1 = {
    true: '123',
    a: '2', // 不加引号的a会被解析为'1'
    b: '2', // 报错,没有b变量
    'a': '2'
};

同样的,在通过 map 的键获取值得时候,不能使用 JavaScript 中常见的点(.)操作符,只能使用[]操作符,点(.)操作符只能用在获取 dart 中通过类生成的对象的属性或方法中(因为 map 生成的自变量只是看起来和 JavaScript 中的一样,实际上还是有很大差别的) 。

同样可以使用Map构造函数创建对象:

var gifts = new Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';
var nobleGases = new Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';

添加值和检索值都如同 JavaScript 中那样进行,不同的是:

如果要获取的键不再 map 中,将会返回一个 null:

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

可以使用.length获取 map 中元素的个数:

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

要创建一个编译时常量的 map 需要在 map 的字面量前加const关键字(或直接使用 const 声明的变量):

 var constantMap = const {
   2: 'helium',
   10: 'neon',
   18: 'argon',
 };
 // OR
 const constantMap = {
   2: 'helium',
   10: 'neon',
   18: 'argon',
 };
 ​
 // constantMap[2] = 'Helium'; // Uncommenting this causes an error.
 // 这里不会在编译时报错,但是运行时会抛出异常

2.2.7 Runes(字符)

在 dart 中,字符是字符串的UTF-32编码点。

Unicode 为世界上所有的书写系统中使用的每个字母、数字和符号定义一个唯一的数值。因为 dart 字符串是 UTF-16 代码单元的序列,所以在字符串中表示32位的 Unicode 值需要特殊的语法。

表示 Unicode 码点的常用方法是\uXXXX,其中 XXXX 是4位数的十六进制值。例如,心型字符(♥)的编码为\u2665。要指定大于或小于4位十六进制数字,请将值放在花括号中。例如笑脸表情()的编码\u{1f600}

String 类有几个属性可以用来获取 runes信息。codeUnitAt 和 codeUnit 属性返回16位代码单元。使用字符属性获取字符串的字符。

下面的示例说明了字符、16位代码单元和32位代码点之间的关系:

main() {
  var clapping = '\u{1f600}';
  print(clapping);
  print(clapping.codeUnits);
  print(clapping.runes.toList());
  Runes input = new Runes(
      '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
  print(new String.fromCharCodes(input));
}
//运行效果如下
                        
(0)

相关推荐

  • SafeList in Flutter and Dart小技巧

    目录 正文 封装一个SafeList 测试一下 正文 最近遇到一些列表的错误,例如,列表为空时直接调用方法会报错. 一般都会在使用前判断列表是否为空,再使用. 虽然Flutter提供了Null safety,但是用的时候还是会忘记或者忽略,直接使用'!'来跳过非空判断. 封装一个SafeList 代码如下: class SafeList<T> extends ListBase<T> { final List<T> _list; final T defaultValue;

  • Dart多个future队列完成加入顺序关系及原子性论证

    目录 引言 什么是 Future Future 操作具备'原子性'吗 实验写法一: 实验写法二: 实验写法三: 论证结论 引言 Dart 是一个在单线程中运行的程序.在程序中执行一个需要长时间的执行的操作,为避免卡住UI主线程,我们会用到异步(future),可以使程序在等待一个耗时操作完成时继续处理其他工作. 在进入正题之前,我们先了解一下 Dart 的消息循环机制: Dart 从两个队列执行任务:Event事件队列 和 Microtask微任务队列 事件循环会优先处理微任务队列,microt

  • Flutter Dart快速排序算法示例详解

    目录 引言 快速排序算法 分治法(Divide and conquer) 快速排序算法实现 引言 在日常研发的过程中,我们无时无刻都在考虑自己开发的程序是否高效,一段好的程序执行离不开对算法的深刻认识和熟练掌握.接下来的日子,我将带着大家一起重温一下常见的几种算法. 先上大图: 下面我们一起来学习一下 快速排序算法 吧! 快速排序算法 维基百科介绍: 快速排序使用分治法(Divide and conquer)策略來把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列,最终合

  • 一文详解Dart如何实现多任务并行

    目录 Isolate(隔离区域) async/await Stream Compute Function Isolate(隔离区域) Dart 是一种支持多任务并行的编程语言,它提供了多种机制来实现并发和并行.下面是 Dart 实现多任务并行的几种方式: Dart 中的 Isolate 是一种轻量级的并发机制,类似于线程.每个隔离区域都是独立的内存空间,每个隔离区域都有自己的内存空间和执行线程,因此不同的隔离区域之间可以独立地执行代码,每个隔离区都在自己的核心上运行,不会阻塞其他 Isolate

  • Flutter入门学习Dart语言变量及基本使用概念

    目录 正文 变量 变量的声明赋值 变量的划分 默认值 变量的类型推断修饰符 Late变量 类型判断is和类型转换as 一些重要概念 空安全和可空类型? 表达式和语句 注释 DartPad 正文 Dart是Google发布的开源编程语言,是一种面向对象的语言.其主要应用是Flutter框架开发(Android.IOS),此外,也可以用在服务器.脚本.Web开发中.随着Flutter3.0开始支持全平台开发,Dart也可以实现桌面应用. 关于Dart的介绍不再细说.下面开始Dart的使用介绍 首先记

  • Dart多态控制反转编码规范实例详解

    目录 前言 举栗子 方式一:通过传参构造器进行控制反转 方式二:通过继承 + 泛型进行解耦 前言 我们通常都知道程序设计要依赖抽象,提高复用性,做到对扩展开放,对修改关闭.贯彻SOLID五大原则的最重要法宝就是抽象和继承.多态是一种手段,下面,通过简单 demo 介绍 flutter 开发中常用的最佳实践. 举栗子 /// 不推荐,避免把逻辑放在公共底层处理 class TestWidget extends StatefulWidget { const TestWidget({Key? key}

  • TypeScript 基本数据类型实例详解

    目录 TypeScript 介绍 类型分配 类型推导 数组 元组 object null 和 undefined 特殊类型 any unknown never void TypeScript 介绍 TypeScript 是 JavaScript 的超集,提供了 JavaScript 的所有功能,并提供了可选的静态类型.Mixin.类.接口和泛型等特性. TypeScript 的目标是通过其类型系统帮助及早发现错误并提高 JavaScript 开发效率. 通过 TypeScript 编译器或 Ba

  • 基于Java class对象说明、Java 静态变量声明和赋值说明(详解)

    先看下JDK中的说明: java.lang.Object java.lang.Class<T> Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class tha

  • JavaScript复制变量三种方法实例详解

    这篇文章主要介绍了JavaScript复制变量三种方法实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 直接将一个变量赋给另一个变量时,系统并不会创造一个新的变量,而是将原变量的地址赋给了新变量名.举个栗子: 复制代码 复制代码 let obj = { a: 1, b: 2, }; let copy = obj; obj.a = 5; console.log(copy.a); // Result // a = 5; // 更改obj的值,

  • Python 变量类型实例详解

    目录 1.变量赋值 2.多个变量赋值 3.标准数据类型 4.Python 数字 5.Python字符串 6.Python列表 7.ython 元组 8..Python 字典 9.Python数据类型转换 前言: 变量存储在内存中的值,这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符. 1.变量赋值 Python 中的变量赋值不需要类型声明. 每个变量在内

  • php之可变变量的实例详解

    php之可变变量的实例详解 前言: 最近在技术博客网站上偶然间浏览到一个新名词:"php的可变变量":然后就在网上查了下了解下,觉得用的还挺方便的,下面都是从网上代码copy到我本地环境运行后算是"拿来主义!" php手册上这样说: 有时候使用可变变量名是很方便的.就是说,一个变量的变量名可以动态的设置和使用.一个普通的变量通过声明来设置,例如: $a = 'hello'; $$a = 'world'; echo "$a ${$a}"; echo

  • ECMAScript6变量的解构赋值实例详解

    数组的解构赋值 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring) var [a, b, c] = [1, 2, 3]; 这种写法属于"模式匹配",只要等号两边的模式相同,左边的变量就会被赋予对应的值. 下面是一些使用嵌套数组进行解构的例子 let [foo, [[bar], baz]] = [1, [[2], 3]]; foo // 1 bar // 2 baz // 3 let [ , , third] = ["foo

  • Kotlin 基础语法实例详解

    Kotlin 基础语法实例详解 包 定义和引入Java一样,在文件开头, 行结束不需要" ; " package com.test.hello import android.os.Bundle 变量 只读变量,val 开头,初始化后不能再赋值,相当于Java的 final 变量 val a: Int = 1 val b = 1 //类型自动推断为Int val c: Int //没有初始化时必须指定类型 c = 1 //初始化 可变变量, var 关键字开头 var x = 10 x

  • Python数据类型之列表和元组的方法实例详解

    引言 我们前面的文章介绍了数字和字符串,比如我计算今天一天的开销花了多少钱我可以用数字来表示,如果是整形用 int ,如果是小数用 float ,如果你想记录某件东西花了多少钱,应该使用 str 字符串型,如果你想记录表示所有开销的物品名称,你应该用什么表示呢? 可能有人会想到我可以用一个较长的字符串表示,把所有开销物品名称写进去,但是问题来了,如果你发现你记录错误了,想删除掉某件物品的名称,那你是不是要在这个长字符串中去查找到,然后删除,这样虽然可行,那是不是比较麻烦呢. 这种情况下,你是不是

  • C#语法新特性之元组实例详解

    1.元组(Tuple) 元组(Tuple)在4.0 的时候就有了,但元组也有些缺点,如: 1)Tuple 会影响代码的可读性,因为它的属性名都是:Item1,Item2.. . 2)Tuple 还不够轻量级,因为它是引用类型(Class),对于一个变量要使用一个类型,有点太没必要了. 源代码如下: // 摘要: // 提供用于创造元组对象的静态方法.若要浏览此类型的.NET Framework 源代码,请参阅 Reference Source. public static class Tuple

  • C++ 析构函数与变量的生存周期实例详解

     C++ 析构函数与变量的生存周期实例详解 这篇介绍了析构函数,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用.如果有一些C++知识记不清楚了,它可以帮你很快回忆起来. 析构函数(destructor)的名字与类名相同,但是前面要加"-".析构函数没有参数和返回值,当然也就不能被重载. 何时调用析构函数 析构函数在对象消亡时自动调用,这是都了解的情况,但是实际上这还隐含的说:函数的参数对象以及作为函数返回值的对象,在消亡时也会引发析构函数调用. #include<io

随机推荐