不确定通过引用传递是否有效



我创建了一个有趣的库,名为GamblersDice。我正在尝试对它进行微观优化,但不确定我做得是否正确。我想要的是在创建模具时使用对全局Random对象的引用。我认为它不起作用的原因是测试GamblersDie(random,int(GamblersDie(ref random,int花费了几乎相同的时间超过10000000次迭代(测试项目在回购中(。如果你不想扫描回购,这里是我的构造函数:

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];
}
}
}

就像我说的,这只是为了好玩。我希望对其进行微观优化,因为这可能是可能的。我的另一个问题是关于构造函数链接。乍一看,这可能令人困惑,我想知道这是否是某种反模式。

变量/参数包含什么?它们持有。它们所存储的价值观的本质是什么?对于值类型(struct(,它们存储值本身

但对于引用类型(class(,它们存储引用;它们不存储对象本身,而是位于其他位置。

正是这些被复制到C#中传递的默认值传递参数中。复制引用与创建引用对象的副本不同。因此,即使没有ref,您也要在方法内外处理一个对象。显然,对象的任何更改都将在外部可见。

如果a(您要重新分配参数,并且该重新分配应该在外部可见,或者b(您正在更改Value类型,并且突变应该在外部可视,则只需要ref


如果以上内容不够清楚,我将在这里明确说明——Random是引用类型。


额外阅读:Eric Lippert的《关于价值类型的真相》,你可能还没有准备好,但它确实有助于消除你一路上可能遇到的一些常见神话。

最新更新