1.C#项目Java化注意事项
1.工具:C#to Java Converter
(1)不能转框架相关代码,比如C#使用SqlSugar框架所带的DAL层Lambda
(2)不会转换命名方式,比如C#代码基本首字母大写的驼峰命名,Java基本是首字母小写的驼峰命名
(3)单文件翻译,不会主动生成注解,不会主动生成Java框架;总之,只是翻译代码,所得结果可以复制粘贴减少部分工作量,具体得架构设计及框架引入得工作少不了。
2.比较符
C#比较操作可参考https://www.cnblogs.com/Aaxuan/p/9520883.html
Java有三种方式:==比较引用,equals比较值,compareTo比较对象
一般我们的代码比较的都是值的大小,不论值类型和引用类型C#基本使用==来比较。Java需改正过来,引用类型需使用equals,对象的比较要使用compareTo(比如Date对象比较)。
3.实体
C#不需要单独定义get和set,C#的属性定义本身就实现setter和getter。
Java需要在定义变量之后,定义get和set方法。
mybatis框架不允许变量带_,如果表的字段设计上有_需使用注解来映射。举个例子:

1 /** 2 * @Desc 实体类 3 * @Author generator 4 * @Date <2019年02月15日> 5 * @version 1.0 6 */ 7 @TableName("agent_goods") 8 public class TaAgentGoods extends BaseEntity{ 9 private static final long serialVersionUID = 1L; 10 11 /** 主键 */ 12 @TableId(type=IdType.AUTO) 13 private Integer id; 14 /** 运单号 */ 15 @TableField("OrderNo") 16 private String orderNo; 17 /** 代理单号 */ 18 @TableField("AgentOrderNo") 19 private String agentOrderNo; 20 /** 派送人 */ 21 @TableField("Col_008") 22 private String col008; 23 /** 派送人ID */ 24 @TableField("Col_009") 25 private String col009; 26 /** 取派类型 */ 27 @TableField("ActionType") 28 private Integer actionType; 29 30 public void setId(Integer id) { 31 this.id = id; 32 } 33 public Integer getId() { 34 return this.id; 35 } 36 public void setOrderNo(String orderNo) { 37 this.orderNo = orderNo; 38 } 39 public String getOrderNo() { 40 return this.orderNo; 41 } 42 public void setAgentOrderNo(String agentOrderNo) { 43 this.agentOrderNo = agentOrderNo; 44 } 45 public String getAgentOrderNo() { 46 return this.agentOrderNo; 47 } 48 public void setCol008(String col008) { 49 this.col008 = col008; 50 } 51 public String getCol008() { 52 return this.col008; 53 } 54 public void setCol009(String col009) { 55 this.col009 = col009; 56 } 57 public String getCol009() { 58 return this.col009; 59 } 60 public void setActionType(Integer actionType) { 61 this.actionType = actionType; 62 } 63 public Integer getActionType() { 64 return this.actionType; 65 } 66 67 @Override 68 public String toString() { 69 return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) 70 .append("id",getId()) 71 .append("orderNo",getOrderNo()) 72 .append("agentOrderNo",getAgentOrderNo()) 73 .append("col008",getCol008()) 74 .append("col009",getCol009()) 75 .append("actionType",getActionType()) 76 .toString(); 77 } 78 }
4.API入参
因为接口入参已经定义好了,并且之前的项目入参定义五花八门,导致Java代码需要额外的代码处理入参。
C#MVC项目,API入参默认不区分大小写,只要字符对应,不论大小写都可以对应。
Java默认严格遵守大小写规则,入参名和定义的方法参数无法一一对应,将无法接收到参数值。
不过都可以使用第三方来调整,C#可以使用Newtonsoft.json特性来规定入参规则,Java也可以使用fastJson的注解@JsonProperty来转换。
注意fastjson的Json.parseObject要按照正规的get/set定义才可以转换,get/set方法命名大小写需要严格。

