我正在为我正在研究的项目设计一个类结构。我有一个使用一个实例状态的方法。我现在不想将此方法设为静态并将此实例状态解析为参数或将该方法绑定到实例更好。
如果性能没有问题,我会毫无疑问地将该方法与实例联系起来,因为它更加清晰。但就我而言,表现将非常重要。那么,使方法成为静态/非静态在性能方面有什么不同吗?
如果它没有任何区别,对于生成的* .dart.js javascript也是如此吗?
修改 在阅读了我自己的问题之后,它并不是真正的连贯性。我会再次尝试制定它,但更清楚。
此代码......
class MyClass {
void foo() {}
}
void main() {
MyClass a = new MyClass();
MyClass b = new MyClass();
print(a.foo == b.foo);
}
...输出错误。这让我觉得每个新实例都会创建一个新方法。如果这是真的,这在我看来是浪费记忆。那么,每个新实例是否都会创建所有绑定方法的副本?
PS:这个问题与this question基本相同,但后来为Dart。
答案 0 :(得分:3)
不,创建两个实例不会复制方法。方法类似于静态函数,其中对象实例作为参数传递,名称为this
。
在遇到实际性能问题之前,不要过于担心性能,尤其是在这样的微观层面。 通常,性能不是应用程序代码库中较大部分的问题,因为大多数代码通常很少运行。 当您遇到性能问题时,您可以调查并找到经常执行的真正热点,以便优化实际上有所作为。
答案 1 :(得分:2)
Dart类对于不同的实例没有不同的方法。 每个班级只有一种方法。
提取函数每次执行时都会创建一个新的函数对象,这些对象可能相同也可能不相同,具体取决于从哪些对象中提取的函数:
class MyClass {
void foo() {}
}
void main() {
MyClass a = new MyClass();
MyClass b = new MyClass();
print(a.foo == b.foo); // False.
print(a.foo == a.foo); // True
print(identical(a.foo, a.foo)); // False!
}
从对象执行方法提取时,将创建一个新对象。新对象是一个“闭包”,它包含要调用的函数和调用它的对象。如果它们在同一个对象上引用相同的函数,则两个这样的闭包是相等的(根据operator ==)。这就是a.foo
和b.foo
不相等的原因 - 它们分别等同于() => a.foo()
和() => b.foo()
,因为a
和b
不是同一个对象,函数对象不被认为是相等的。