【问题标题】:Make custom class instances reinstantiate on operator = is it possible?使自定义类实例在 operator = 上重新实例化是否可能?
【发布时间】:2023-03-22 07:55:01
【问题描述】:

我有这样的代码:

public static IEnumerable<IntEx> FibbonacciNumbersStr()
{
    IntEx j = 0;
    IntEx i = 1;
    for (Int64 k = 0; k < Int64.MaxValue; k++)
    {
        yield return j;
        IntEx oldi = i;
        i = i+j;
        j = oldi;
    }
}

IntEx 是一个自定义的“int”类,能够计算巨大的数字并将它们写成任何给定数字基数的字符串,这里的问题是,当我说 IntEx oldi = i 时,oldi 将成为 i 的指针并结束没有达到它的目的,(从而使斐波那契序列完全错误。但是,如果我这样做了

public static IEnumerable<IntEx> FibbonacciNumbersStr()
{
    IntEx j = 0;
    IntEx i = 1;
    for (Int64 k = 0; k < Int64.MaxValue; k++)
    {
        yield return j;
        IntEx oldi = new IntEx(i);
        i = i+j;
        j = oldi;
    }
}

效果很好。

有什么方法可以让我使用简单的 = 运算符重新实例化而不是指向第二个结果,从而更好地模仿 Int64 或其他东西的行为? 我的意思是,这里的重点是我可能最终想要分发此代码以供其他人使用,并且在使用 IntEx 类时他们可能最终会遇到“指向而不是成为新值”的问题 -_-

有什么想法吗?

【问题讨论】:

  • 人们不得不想知道IntEx 的存在是为了什么 - 如果您正在寻找一个任意大的整数值,那么从 .NET 4 开始,BCL 中就已经存在一个:msdn.microsoft.com/en-us/library/…
  • 我不确定,但主要用于自定义基础转换,例如四元基础“ASDF”,A 为 0,S 为 1,D 为 2,F 为 3,并且能够转换为任何自定义基础以及提高我个人对数字基础和转换的了解,我这样做主要是为了好玩。

标签: c# instantiation assignment-operator


【解决方案1】:

无法覆盖 C# 中的 = 行为。如果IntExclass 类型,那么赋值将始终导致LHS 引用与RHS 相同的值。

这可以通过在方程中插入struct 来解决。在struct 分配中,字段在LHSRHS 之间按成员复制。它仍然无法自定义,但确实确保了一些值的分离

【讨论】:

  • 我已经把那个类变成了一个结构体,不得不做一些修改,但是工作起来就像一个魅力,ty。
【解决方案2】:

你总是可以创建一个静态方法来设置一个值。

因此,这个解决方案会起作用。

IntEx.SetValue(i);

或者让 IntEx 产生实例,而不是通过创建新的,而是为它创建一个静态方法。

IntEx.CreateInstance(i);

【讨论】:

    猜你喜欢
    • 2020-01-25
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多