我创建了一个名为GamblersDice 的娱乐库。我正在尝试对其进行微优化,但不确定我是否做得对。我想要的是在创建模具时使用对全局Random对象的引用。我认为它不起作用的原因是测试GamblersDie(random, int)和GamblersDie(ref random, int)花费几乎相同的时间超过 10,000,000 次迭代(测试项目在 repo 中)。如果你不想浏览 repo,这里是我的构造函数:public class GamblersDie : Die{ private Random _rnd; public int[] Weight { get; private set; } public GamblersDie() : this(new Random()) { } public GamblersDie(int size) : this(new Random(), size) { } public GamblersDie(params int[] weights) : this(new Random(), weights) { } public GamblersDie(Random rnd) : this(ref rnd) { } public GamblersDie(Random rnd, int size) : this(ref rnd, size) { } public GamblersDie(Random rnd, params int[] weights) : this(ref rnd, weights) { } public GamblersDie(ref Random rnd) : this(ref rnd, 6) { } public GamblersDie(ref Random rnd, int size) { _rnd = rnd; Weight = new int[size]; for (int i = 0; i < Weight.Length; i++) { Weight[i] = 1; } } public GamblersDie(ref Random rnd, params int[] weights) : this(ref rnd, weights.Length) { for (int i = 0; i < Weight.Length; i++) { Weight[i] = weights[i]; } }}就像我说的,这只是为了好玩。我想对它进行微优化,只是因为它可能是可能的。我的另一个问题是关于构造函数链接。乍一看它可能令人困惑,我想知道它是否是某种反模式。
1 回答
料青山看我应如是
TA贡献1772条经验 获得超8个赞
变量/参数包含什么?他们持有价值观。它们存储的值的性质是什么?对于 Value types( struct
),它们存储值本身。
但是对于引用类型 ( class
),它们存储一个引用;它们不存储位于其他地方的对象本身。
正是这些被复制-在默认通按值的参数传递在C#。复制引用与创建引用的对象的副本不同。因此,即使没有ref
,您也在处理方法内部和外部的单个对象。显然,对象的任何更改都将在外部可见。
您只需要ref
a) 要重新分配参数并且该重新分配应该是外部可见的,或者 b) 您正在改变 Value 类型并且该突变应该是外部可见的。
而且,如果上述内容不够清楚,我将在此处明确说明 -Random
是引用类型。
额外阅读:Eric Lippert 的《关于价值类型的真相》,您可能还没有准备好,但确实有助于消除一些您可能会在此过程中遇到的常见误解。
- 1 回答
- 0 关注
- 181 浏览
添加回答
举报
0/150
提交
取消