首页
学习
活动
专区
圈层
工具
发布

Dart中final和const的异同点

相同点 二者都可以用来定义一个常量,如下所示: const PI = 3.14159265; print(PI); final PI2 = 3.14; print(PI2);...final currentTime = new DateTime.now(); print(currentTime); 这段代码运行是没有任何问题的,结果如下: 2019-07-01 17:58:23.197829...我们将上面代码中的final改成const,如下: const currentTime = new DateTime.now(); print(currentTime); 此时程序报错了:...const是编译时常量,const修饰的常量值在编译的时候需要确定。 final是运行时常量,它是惰性初始化,即在运行时第一次使用前才会进行初始化。...因此,如果常量值在编译的时候就已经确定,运行时也不会改变,那么使用const和final均可;如果常量值在运行的时候才会确定(比如调用一个方法来给常量赋值),那么就必须使用final,不可以使用const

56840
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Dart 中final和const的使用详解 原

    1.基本使用 如果变量的值不发生变化,那么可以使用 final 或 const 修饰, ----final:只能被设一次值,在声明处赋值,值和普通变量的设值一样,可以是对象、字符串、数字等,用于修饰值的表达式不变的变量...; final name = 'Bob'; // name = 'job'; //运行出错,因为final修饰的变量不能调用其setter方法,即:不能设值 ----const:只能被设一次值,在声明处赋值...,即:非const修饰的变量(只有const修饰的变量才是编译时常量) ----const还可以用来声明常量值: // [] 创建一个空列表. // const [] 创建一个空的不可变列表 (EIA).... var foo = const []; // foo 目前是一个 EIA. final bar = const []; // bar 永远是一个 EIA. const baz = const [...//你可以改变 非final, 非const 修饰的变量, // 即使它的值为编译时常量值. foo = []; // 不能改变final和const修饰的变量的值. // bar = []; //

    1.2K10

    Python函数参数传递:传值还是传引用

    按照C++语言的思维,如果Python函数参数的传递是传值的话,结果应该是[0, 1],如果是传引用的话,结果应该是[‘T’, ‘Z’, ‘Y’]。 可是实际结果是:[0, 1, 100]。...所以,Python函数参数的传递既不是所谓的传值也不是传引用。 Python函数参数传递 那么Python中函数参数到底是以什么形式传递的呢?...明白了这个概念,那么我们可以说Python中函数参数的传递是传递的变量的值,即就是变量所指向的对象的地址。 一般的,我们有下面的规律: 1....不可变对象作为函数参数,相当于C系语言的值传递。 2. 可变对象作为函数参数,相当于C系语言的引用传递。...所以最重要的一点是明白:Python中函数参数的传递是变量指向的对象的地址;Python中变量和对象的不同。

    3.9K51

    go语言中函数参数传值还是传引用的思考

    C++函数参数的传值和传引用 熟悉C++的程序员们应该都清楚,C++里传递函数参数的时候,传值还是传引用是函数声明的时候决定的。...,在传递结构体或复合类型做入参时,为了避免拷贝的开销,传常引用的声明方式更是司空见惯: void PassStructByRef(const std::string& str) 这种传递大结构体时用引用的习惯...go函数参数一律传值 预声明类型如int,string等,以及普通的命名结构类型没什么好说的,无论是传递该类型的值还是指针作为函数参数,本质上都是传值,这点和C++一样。...这里主要讨论slice,map和chan三种复合类型在作为函数参数时的情况。...C++的函数参数通过常引用和引用来区分入参和出参,对读代码的人来说一目了然;go里函数参数不存在const修饰符,取而代之的提供了多返回值的特性,故完全可以把入参放到普通参数的位置,而把出参全部作为返回值

    5.1K40

    const的正确姿势:从变量、函数到成员函数

    函数中的 const:参数与返回值const 参数将函数参数声明为指向 const 或 const 引用,是常量正确性的最重要应用之一。...不能将 const 引用绑定到非 const 引用参数上正确示范:void goodFunction(const std::string& str); // 这个函数承诺不会修改 strgoodFunction...核心战场:const 成员函数将成员函数声明为 const 是常量正确性的另一核心,它表明“这个函数不会修改对象的可观测状态”。...最佳实践:对于所有需要在编译期确定值的场合(如数组大小、模板参数、case 标签等),使用 constexpr。对于只需要运行时不改变的值,使用 const。...使用 const & 参数:对于非内置类型的输入参数,使用 const T& 或 const T* 来避免拷贝并保证不修改源对象。

    4910

    函数的参数

    函数是绝大多数编程语言中都支持的一个代码的“构建块”,但是Python中的函数与其他语言中的函数还是有很多不太相同的地方,其中一个显著的区别就是Python对函数参数的处理。...在Python中,函数的参数可以有默认值,也支持使用可变参数,所以Python并不需要像其他语言一样支持函数的重载,因为我们在定义一个函数的时候可以让它有多种不同的使用方式,下面是两个小例子。...print(add(c=50, a=100, b=200)) 我们给上面两个函数的参数都设定了默认值,这也就意味着如果在调用函数的时候如果没有传入对应参数的值时将使用该参数的默认值,所以在上面的代码中我们可以用各种不同的方式去调用...其实上面的add函数还有更好的实现方案,因为我们可能会对0个或多个参数进行加法运算,而具体有多少个参数是由调用者来决定,我们作为函数的设计者对这一点是一无所知的,因此在不确定参数个数的时候,我们可以使用可变参数...# 在参数前使用*表示args是可变参数 # 也就是说调用add函数时传入的参数个数可以是0个或多个 def add(*args): total = 0 for val in args: total

    1.9K40

    函数的参数

    函数的定义(一): 函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字。 可以通过函数名在程序的不同地方多次执行(这通常叫函数调用)。...代码重用 避免重复劳作,提供效率 函数的定义和调用 def 函数名([参数列表]): ______定义 函数名([参数列表]) ______调用 函数名可以使用 数字+字母+下划线组成; 如果函数名有两个单词组成...例子1: 判断从键盘输入的是数字还是非数字: def fun(): sth = raw_input("pls input a number :") try: if type...---- 函数的定义(二) 形式参数和实际参数 在定义函数时,函数名后面括号中的变量名称叫做“形式参数”,或者称为“形参” 在调用函数时,函数名后面括号中的变量名称叫做“实际参数”,或者称为“实参” 综合演练...函数的默认参数: In [88]: def aa(x, y): ##定义两个形参 ...: print x + y ...: In [89]: aa(3,6

    2K70

    expr_const在函数前与函数后的区别

    const int sz = get_size(); staff_size的初始值虽然是个字面值常量,但它的数据类型只是普通的int而非const int,还是可以被重新赋值的,所以不是常量表达式。...constexpr把它所定义的对象置为了顶层const。...int *p = &i; //p是常量指针,指向整型常量i constexpr int *p1 = &j; //p1是常量指针,指向整数j 六、字面值常量类 constexpr函数的参数和返回值必须是字面值类型...注意,函数的返回值必须是字面值类型,但可以不是一个常量。 和其他类不同,字面值类型的类可能含有constexpr函数成员。这样的成员必须符合constexpr函数的所有要求,它们是隐式const。...类必须使用析构函数的默认定义,该成员负责销毁类的对象。 尽管构造函数不能是const的,但是字面值常量类的构造函数可以是constexpr函数。

    99730

    Python学习笔记之函数参数传递 传值还是传引用

    在学完Python函数那一章节时,很自然的的就会想到Python中函数传参时传值呢?还是传引用?或者都不是? ...现在我们再来看看开始那两段代码: def foo(var): var = 2 print(var) a = 1 foo(a) print(a) 上面这段代码把a作为参数传递给函数...然后在函数中var = 2时,因为int对象不可改变,于是创建一个新的int对象(值为2)并且令var指向它。而a仍然指向原来的值为1的int对象,所以函数没有改变变量a。 如下图: ?...因为list对象是可以改变的,函数中使用append在其末尾添加了一个元素,list对象的内容发生了改变,但是b和var仍然是指向这一个list对象,所以变量b的内容也发生了改变。 如下图: ?...那么Python中参数传递是传值,还是传引用呢?准确的回答:都不是。之所以不是传值,因为没有产生复制,而且函数拥有与调用者同样的对象。而似乎更像是C++的传引用,但是有时却不能改变实参的值。

    2.2K30

    可变参数的函数

    什么是可变参数函数 C语言允许定义参数数量可变的函数,这称为可变参数函数(variadic function)。这种函数需要固定数量的强制参数,后面是数量可变的可选参数。...其中,强制参数必须至少一个,可选参数数量可变,类型可变,可选参数的数量由强制参数的值决定。 C 语言中最常用的可变参数函数例子是 printf()和 scanf()。...这两个函数都有一个强制参数,即格式化字符串。格式化字符串中的转换修饰符决定了可选参数的数量和类型。 可变参数函数格式:int fun(int a,...)...可变参数的获取 我先粘贴一下微软给我们的办法: 当编写可变参数函数时,必须用 va_list 类型定义参数指针,以获取可选参数。...现在引入两个函数实现上面的想法: void va_start(va_list argptr, lastparam); 该函数的第一个参数是一个va_list 类型的指针,第二个参数是可变参数函数中最后一个强制参数

    70010

    函数的参数-Python

    定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。...对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。 Python的函数定义非常简单,但灵活度却非常大。...除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。...从上面的例子可以看出,默认参数可以简化函数的调用。...当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。 使用默认参数有什么好处?最大的好处是能降低调用函数的难度。

    1.1K40

    Python函数的参数

    本章将介绍函数中参数的用法 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。...对于函数的调用者来说,只需要知道传递正确的参数,以及函数就返回什么样的值就够了,函数内部的复杂逻辑被封装起来了,调用者无须了解。 Python的函数定义非常简单,但灵活度却非常大。...除了正常定义的必须参数外,还可以使用默认参数、可变参数和关键词参数,使得函数定义出来的接口,不但能处理复杂的函数,还可以简化调用者的代码。...变化小的参数就可以作为默认参数。 使用默认参数有什么好处呢?最大的好处是能降低调用函数的难度。...无论是简单调用还是复杂调用,函数只需要定义一个。

    1.5K20

    Python的函数参数

    在调用函数时,该函数中的形参才会被分配内存,并赋值;函数调用结束,分配的内存空间也随即释放~ - 实参 即在调用函数时,向该函数的形参传递确定的值(必须是确定的值)。...传递的值可以是常量、变量、表达式、函数等形式~ 在形参和实参中又可以细化为多种参数,例如形参中有 位置形参,默认形参,可变长参数......使用注意点: 1)在调用函数时,位置实参 必须在 关键字实参的前面~ def func(x, y, z): print(x, y, z) # 位置参数和关键字参数混合使用的时候 func(1,...x=20 func('hello') Tip:func函数在定义时,age 只被赋值一次,即 age=10,下面重新指定了 x=20,不会再作用于函数中的 age 参数 可变长参数 在定义函数时,若不确定调用时需要传入多少个参数...前面提过 默认形参必须放在位置形参后面,如下示例的函数定义中,name 和 age 都是命名关键字参数(不是默认形参,也不是位置形参),name 是命名关键字参数的默认值,所以如下示例中的函数定义方式并没有问题

    1.4K20

    python函数的参数

    sum=sum + n * n     return sum 定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号,在函数内部,参数numbers接受到的是一个tuple,因此函数代码完全不变...,但是调用函数时,可传入任意个参数,包括0个参数 calc(1,2)=5 calc()=0 如果要传入的参数是一个list或tuple,调用写法 nums=[1,2,3] calc(nums[0],nums...tuple.而关键字参数允许你传入0个或任意个包含参数名的参数,这些关键字参数在函数内部自动组装为一个dict,请看示例 def   person(name,age,**kw)     print('name...、 对于关键参数,函数的调用者可以传入任意不受限制的关键字参数,至于传入哪些,就需要在函数内部通过kw检查 仍以person()函数讲解,我们检查是否有city和job (age**kw):     kw...最神奇的是通过tuple和dict,也可以调用上述函数 ? 所以,对于任意参数,都可以通过类func(*args,**kw)的形式调用它,无论它的参数是如何定义的

    1.1K10

    规避Variable used in lambda expression should be final or effectively final而引发了方法参数值拷贝的问题

    编译不过去, // Variable used in lambda expression should be final or effectively final...void copyMap(Map> sourceMap, Map> targetMap) { // 方法参数是值传递...); } } 问题 一开始是编译不过去的 Variable used in lambda expression should be final or effectively final 翻译过来就是说在...lambda表达式中只能引用标记了 final 的外层局部变量或者虽然没有显式定义为final,但实际上就是一个final变量,否则会编译错误。...然后翎野君一下子看出了其中的门道,然后给他讲了一下java中方法参数传递实际上是值传递的,之前还专门写过一篇文章辨析Java方法参数中的值传递和引用传递。

    79910

    const成员函数一定是线程安全的吗?

    ,它还可以在你打算更改基类中的虚函数的签名时,衡量一下波及的影响面 //final关键字:应用于虚函数,会阻止它在派生类中被改写,final也可以被应用于一个类,在这种情况下,该类会被禁止用作基类 //...和成员函数是否带有 const声明是一样的。...//宗旨:多个线程同时调用带有 const 得成员函数,如何保证线程的安全性 //const成员函数就一定是线程安全的吗?...,一个返回赋值的返回参数 */ //1, 拷贝构造函数 class XML{ public: //默认构造函数: 不带任何参数,在没有定义其他构造函数的情况下,编译器会自动生成默认构造函数.../** 注意两点: 1, 类中存在指针,会出现深拷贝和浅拷贝的问题,此时必须自定义拷贝构造函数实现深拷贝 2, 拷贝构造函数第一个参数必须是该类的一个引用

    1.3K20
    领券