Flutter 我是否应该将所有方法参数标记为final并指定类型

Flutter 我是否应该将所有方法参数标记为final并指定类型,flutter,dart,Flutter,Dart,有效dart指定顶级变量在适用时应为最终变量: 但是,我找不到有关方法参数的任何信息 Flatter repo的代码函数大多是参数未标记为final的函数,其中包括我见过的所有重写的构建方法 以下哪项在性能和应用程序重量方面更好: @覆盖构建上下文 @重写buildContext上下文 @覆盖buildfinal构建上下文上下文 也许重写的函数应该以与超级函数相同的方式定义?可以推断类型的重写函数(如上面的build)与其他命名/未命名函数(不设置类型除外)之间是否存在任何差异?Flatter

有效dart指定顶级变量在适用时应为最终变量:

但是,我找不到有关方法参数的任何信息

Flatter repo的代码函数大多是参数未标记为final的函数,其中包括我见过的所有重写的构建方法

以下哪项在性能和应用程序重量方面更好:

@覆盖构建上下文

@重写buildContext上下文

@覆盖buildfinal构建上下文上下文

也许重写的函数应该以与超级函数相同的方式定义?可以推断类型的重写函数(如上面的build)与其他命名/未命名函数(不设置类型除外)之间是否存在任何差异?Flatter repo也这样写:

static double _flingDistancePenetration(double t) { // t is not final, although treated as immutable
 return (1.2 * t * t * t) - (3.27 * t * t) + (_initialVelocityPenetration * t);
}

我看到了关于Java的这个问题:,虽然我同意上面的答案,但我完全不知道为什么Flatter repo不这么做。

关于参数类型:是的,总是包括它们。否则,您的参数很可能是dynamic1,这会导致运行时开销,并且没有类型安全性。您还希望API清楚地指定它期望的参数类型

关于final:这是一个基于意见的问题,我的意见是,虽然我同意prefere_final_字段lint,但我不同意prefere_final_lint。我认为为局部变量(包括函数/方法参数)添加final是没有意义的

与相关Java问题的答案相反,任何半体面的编译器都应该能够轻松确定是否重新分配了局部变量。如果有任何优化机会,编译器应该能够为您完成

在DART等语言中,实现通常与接口相接口,而不是C或C++等语言,它们具有单独的头文件来声明接口,最后的参数添加是视觉噪声。它不向呼叫者提供有用的信息

无论如何,您不应该单方面地将所有函数/方法参数标记为final。有时重新分配参数是合适的。例如,如果函数需要对其参数执行某种规格化:

无效文件{ file=file.absolute; ... } 在这种情况下,使用最终文件意味着规范化版本需要一个单独的局部变量,现在代码很容易出错,因为它可能会意外地使用原始变量

字段的最终值是API的一个重要部分。它告诉调用者该字段不会被重新分配;字段引用的对象将始终是同一对象。局部变量和函数/方法参数的最终结果仅影响实现函数的人员。如果实现者不想重新分配变量,他们可以选择不重新分配变量

有些人会声称,拥有最终的局部变量有助于代码可读性,因为他们知道变量不会被重新分配。然而,我认为final可能是误导性的,因为它只说变量不能重新分配,而不是说它不会变异,知道后者更重要


1对于重写的方法,参数类型受基类声明的相应参数类型的约束。因此,在重写方法中省略参数类型将使用基类中的参数类型。

关于参数类型:是,始终包括它们。否则,您的参数很可能是dynamic1,这会导致运行时开销,并且没有类型安全性。您还希望API清楚地指定它期望的参数类型

关于final:这是一个基于意见的问题,我的意见是,虽然我同意prefere_final_字段lint,但我不同意prefere_final_lint。我认为为局部变量(包括函数/方法参数)添加final是没有意义的

与相关Java问题的答案相反,任何半体面的编译器都应该能够轻松确定是否重新分配了局部变量。如果有任何优化机会,编译器应该能够为您完成

在DART等语言中,实现通常与接口相接口,而不是C或C++等语言,它们具有单独的头文件来声明接口,最后的参数添加是视觉噪声。它不向呼叫者提供有用的信息

无论如何,您不应该单方面地将所有函数/方法参数标记为final。有时重新分配参数是合适的。例如,如果函数需要对其参数执行某种规格化:

无效文件{ file=file.absolute; ... } 在这种情况下,使用最终文件意味着您需要为normali使用单独的局部变量 现在代码很容易出错,因为它可能会意外地使用原始变量

字段的最终值是API的一个重要部分。它告诉调用者该字段不会被重新分配;字段引用的对象将始终是同一对象。局部变量和函数/方法参数的最终结果仅影响实现函数的人员。如果实现者不想重新分配变量,他们可以选择不重新分配变量

有些人会声称,拥有最终的局部变量有助于代码可读性,因为他们知道变量不会被重新分配。然而,我认为final可能是误导性的,因为它只说变量不能重新分配,而不是说它不会变异,知道后者更重要


1对于重写的方法,参数类型受基类声明的相应参数类型的约束。因此,在重写方法中省略参数类型将使用基类中的参数类型。

回答问题的作者

不应将所有方法参数标记为最终参数 您应该指定类型 示例:

fooBaz baz

无效主列表参数

这些规则的例外

如果类型是动态的,则可以省略类型指示 在使用函数表达式的情况下,如果类型可以由编译器自动推断,则不能指定类型。 fooBaz酒吧