1 package com.kye.ats.asm.model.Request; 2 3 import com.fasterxml.jackson.annotation.JsonProperty; 4 import com.kye.ats.asm.model.BaseRequest; 5 6 public class VoiceMsgReportNewRequest extends BaseRequest 7 { 8 /** 9 用户的请求ID Sn 唯一ID 10 11 */ 12 @JsonProperty("voiceId") 13 private String voiceId; 14 public final String getVoiceId() 15 { 16 return voiceId; 17 } 18 public final void setVoiceId(String value) 19 { 20 voiceId = value; 21 } 22 /** 23 被叫号码 24 25 */ 26 @JsonProperty("caller") 27 private String caller; 28 public final String getCaller() 29 { 30 return caller; 31 } 32 public final void setCaller(String value) 33 { 34 caller = value; 35 } 36 /** 37 强显号码 38 39 */ 40 @JsonProperty("callee") 41 private String callee; 42 public final String getCallee() 43 { 44 return callee; 45 } 46 public final void setCallee(String value) 47 { 48 callee = value; 49 } 50 /** 51 语音通知业务时用户反馈的按键值 52 53 */ 54 @JsonProperty("dtmf") 55 private String dtmf; 56 public final String getDtmf() 57 { 58 return dtmf; 59 } 60 public final void setDtmf(String value) 61 { 62 dtmf = value; 63 } 64 /** 65 通话时长(秒) 66 67 */ 68 @JsonProperty("holdTime") 69 private int holdTime; 70 public final int getHoldTime() 71 { 72 return holdTime; 73 } 74 public final void setHoldTime(int value) 75 { 76 holdTime = value; 77 } 78 /** 79 接听状态 80 81 */ 82 @JsonProperty("answerStatus") 83 private long answerStatus; 84 public final long getAnswerStatus() 85 { 86 return answerStatus; 87 } 88 public final void setAnswerStatus(long value) 89 { 90 answerStatus = value; 91 } 92 /** 93 通话开始时间 94 95 */ 96 @JsonProperty("startTime") 97 private java.util.Date startTime = new java.util.Date(0); 98 public final java.util.Date getStartTime() 99 { 100 return startTime; 101 } 102 public final void setStartTime(java.util.Date value) 103 { 104 startTime = value; 105 } 106 /** 107 通话结束时间 108 109 */ 110 @JsonProperty("endTime") 111 private java.util.Date endTime = new java.util.Date(0); 112 public final java.util.Date getEndTime() 113 { 114 return endTime; 115 } 116 public final void setEndTime(java.util.Date value) 117 { 118 endTime = value; 119 } 120 /** 121 归属地 122 123 */ 124 @JsonProperty("location") 125 private String location; 126 public final String getLocation() 127 { 128 return location; 129 } 130 public final void setLocation(String value) 131 { 132 location = value; 133 } 134 /** 135 呼叫失败错误码 136 137 */ 138 @JsonProperty("failCode") 139 private String failCode; 140 public final String getFailCode() 141 { 142 return failCode; 143 } 144 public final void setFailCode(String value) 145 { 146 failCode = value; 147 } 148 /** 149 呼叫失败原因 150 151 */ 152 @JsonProperty("failCause") 153 public String failCause; 154 public final String getFailCause() 155 { 156 return failCause; 157 } 158 public final void setFailCause(String value) 159 { 160 failCause = value; 161 } 162 /** 163 呼叫时间 164 165 */ 166 @JsonProperty("callTime") 167 private java.util.Date callTime = new java.util.Date(0); 168 public final java.util.Date getCallTime() 169 { 170 return callTime; 171 } 172 public final void setCallTime(java.util.Date value) 173 { 174 callTime = value; 175 } 176 /** 177 状态返回时间 178 179 */ 180 @JsonProperty("responseTime") 181 private java.util.Date responseTime = new java.util.Date(0); 182 public final java.util.Date getResponseTime() 183 { 184 return responseTime; 185 } 186 public final void setResponseTime(java.util.Date value) 187 { 188 responseTime = value; 189 } 190 }
5.new对象与注解
实体类在两个语言中都是一样的写法,即使用new来实力化对象。
Java目前一般引入注解来实现调用其他包的方法,这样有好处,你会发现同一个类调用其他类不能到处new对象了。
6.枚举
.Net枚举是值类型,Java枚举是类。Java需要实现.Net枚举值操作需要定义更多的方法来实现。
Java代码:
你会发现字段和枚举之间根本没什么关系,如果不是文字描述,谁知道这个字段可以用枚举来描述。

