如何在我的类中实现前置和后置自增/自减运算符?

2024-02-02

我想要超载++运算符在我的 c# 类中使用运算符重载来使用预增量和后增量。但只有后增量才有效。如何使这两个功能在我的班级中起作用? 假设我做了一个 ABC 类,比如 -

using System;
using System.Collections.Generic;
using System.Text;

namespace Test
{
    class ABC
    {
      public int a,b;
      public ABC(int x, int y)
      {
        a = x;
        b = y;
      }
      public static ABC operator ++(ABC x)
      {
        x.a++;
        x.b++;
        return x;
      }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ABC a = new ABC(5, 6);
            ABC b, c;
            b = a++;
            Console.WriteLine("After post increment values are {0} and {1} and values of b are {2} and {3}", a.a, a.b, b.a, b.b);// expected output a.a = 6, a.b = 7, b.a = 5, b.b = 6 but not get that
            c = ++a;
            Console.WriteLine("After pre increment values are {0} and {1} and values of c are {2} and {3}", a.a, a.b, c.a, c.b); // expected output a.a = 7, a.b = 7, c.a = 7, c.b = 8 works fine
            Console.Read();
        }
    }
}

您的示例无法正确实现此一元运算符,如 C# 规范中所指定17.9.1 一元运算符 :

与 C++ 不同,此方法不需要, 事实上,不应该修改 直接计算其操作数的值。

这是带有一些微观单元测试的示例:

using System;

class ABC
{
  public int a,b;
  public ABC(int x, int y)
  {
    a = x;
    b = y;
  }

  public static ABC operator ++(ABC x)
  {
    x.a++;
    x.b++;
    return x;
  }
}

class Program
{
    static void Main()
    {
        var a = new ABC(5, 6);
        if ((a.a != 5) || (a.b != 6)) Console.WriteLine(".ctor failed");

        var post = a++;
        if ((a.a != 6) || (a.b != 7)) Console.WriteLine("post incrementation failed");
        if ((post.a != 5) || (post.b != 6)) Console.WriteLine("post incrementation result failed");

        var pre = ++a;
        if ((a.a != 7) || (a.b != 8)) Console.WriteLine("pre incrementation failed");
        if ((pre.a != 7) || (pre.b != 8)) Console.WriteLine("pre incrementation result failed");

        Console.Read();
    }
}

您的代码失败是增量后的结果,这是由于您更改了作为参数传递的 ABC 实例而不是返回新实例。更正的代码:

class ABC
{
  public int a,b;
  public ABC(int x, int y)
  {
    a = x;
    b = y;
  }

  public static ABC operator ++(ABC x)
  {
    return new ABC(x.a + 1, x.b + 1);
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在我的类中实现前置和后置自增/自减运算符? 的相关文章

随机推荐

  • 插入(I,[],[I,[],[]])。如何向二叉树插入一个值?

    要将新元素添加到堆中 我们必须 创建一个包含该元素值的节点 在最后一层的第一个空位置尽可能向左打结 如有必要 创建一个新层 我们总是得到一个完整的二叉树 但不一定是一个堆 我写了这段代码 insert I I insert I G D N
  • 当我尝试使用 winrt 发出通知时,出现错误

    我正在尝试让 winRT 发送通知 我尝试这样做来发出通知 import winrt windows ui notifications as notifications import winrt windows data xml dom a
  • 使用 PPSE 而不是 PSE 读取 EMV 卡

    我正在尝试读取非接触式 Visa Paywave 卡上的数据 对于 Paywave 我必须使用 PPSE 2PAY SYS DDF01 而不是 PSE 1PAY SYS DDF01 提交 SELECT EMV 书籍 1 第 11 3 4 节
  • 选择 ..... 其中 .... 或

    有没有一种方法可以选择同一字段上出现多个条件中的任何一个的数据 示例 我通常会写一个声明 例如 select from TABLE where field 1 or field 2 or field 3 有没有办法可以这样说 select
  • 单向 @OnetoMany 映射会删除所有关系并重新添加剩余关系,而不是删除特定关系

    给出以下代码 public class Course Id GeneratedValue private Long id private String name OneToMany cascade CascadeType ALL orpha
  • (a== 1 && a ==2 && a==3) 可以评估为 true 吗?

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 版主注 请抵制编辑代码或删除此通知的冲动 空白模式可能是问题的一部分 因此不应被不必要地篡改 如果您属于 空白无关紧要 阵营
  • move_uploaded_file 在 nginx 下创建无法访问(403禁止)的文件

    我在 php 中创建了一个简单的上传脚本 该脚本获取从表单提交的文件并将其放入所需的目录中 问题是 由于某种原因 当您尝试在浏览器中显示此文件时 服务器会返回 403 Forbidden 消息 事实上 我修改了脚本 因此它首先从 tmp 文
  • 在没有 jQuery mobile 的情况下在移动设备上使用 mousedown 事件?

    我已经构建了一个 Web 应用程序 为了进行一些改进 我想添加 mousedown 和 mouseup 处理程序来交换图像 在本例中 使按钮看起来像是被按下的 我的代码是这样的 window onload function preload
  • 我可以创建一个 Android 应用程序作为模板吗?

    我不确定它的标题是否正确 但我会解释我的意思 我正在制作多个 Android 应用程序 但它们具有相同的结构 滑动菜单 列表视图 关于我 服装对话框 复制 分享 喜欢 对样式进行一些修改 颜色 背景 字体 菜单字符串 我的问题是 有没有办法
  • JSON Jackson 将不同的键解析到同一字段中

    我有一个 POJO 其中有一个字段 public class Media private Asset asset 将 json 响应解析到此资产 POJO 中时 一切正常 但该资产附带的密钥略有不同 它可以是 JsonProperty co
  • 同时进行网页插入

    我们开发了一个在线测验 用户可以注册一个团队来参加测验 在 asp 中会检查该团队名称是否已提交 如果已提交 则会生成错误 我们注意到一个问题 如果两支球队在同一时间以相同的名称注册 则两支球队都注册了 尽管这种情况不太可能发生 但我们想知
  • 如何比较以逗号分隔的两个列值?

    我有一个包含特定列的表 其中有一列包含逗号分隔的值 例如测试 考试 结果 其他 我将传递一个字符串 例如结果 样本 未知 额外作为存储过程的参数 然后我想通过检查该字符串中的每个短语来获取相关记录 例如 TableA ID Name Wor
  • GCM 不致力于姜饼,但致力于冰淇淋三明治

    我正在编写一个使用 GCM 消息的游戏 当一名玩家进入服务器的回合移动时 服务器将向其对手发送一条 GCM 消息 让该客户端知道有额外的回合数据可用 这应该很简单 我已尽可能严格地遵循示例 GCM 客户端代码 我有两台设备用于测试 带冰淇淋
  • 使用 PyCrypto AES 进行 Python 加密

    我今天刚刚发现 pycrypto 并且一直在研究我的 AES 加密课程 不幸的是 它只起到了一半的作用 self h md5 以十六进制格式输出 md5 哈希值 大小为 32 字节 这是输出 它似乎解密了消息 但它在解密后放置了随机字符 在
  • IE11 无法通过 Web 服务器显示带有对象标记的图像,但在本地正常

    问题 通过对象标签将图像设置作为数据查看时 Internet Explorer 11 在通过 Web 服务器查看时不会显示该图像 这是完整的代码 div style width 200px height 100px img src squa
  • 为什么串联的 RequireJS AMD 模块需要加载程序?

    我们在开发过程中喜欢 RequireJS 和 AMD 在这里我们可以编辑模块 在浏览器中点击重新加载 然后立即看到结果 但是 当需要将我们的模块连接到单个文件以进行生产部署时 显然必须有一个 AMD 加载器仍然存在 无论该加载器是 Requ
  • Python:查找字符串中的单词

    我想在字符串中找到这个单词 如下所示 kkk I do not like that car if like in kkk print like elif dislike in kkk print dislike elif hate in k
  • Laravel 忽略变异器

    我正在使用 Laravel 的 Mutator 功能 并且我有以下 Mutator public function setFirstNameAttribute value this gt attributes first name strt
  • systemctl 状态显示 inactive dead

    我正在尝试编写自己的 简单 systemd 服务 该服务执行一些简单的操作 例如使用 shell 脚本将数字 1 到 10 写入文件 我的服务文件如下所示 Unit Description NandaGopal Documentation
  • 如何在我的类中实现前置和后置自增/自减运算符?

    我想要超载 运算符在我的 c 类中使用运算符重载来使用预增量和后增量 但只有后增量才有效 如何使这两个功能在我的班级中起作用 假设我做了一个 ABC 类 比如 using System using System Collections Ge