为何Dart实例名常用下划线前缀?起源与性质解析
嘿,这个问题问得太戳中Dart/Flutter开发者日常了!我来给你拆解明明白白~
核心原因是封装性!Dart里没有像Java那样的public/private关键字,它用下划线_来标识库私有成员——意思是,只要成员(变量、方法、甚至类)名字开头带下划线,就只能在同一个.dart文件里被访问,跨文件的代码根本碰不到它。
拿你给的示例来说:
class MyState extends State<MyWidget>{ int _index = 1; _increment() => _index++; }
如果这个MyState类单独放在一个文件里,其他文件的代码没法直接改_index或者调用_increment(),只能通过类对外暴露的公共方法(比如一个void incrementIndex() { setState(() => _increment()); })来触发状态变化,这样就能牢牢把控内部逻辑,避免外部乱改导致的bug。
Dart在设计时就选了下划线作为私有标识,这其实借鉴了脚本语言的传统——比如Python也用下划线区分私有成员(单下划线弱私有,双下划线更严格)。不过Dart的规则更直接:只要开头有下划线,就是库级私有。这种设计不用额外加关键字,让语法更简洁,完全符合Dart“轻量、易用”的设计初衷。
绝对是Dart和Flutter生态里的主流规范,根本不是个人偏好!
- 首先,Flutter官方文档、官方示例,还有几乎所有热门pub插件(比如provider、bloc)都严格遵守这个规则,用来封装组件内部状态和工具方法。
- 其次,Dart自带的Lint代码检查规则,会主动提醒开发者把不需要对外暴露的成员加上下划线,强制你保持代码的整洁性。
- 团队协作时,这更是默认的编码共识,大家都这么写,代码风格统一,可读性拉满。
举个实际场景:Flutter的StatefulWidget中,State类的内部状态几乎全是下划线开头,因为这些状态只需要在State内部管理,外部组件根本没必要直接碰,通过setState()更新就足够了,能有效避免外部乱改状态导致的UI异常。
小提醒:Dart的私有是库级别不是类级别哦!同一个
.dart文件里的多个类,是可以互相访问彼此的下划线成员的,这点和Java的类私有不一样,别搞混啦~
内容的提问来源于stack exchange,提问作者Alexey Subbotin

