不确定通过引用传递是否有效
Unsure if passing by reference is working
为了好玩,我创建了一个名为 GamblersDice 的图书馆。我正在尝试对其进行微优化,但不确定我是否做对了。我想要的是在创建模具时使用对全局 Random 对象的引用。我认为它不起作用的原因是测试 GamblersDie(random, int) 和 GamblersDie(ref random, int) 花费的时间几乎相同10,000,000 次迭代(测试项目在回购中)。如果你不想浏览回购协议,这里是我的构造函数:
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];
}
}
}
就像我说的,这只是为了好玩。我 想要 对其进行微优化,只是因为它可能是可能的。我的另一个问题是关于构造函数链接。乍一看可能会令人困惑,我想知道它是否是某种反模式。
variables/parameters 有什么意义?他们拥有 价值 。它们存储的值的性质是什么?对于值类型 (struct
),它们存储 值本身。
但是对于引用类型(class
),它们存储一个引用;他们不存储位于其他地方的对象本身。
就是这些在C#默认的传值参数中copied进来的。复制 reference 与创建它所引用的对象的副本不同。因此,即使没有 ref
,您也在方法内部和外部处理单个 object。显然,对对象的任何更改都将在外部可见。
您只需要 ref
如果 a) 您要 重新分配 参数并且重新分配应该是外部可见的,或者 b) 您正在改变一个值type 并且 mutation 应该是外部可见的。
而且,如果上面的内容不够清楚,我会在这里明确说明 - Random
是引用类型。
额外阅读:The Truth About Value Types 作者 Eric Lippert,您可能还没有准备好阅读,但确实有助于消除您可能在阅读过程中遇到的一些常见误解。
为了好玩,我创建了一个名为 GamblersDice 的图书馆。我正在尝试对其进行微优化,但不确定我是否做对了。我想要的是在创建模具时使用对全局 Random 对象的引用。我认为它不起作用的原因是测试 GamblersDie(random, int) 和 GamblersDie(ref random, int) 花费的时间几乎相同10,000,000 次迭代(测试项目在回购中)。如果你不想浏览回购协议,这里是我的构造函数:
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];
}
}
}
就像我说的,这只是为了好玩。我 想要 对其进行微优化,只是因为它可能是可能的。我的另一个问题是关于构造函数链接。乍一看可能会令人困惑,我想知道它是否是某种反模式。
variables/parameters 有什么意义?他们拥有 价值 。它们存储的值的性质是什么?对于值类型 (struct
),它们存储 值本身。
但是对于引用类型(class
),它们存储一个引用;他们不存储位于其他地方的对象本身。
就是这些在C#默认的传值参数中copied进来的。复制 reference 与创建它所引用的对象的副本不同。因此,即使没有 ref
,您也在方法内部和外部处理单个 object。显然,对对象的任何更改都将在外部可见。
您只需要 ref
如果 a) 您要 重新分配 参数并且重新分配应该是外部可见的,或者 b) 您正在改变一个值type 并且 mutation 应该是外部可见的。
而且,如果上面的内容不够清楚,我会在这里明确说明 - Random
是引用类型。
额外阅读:The Truth About Value Types 作者 Eric Lippert,您可能还没有准备好阅读,但确实有助于消除您可能在阅读过程中遇到的一些常见误解。