当前位置: 首页 > news >正文

CSharp和Java

最近在做一些c#重构成Java的项目,经过一段时间的痛苦期(作为一个Java的拥趸,刚开始看其他语言确实很痛苦,特别是当你看的项目还不是很规范的时候,当然也可能是技艺不精),算是终结出了一点经验,记录一下:

C# 和 Java 都是广泛使用的面向对象编程语言,它们在语法、特性和应用场景上有许多相似之处

1:相似之处

  • 面向对象编程(OOP)

    • 都支持类、对象、继承、多态、封装、接口等 OOP 概念
  • 语法相似

    • 代码结构、变量声明、循环、异常处理等都很相近
  • 垃圾回收(GC)

    • 都有自动垃圾回收机制,无需手动管理内存
  • 跨平台特性(部分)

    • Java 通过 JVM 实现“Write Once, Run Anywhere”(牛逼的一次编译到处运行)
    • C# 通过 .NET Core(现为 .NET 5+)也实现了跨平台运行

2:主要区别

方面C#Java
运行环境.NET 平台(Windows,.NET Core 支持跨平台)Java 虚拟机(JVM,真正的跨平台)
主要应用桌面、游戏(Unity)、企业应用、Web(ASP.NET)、云计算企业应用、Web(Spring)、大数据、移动端(Android)
语法特性支持属性(get; set;)、委托、事件、LINQ、async/await无属性、委托,异步依赖 Future / CompletableFuture
GUI开发WinForms、WPF、MAUIJavaFX、Swing
开源情况.NET Core(.NET 5+)开源,但部分功能依赖微软生态完全开源(OpenJDK)
  • 如果目标是跨平台企业级应用或 Android 开发Java 更适合。
  • 如果开发 Windows 桌面软件、游戏(Unity)、Web APIC# 更适合。

3:代码比较:

controller层:

    public string GetMDMList()
        {
            return base.ExecuteActionJsonResult("获取肿瘤形态学M代码", () =>
            {
                CommonFilter commonFilter = GetPageData<CommonFilter>(0);
                var list = codeDictService.GetMDMList(commonFilter);
                if (list.Count <= 0)
                {
                    return new WebApi_Result() { code = 1, msg = "未查询到任何数据" };
                }
                int curpage = 0, limit = 300;
                int.TryParse(Request["page"], out curpage);
                int.TryParse(Request["limit"], out limit);
                limit = limit == 0 ? 100 : limit;
                var myskip = curpage > 0 ? limit * (curpage - 1) : 0;
                return new WebApi_Result() { data = list.Skip(myskip).Take(limit), count = list.Count };
                //return codeDictService.FenyeSearch(list, curpage, limit);
            });
        }

service层

  public List<BA_MDM> GetMDMList(CommonFilter commonFilter)
        {
            List<BA_MDM> list = EntityOperate<BA_MDM>.GetEntityListFromCache().OrderBy(u => u.MXH).ToList();
            commonFilter.keyword = commonFilter.keyword?.Replace("/", "");
            if (!string.IsNullOrWhiteSpace(commonFilter.keyword))
                list = (list.Where(f => (f.SRM1 + "").StartsWith(commonFilter.keyword, StringComparison.OrdinalIgnoreCase)
                || (f.MDMM + "").Contains(commonFilter.keyword, StringComparison.OrdinalIgnoreCase)
                || (f.MBZM + "").StartsWith(commonFilter.keyword, StringComparison.OrdinalIgnoreCase)).ToList());
            if (!string.IsNullOrWhiteSpace(commonFilter.PARENTID) && commonFilter.PARENTID != "0")
                list = list.Where(f => (f.MBZM + "").StartsWith(commonFilter.PARENTID, StringComparison.OrdinalIgnoreCase)).ToList();
            if (commonFilter.ZFPB.HasValue)
                list = list.Where(f => f.ZFPB == commonFilter.ZFPB).ToList();
            if (commonFilter.DZPB.HasValue)
            {
                if (commonFilter.DZPB == 0)
                    list = list.Where(f => string.IsNullOrWhiteSpace(f.DZDM) && string.IsNullOrWhiteSpace(f.DZMC)).ToList();
                if (commonFilter.DZPB == 1)
                    list = list.Where(f => !string.IsNullOrWhiteSpace(f.DZDM) && !string.IsNullOrWhiteSpace(f.DZMC)).ToList();
            }
return list;
        }

 支持分页查询的接口,一次查出了所有数据然后去过的过滤等操作,c#确实快呀,任性

重构后的Java

controller层:

