我创建了一个有趣的图书馆GamblersDice。我正在尝试对其进行微优化,但是不确定我是否做对了。我想要的是在创建模具时使用对全局 Random 对象的引用。我认为它不起作用的原因是,测试 GamblersDie(random,int)和 GamblersDie(ref random,int)几乎需要花费1000万次迭代(测试项目是在回购中)。如果您不想浏览整个仓库,这里是我的构造函数:
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];
}
}
}
就像我说的那样,这只是为了好玩。我想对其进行微优化,只是因为有可能。我还有一个关于构造函数链接的问题。乍一看,这可能会令人困惑,我想知道这是否是某种反模式。
答案 0 :(得分:2)
变量/参数有什么用?它们具有值。它们存储的值的本质是什么?对于值类型(struct
),它们存储值本身。
但是对于引用类型(class
),它们存储引用;他们不存储对象本身,对象位于其他地方。
将这些 复制到C#中传递的默认传递值参数中。复制 reference 与创建其引用的对象的副本并不相同。因此,即使没有ref
,您也要在方法内部和外部处理单个 object 。对对象的所有更改显然都可以在外部看到。
仅在以下情况下需要ref
:a)您将重新分配参数,并且重新分配应该在外部可见;或者b)您正在对值类型进行突变,并且该变异应该在外部可见。
并且,如果以上内容不够清楚,我将在这里明确声明-Random
是引用类型。
埃里克·利珀特(Eric Lippert)的奖金阅读:The Truth About Value Types,您可能还没有准备好,但确实有助于消除一些您可能会逐渐习惯的误解。