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、MAUI | JavaFX、Swing |
开源情况 | .NET Core(.NET 5+)开源,但部分功能依赖微软生态 | 完全开源(OpenJDK) |
- 如果目标是跨平台企业级应用或 Android 开发,Java 更适合。
- 如果开发 Windows 桌面软件、游戏(Unity)、Web API,C# 更适合。
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规范只能舍弃,做兼容了,苦啊!!!