@GetMapping("/GetMDMList")
    public AjaxResult getTumorMorphology(TumorMorphologyDto tumorMorphologyDto){
        // 如果关键字存在,替换 "/"
        if (tumorMorphologyDto.getKeyword() != null) {
            tumorMorphologyDto.setKeyword(tumorMorphologyDto.getKeyword().replace("/", ""));
        }
        PageResult<BaMdm> baMdmPageList = iBaMdmService.getMDMList(tumorMorphologyDto);
        List<BaMdm> rows = baMdmPageList.getRows();
        //dzpb
        if(ObjectUtils.isNotEmpty(tumorMorphologyDto.getDZPB())){
            if(tumorMorphologyDto.getDZPB() == 0){//只保留dzmc和dzdm为空的数据
                rows = rows.stream().filter(f -> (f.getDZDM() == null || f.getDZDM().trim().isEmpty()) &&
                                (f.getDZMC() == null || f.getDZMC().trim().isEmpty()))
                        .collect(Collectors.toList());
            }
            if(tumorMorphologyDto.getDZPB() == 1){//只保留dzmc和dzdm不为空的数据
                rows = rows.stream()
                        .filter(f -> (f.getDZDM() != null && !f.getDZDM().trim().isEmpty()) &&
                                (f.getDZMC() != null && !f.getDZMC().trim().isEmpty()))
                        .collect(Collectors.toList());
            }
        }
        //vo
        List<TumorMorphologyVo> baEdmVos = rows.stream().map(baMdm -> {
            TumorMorphologyVo tumorMorphologyVo = new TumorMorphologyVo();
            BeanUtil.copyProperties(baMdm, tumorMorphologyVo, true);
            return tumorMorphologyVo;
        }).collect(Collectors.toList());
        return AjaxResult.success(baEdmVos)
                .put("count", baMdmPageList.getTotal());
    }

service层:

@Override
    public PageResult<BaMdm> getMDMList(TumorMorphologyDto tumorMorphologyDto) {
        LambdaQueryWrapperX<BaMdm> queryWrapperX = new LambdaQueryWrapperX<>();
        //keyword
        if(ObjectUtils.isNotEmpty(tumorMorphologyDto.getKeyword())){
            queryWrapperX.like(BaMdm::getMDMM, tumorMorphologyDto.getKeyword())
                    .or().likeRight(BaMdm::getSRM1, tumorMorphologyDto.getKeyword())
                    .or().likeRight(BaMdm::getMBZM, tumorMorphologyDto.getKeyword());
        }
        //parentId
        if(ObjectUtils.isNotEmpty(tumorMorphologyDto.getPARENTID()) && !"0".equals(tumorMorphologyDto.getPARENTID())){
            queryWrapperX.likeRight(BaMdm::getMBZM, tumorMorphologyDto.getKeyword());
        }
        //zfpd
        if(ObjectUtils.isNotEmpty(tumorMorphologyDto.getZFPB())){
            queryWrapperX.eq(BaMdm::getZFPB, tumorMorphologyDto.getZFPB());
        }
        return baMDmMapper.selectPage(queryWrapperX);
    }

细节自己看吧,由于前端代码和数据库都是和c#共用一套,所有一些Java规范只能舍弃,做兼容了,苦啊!!!

相关文章:

  • 【ThreeJS Basics 06】Camera
  • C++进阶(七)--STL--bitset(位图)的介绍与基本功能模拟实现
  • PyCharm环境配置实战:从搭建到优化的完整指南
  • 观察者模式的C++实现示例
  • Qt:事件
  • 【MySQL】用MySQL二进制包构建docker镜像
  • 基于javaweb的SpringBoot田径运动会管理系统设计和实现(源码+文档+部署讲解)
  • 天津大学02-深度解读DeepSeek:部署、使用、安全【文末附下载链接】
  • leetcode:2965. 找出缺失和重复的数字(python3解法)
  • c盘爆红后,使用diskgenius给C盘无损扩容,操作记录
  • LeetCode Hot100刷题——两数相加(链表)
  • Minix OS的配置 SSH C程序编译
  • git 中 commit 的修改
  • Redis 篇
  • java之http传MultipartFile文件
  • QT day4
  • Kolla-Ansible deploy部署报错 KeyError: \\‘KernelMemory
  • 【Leetcode 每日一题】1328. 破坏回文串
  • 数据结构知识学习小结
  • 常用的分布式ID设计方案
  • 广告推广网站怎么做/网络推广外包公司排名
  • 在线名片制作网站开发/seo优化seo外包
  • 享学课堂 移动互联网开发/昆明seo关键词排名
  • 高大上公司网站/百度官方客户端
  • 义乌小商品市场进货渠道/如何进行关键词优化工作
  • 自己怎样给网站做推广/营销方法有哪几种