1 /** 是否特殊客户 0:否 1:是 */ 2 @TableField("Col_013") 3 private Integer col013; 4 5 public void setCol013(Integer col013) { 6 this.col013 = col013; 7 } 8 9 public Integer getCol013() { 10 return this.col013; 11 } 12 13 14 /// <summary> 15 /// 是否特殊客户 16 /// </summary> 17 public enum EnumSpecialCompany { 18 /// <summary> 19 /// 否 20 /// </summary> 21 No(0, "否"), 22 /// <summary> 23 /// 是 24 /// </summary> 25 Yes(1, "是"); 26 public int code; 27 public String name; 28 29 EnumSpecialCompany(int code, String name) { 30 this.code = code; 31 this.name = name; 32 } 33 34 public static String getValueByCode(Integer code) { 35 for (EnumSpecialCompany platformFree : EnumSpecialCompany.values()) { 36 if (code.equals(platformFree.getCode())) { 37 return platformFree.getName(); 38 } 39 } 40 return null; 41 } 42 43 public int getCode() { 44 return code; 45 } 46 47 public void setCode(int code) { 48 this.code = code; 49 } 50 51 public String getName() { 52 return name; 53 } 54 55 public void setName(String name) { 56 this.name = name; 57 } 58 }
C#代码:
一般的写法,有明显的关联痕迹。

1 /// <summary> 2 /// 是否特殊客户 3 /// </summary> 4 public enum EnumSpecialCompany 5 { 6 /// <summary> 7 /// 否 8 /// </summary> 9 [Description("")] 10 No = 0, 11 /// <summary> 12 /// 是 13 /// </summary> 14 [Description("是")] 15 Yes = 1, 16 17 } 18 19 /// <summary> 20 ///是否特殊客户 0:否 1:是 21 /// </summary> 22 public EnumSpecialCompany Col_013 { get; set; }
7.DateTime
.Net:2019/4/10 17:21:47
Java:Wed Apr 10 17:26:27 CST 2019
可以使用JSONField来格式化

1 @JSONField(name = "TrackDT",format = "yyyy-MM-dd HH:mm:ss") 2 private Date trackDT;
8.Redis
C#:使用的是StackExchange.Redis
Java:使用的是org.springframework.data.redis.core
需要注意的是Java Redis set方法,入参是Object,所以一定要注意入参的类型,Interger和String保存的Redis是不一样的。

1 public boolean set(String key, Object value) { 2 try { 3 redisTemplate.opsForValue().set(key, value); 4 return true; 5 } catch (Exception e) { 6 e.printStackTrace(); 7 return false; 8 } 9 10 }
9.Json反序列化
.Net的Newtonsoft.json DeserializeObject可以将json字符串转换为实体,并且不论实体是否是多层嵌套实体。
Java中的fastjson Json.parseObject能转换简单的json字符串,但是如果json字符串含多层嵌套,无法转换,要使用另一种方式来处理。

1 private Recordset GetRecordset(Map<String, Object> dic, String url) { 2 String res = OpenApi.request(url, dic); 3 if (StringUtils.isNotBlank(res)) { 4 ObjectMapper mapper = new ObjectMapper(); 5 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false); 6 Response<ResponseResult<RecordSetResponseModel>> responseModel = null; 7 try { 8 responseModel = mapper.readValue(res, new com.fasterxml.jackson.core.type.TypeReference<Response<ResponseResult<RecordSetResponseModel>>>() { 9 }); 10 } catch (IOException e) { 11 e.printStackTrace(); 12 } 13 if (responseModel == null || responseModel.isFail() || responseModel.getData() == null || responseModel.getData().getRows() == null) 14 return null; 15 16 List<RecordSetResponseModel> models = responseModel.getData().getRows(); 17 18 Collections.sort(models, new Comparator<RecordSetResponseModel>() { 19 @Override 20 public int compare(RecordSetResponseModel o1, RecordSetResponseModel o2) { 21 return o2.getCol_006() > o1.getCol_006() ? 1 : -1; 22 } 23 }); 24 25 if(models!=null && models.size()>0) 26 { 27 return RecordSetConverter.ToEntity(models.get(0)); 28 } 29 } 30 return null; 31 }
10.Lamda
C#:
1 | var taskDriver = tasks.Where(t => t.Col_032 == Const.BringDevice_NO).Where(t => t.Col_028 > dtstart).Where(t => t.Col_040 == dtstart).Where(t => t.Sort > 0).FirstOrDefault(); |
Java:

1 TaTask taskDriver = tasks.stream().filter( 2 t -> Const.BringDevice_NO.equals(t.getCol032()) && t.getCol028().after(dtstart) && dtstart.equals(t.getCol040()) && t.getSort() > 0) 3 .findFirst().orElse(null);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix