为了账号安全,请及时绑定邮箱和手机立即绑定

不确定按引用传递是否有效

不确定按引用传递是否有效

C#
慕无忌1623718 2021-10-24 19:50:25
我创建了一个名为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,您也在处理方法内部和外部的单个对象。显然,对象的任何更改都将在外部可见。

您只需要refa) 要重新分配参数并且该重新分配应该是外部可见的,或者 b) 您正在改变 Value 类型并且该突变应该是外部可见的。


而且,如果上述内容不够清楚,我将在此处明确说明 -Random是引用类型。


额外阅读:Eric Lippert 的《关于价值类型的真相》,您可能还没有准备好,但确实有助于消除一些您可能会在此过程中遇到的常见误解。


查看完整回答
反对 回复 2021-10-24
  • 1 回答
  • 0 关注
  • 181 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信