list.sortx,y=>x.compareToy

一些有用的信息:

根据Dart规范:

最后一个变量是其绑定在初始化时固定的变量;在v被初始化之后,最后一个变量v将始终引用同一个对象。如果变量的声明包含修饰符final或修饰符const,则该变量为final。可变变量是一个非最终变量

变量不变性不会使对象在Dart中不可变

当变量不变性与对象不变性相混淆时,这是一个非常常见的误解

附言

一个常见的误解是Dart用户得到的印象是Dart中的函数参数是通过引用传递的。 事实并非如此。 参数是通过值传递的,而不是通过引用传递的。 但由于规范中指出,任何变量都已经包含引用对象的引用,而不是引用对象本身,因此实际上,该引用是通过值作为正常值传递的。 也就是说,传递了一个值,但该值本身是referencetype,这在语言规范中指明

根据Dart规范:

最后一个变量v将始终引用同一对象

也就是说,变量存储引用,而不是值本身。
这个引用是按值传递的,因为没有理由按引用传递这个引用。

回答问题的作者

不应将所有方法参数标记为最终参数 您应该指定类型 示例:

fooBaz baz

无效主列表参数

这些规则的例外

如果类型是动态的,则可以省略类型指示 在使用函数表达式的情况下,如果类型可以由编译器自动推断,则不能指定类型。 fooBaz酒吧

list.sortx,y=>x.compareToy

一些有用的信息:

根据Dart规范:

最后一个变量是其绑定在初始化时固定的变量;在v被初始化之后,最后一个变量v将始终引用同一个对象。如果变量的声明包含修饰符final或修饰符const,则该变量为final。可变变量是一个非最终变量

变量不变性不会使对象在Dart中不可变

当变量不变性与对象不变性相混淆时,这是一个非常常见的误解

附言

一个常见的误解是Dart用户得到的印象是Dart中的函数参数是通过引用传递的。 事实并非如此。 参数是通过值传递的,而不是通过引用传递的。 但由于规范中指出,任何变量都已经包含引用对象的引用,而不是引用对象本身,因此实际上,该引用是通过值作为正常值传递的。 也就是说,传递了一个值,但该值本身是referencetype,这在语言规范中指明

根据Dart规范:

最后一个变量v将始终引用同一对象

也就是说,变量存储引用,而不是值本身。 这个引用是按值传递的,因为没有理由按引用传递这个引用。

我不同意“首选最终”局部变量。将局部变量声明为不可变有什么错?只有一小部分局部变量被重新分配,大多数变量没有变化,值只分配一次。十二月有什么意义
把它们归类为可变的?@AlexeySubbotin这是我的第一点:将局部变量标记为final或not会告诉编译器任何它自己无法推断的东西,因此,无论您选择优化性能还是优化大小,它都不会影响优化机会。@mezoni final没有将局部变量声明为不可变,但读者可能错误地认为它是不可变的。就像我说的,这是我的意见。我承认我反对非参数局部变量final的论点很弱,但我认为支持final的论点也同样弱。局部变量的final并没有传达意图:它通常表示代码中碰巧是真的东西,而不是预期的不变量。即使作者打算使用final来表示变量应该是不可变的,但读者也没有办法告诉他们。Ha-Ha-Ha。从Dart规范开始:最后一个变量是一个变量,其绑定在初始化时是固定的;在v被初始化之后,最后一个变量v将始终引用同一个对象。如果变量的声明包含修饰符final或修饰符const,则该变量为final。可变变量是一个非最终变量。结束QUOTE@mezoni我的错误。您是对的:Dart语言规范确实是这样定义可变变量的。我的语言不够精确:我的意思是final不能使对象不可变,这是一个更重要、更有趣的区别。我不同意preference\u final\u locals。将局部变量声明为不可变有什么错?只有一小部分局部变量被重新分配,大多数变量没有变化,值只分配一次。声明它们是可变的有什么意义?@AlexeySubbotin这是我的第一个观点:将局部变量标记为final或not不会告诉编译器任何它自己无法推断的东西,因此,无论您选择优化性能还是优化大小,它都不会影响优化机会。@mezoni final没有将局部变量声明为不可变,但读者可能错误地认为它是不可变的。就像我说的,这是我的意见。我承认我反对非参数局部变量final的论点很弱,但我认为支持final的论点也同样弱。局部变量的final并没有传达意图:它通常表示代码中碰巧是真的东西,而不是预期的不变量。即使作者打算使用final来表示变量应该是不可变的,但读者也没有办法告诉他们。Ha-Ha-Ha。从Dart规范开始:最后一个变量是一个变量,其绑定在初始化时是固定的;在v被初始化之后,最后一个变量v将始终引用同一个对象。如果变量的声明包含修饰符final或修饰符const,则该变量为final。可变变量是一个非最终变量。结束QUOTE@mezoni我的错误。您是对的:Dart语言规范确实是这样定义可变变量的。我的语言不够精确:我的意思是final不能使对象不可变,这是一个更重要、更有趣的区别。感谢您澄清方法参数中值和引用之间的区别。然而,依我看,语言规范对于用户来说太多了,而不是参与者。希望我有足够的时间浏览几页。感谢您提供的资料。感谢您澄清方法参数中值和引用之间的区别。然而,依我看,语言规范对于用户来说太多了,而不是参与者。希望我有足够的时间浏览几页。谢谢你的材料。