【持续更新】把.net代码转换为java代码的注意事项
国内大多数大学的软件相关专业大多强制学生学习c和Java,但.net 的几个语言可以说是选学的。
由于visual studio在windows平台上使用相对方便,一些同学会在上大学的Java课之前自学.net开发技术。
这一类同学就需要一些代码转换技巧来帮助学习Java。
转载请说明作者Nukepayload2
在这之前我吐槽一下TinyMCE编辑器,它不能正确染色一些vb.net的关键字,比如Async, NameOf, Aggregate 。c#的某些关键字也不能正确染色,如__arglist。
由于我这学期才开始上Java课,代码中出现的错误欢迎大家指正。
1. 枚举类型
VB
Public Enum Direction
Right = 1
DownRight
Down
DownLeft
Left
UpLeft
Up
UpRight
End Enum
C#
public enum Direction
{
Down = 1,
DownLeft,
Left,
UpLeft,
Up,
UpRight,
Right,
DownRight
}
转换成Java是这样的。感觉跟c++/cli和c++/cx的enum class差不多。
如果原先的枚举比较长,最好写个小程序转换一下。
public enum Direction {
Down(1),
DownLeft(2),
Left(3),
UpLeft(4),
Up(5),
UpRight(6),
Right(7),
DownRight(8)
private int __value;
private Direction(int value) {
this.__value = value;
}
@Override
public String toString() {
return String.valueOf(this.nCode);
}
}
那个__value是我抄.net参考源码的,如果看不顺眼可以改名。
2.异常
Java的异常如果不是RuntimeException这一类的,就得用Throws 声明,否则像AccessViolationException这一类错误一样只能在UnhandledException(ErrorListener)那里处理。
转换代码的时候写一堆Throws比较麻烦,写了一层就忘了下面那一层有什么异常了。
这个比较好办,只要不是致命的异常,那自定义异常就都继承RuntimeException好了。自带的几个需要用Throws的异常用ErrorListener拦截。
class PointOutOfScreenException extends RuntimeException{
public PointOutOfScreenException(){
super("点出屏幕了...");
}
}
需要注意的是
<1> Java不支持异常筛选器。
<2> Java不支持MSIL中的 try...catch...fault (在VB中为Using, 在C#中为using)
3.标识符类型的推断
VB
Dim a = New StringBuilder
C#
var a = new StringBuilder();
转换成Java就用复制粘贴大法,把类名复制一下然后粘贴到开头
StringBuilder a = new StringBuilder();
4. c#不安全模式, vb和f#各种调运行库的独有运算符, 动态, async, await, linq, 无符号类型,事件,委托,自定义值类型,泛型约束
VB
Async Function LoadImages(device As CanvasDevice) As Task
forestTiles = Await SpriteSheet.LoadAsync(device, $"SpriteSheets/ForestTiles{NameOf(ImageID)}.png", New Vector2(, ), Vector2.Zero)
wizardWalk = Await SpriteSheet.LoadAsync(device, "SpriteSheets/WizardWalkRight.png", New Vector2(, ), New Vector2(, ))
wizardIdle = Await SpriteSheet.LoadAsync(device, "SpriteSheets/WizardIdleRight.png", New Vector2(, ), New Vector2(, ))
End Function
C#
async Task LoadImages(CanvasDevice device)
{
forestTiles = await SpriteSheet.LoadAsync(device, $"SpriteSheets/ForestTiles{nameof(ImageID)}.png", new Vector2(, ), Vector2.Zero);
wizardWalk = await SpriteSheet.LoadAsync(device, "SpriteSheets/WizardWalkRight.png", new Vector2(, ), new Vector2(, ));
wizardIdle = await SpriteSheet.LoadAsync(device, "SpriteSheets/WizardIdleRight.png", new Vector2(, ), new Vector2(, ));
}
VB
Public Function CalculateClipGeometry(resource As ICanvasResourceCreator, SourcePoint As Vector2, Geometies As CanvasGeometry(), ScreenSize As Size) As CanvasGeometry
Dim geos = Aggregate geo In Geometies
Let Lines = Aggregate tes In geo.Tessellate
From ln In {New LineSegment(tes.Vertex1, tes.Vertex2), New LineSegment(tes.Vertex1, tes.Vertex3), New LineSegment(tes.Vertex3, tes.Vertex2)}
Select ln Distinct Into ToArray
Select Rays = Aggregate tes In geo.Tessellate
From light In {New LineSegment(SourcePoint, tes.Vertex1), New LineSegment(SourcePoint, tes.Vertex2), New LineSegment(SourcePoint, tes.Vertex3)}
Where Not (Aggregate l In Lines Where light.RayToBoundary(ScreenSize).HasIntersection(l) Into Any)
Select light
Into ToArray
Where Rays.Length >= AndAlso Rays().Name Like "Ln*"
Let Fir = Rays.First
Select Arr = Aggregate ln In Rays Order By ln.Angle(Fir) Into ToArray
Select CanvasGeometry.CreatePolygon(resource, {Arr.First.Point2, Arr.First.RayToBoundary(ScreenSize).Point2, Arr.Last.RayToBoundary(ScreenSize).Point2, Arr.Last.Point2})
Into ToArray
Return geos.Union
End Function
C#
public unsafe void AddThree(__arglist)
{
var args = new ArgIterator(__arglist);
var a = (byte*)TypedReference.ToObject(args.GetNextArg());
*a+=;
}
Java
// TODO: 自己重新写吧。直接转换这种代码反而浪费时间!
5.事件和委托
遇到这个没有第四条那么极端,因为Java有用于实现接口的匿名类。
VB
Event Slide(sender As Object, e As SlideEventArgs)
C#
delegate void SlideEventHandler(object sender, SlideEventArgs e);
event SlideEventHandler Slide;
Java
interface SlideEventHandler{
void slide(Object sender, SlideEventArgs e);
}
VB 处理事件
Sub xx_Slide(sender As Object, e As SlideEventArgs) Handles xx.Slide
...
End Sub
C# 处理事件
类名()
{
xx.Slide += xx_Slide;
}
void xx_Slide(object sender, SlideEventArgs e)
{
...
}
VB 使用Lambda表达式处理事件
AddHandler xx.Slide, Sub(sender, e) ...
C# 使用Lambda表达式处理事件
xx.Slide += (sender, e) => ... ;
Java 处理事件
xx.setSlideListener(new SlideEventHandler(){
void slide(Object sender, SlideEventArgs e){
...
}
});
我现在还没看JDK 1.8的Lambda表达式能不能用来处理事件和完成委托,所以不提供这方面的Java代码。
6.重要的修饰符
访问级别修饰符
| VB | C# | Java |
| Private | private | private |
| Protected | protected | 不支持 |
| Protected Friend | protected internal | protected |
| Friend | internal | 这是默认值 |
| Public | public | public |
继承和多态相关的修饰符
| VB | C# | Java |
| MustInherit | abstract | abstract |
| MustOverride | abstract | abstract |
| Overridable | virtual | 这是默认值 |
| Overrides | override | @override |
| Overloads | overload | 这是默认值 |
| Shadows | new | 不支持 |
| NotOverridable | sealed | final |
成员类别标识符
| VB | C# | Java |
| Class | class | class |
| Module |
[StandardModule()] static sealed class |
final class (不准确) |
| Event | event | 不支持 |
| Custon Event | event | 不支持 |
| Delegate | delegate | 不支持 |
| Property | 已省略 | 不支持 |
| Dim | 已省略 | 已省略 |
| Interface | interface | interface |
| Function | 已省略 | 已省略 |
| Sub | 已省略 | 已省略 |
7.参数传递相关
下面列出参数传递方式比较
| VB | C# | Java |
| ByVal (这是默认值) | 这是默认值 | 这是默认值 |
| ByRef | ref | 不支持 |
| ParamArray | params | ... |
| 不支持 | __arglist | 不支持 |
| 不支持 | * (直接传指针) | 不支持 |
| <In> | in | 这是默认值 |
| <Out> | out | 不支持 |
8.属性
Java不支持属性,所以必须手动写方法来封装私有字段 :(
VB
Public Property LastUpdateTimestamp As Date
C#
public DateTime LastUpdateTime { get; set;}
Java
private DateTime lastUpdateTime;
public DateTime getLastUpdateTime(){
return lastUpdateTime;
}
public void setLastUpdateTime(DateTime value){
lastUpdateTime = value;
}
这次就写到这里吧。喜欢Java的可以找出描述不合理的地方,但是请勿喷。
【持续更新】把.net代码转换为java代码的注意事项的更多相关文章
- 使用p4c将P4 14代码转换为16代码
参考: [Question] How to make conversion between P4 14 and P4 16? 使用p4c将P4 14代码转换为16代码: $ p4test --p4v ...
- Android学习笔记_32_通过WebView实现JS代码与Java代码互相通信
webview两种实现方法,覆盖onKeyDown()方法 缓存 WebSettings应用注意的几个问题 1.要实现JS代码与Java代码互相通信,需要通过Android的WebView控件,在视图 ...
- C代码调用Java代码
C代码调用Java代码应用场景 复用已经存在的java代码 c语言需要给java一些通知 c代码不方便实现的逻辑(界面) 反射 //1.加载类字节码 Class clazz = Demo.class. ...
- 把调试好的SQL语句转换为JAVA代码小工具
关键点:Pattern实现SQL拆解.ZeroClipboard.js实现复制到剪切板 主要代码: <%@ page language="java" import=" ...
- spring jdbc分离数据库代码和java代码
读取配置文件类 package com.eshore.ismp.contract.sql; import java.io.FileInputStream; import java.io.FileNot ...
- Android NDK开发(五)--C代码回调Java代码【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41862479 在上篇博客里了解了Java层是怎样传递数据到C层代码,并且熟悉了大部 ...
- 【安卓】数据库基于脚本的"增量更新",每次更新时不需改动java代码、!
思路: 1.当然是基于SQLiteOpenHelper.onCreate(第一次安装程序时调用).onUpdate(升级程序时调用) 2.用"脚本"(脚本制作详细方法问度娘)做数据 ...
- Rational Rose正逆向工程(类图转Java代码,Java代码转类图)
一,正向工程 1.设置默认语言为Java,Tools->Options->Notation->default:选择Java. 2.设置环境变量Class ...
- python 内置2to3工具将python2代码转换为python3代码
python2与python3代码不兼容,如果需要python2代码在python3环境下运行,需要将代码进行转换,本文介绍使用python3内置工具2to3.py对代码进行转换 一:2to3.py在 ...
随机推荐
- Opencv与dlib联合进行人脸关键点检测与识别
前言 依赖库:opencv 2.4.9 /dlib 19.0/libfacedetection 本篇不记录如何配置,重点在实现上.使用libfacedetection实现人脸区域检测,联合dlib标记 ...
- Watir: 如何处理简单的网页弹出警告框?
以下是一个很经典的把Watir与AutoIt连接在一起的实例.如果我们对AutoIT了解的更多,处理类似的问题会更加简单.以下实例会判断页面上是否有某“删除”链接,一旦有该链接,就点击,然后点击弹出的 ...
- MYSQL数据库学习----查询
查询语句是MYSQL数据库中用到的最多的语句. 查询语句分为几种 单表查询 集合函数查询 连接查询 子查询 合并查询 正则表达式查询 一:单表查询 SELECT 属性 FROM 表名 [WHERE 查 ...
- VS2008 MFC截取整个屏幕并保存为jpg格式
void CMainFrame::OnSavejpg() { // TODO: 在此添加命令处理程序代码 HWND hwnd = this->GetSafeHwnd(); //得到窗口句柄 HD ...
- windows下patch
经常在网上看到有人发布patch文件来更新他们的开源代码,例如cegui.ogre等都使用这种形式来修bug或者增加一些小功能.但是,我们下载到的patch文件,貌似是linux/unix的diff工 ...
- 腾讯视频API --关闭广告推荐
官方文档:http://v.qq.com/open/doc/tvpapi2.0.pdf 使用: <script src="http://imgcache.qq.com/tencentv ...
- 微信公众号开发及时获取当前用户Openid及注意事项
目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 (四)微信公众号开发之网页授权获取用户基本信息 (五)微信公众号开发之网页中及 ...
- iOS 优雅地隐藏导航栏NavigationBar (Objc)
@interface FSViewController () <UINavigationControllerDelegate> @end @implementation FSViewCon ...
- UvaLive6442(思维、结论)
结论是:按位置排序好以后,对于真正的答案,走法应该是:依次走向第0个等分点,第1个等分点……这样对于这种等分情况,是最优的调度. /* 先假设一个终点位置然后按位站好 这个位置不一定是最优所以要调 调 ...
- 递推DP HDOJ 5459 Jesus Is Here
题目传送门 题意:简单来说就是sn = sn-1 + sn-2递推而来,求其中所有c字符的:∑i<j:sn[i..i+2]=sn[j..j+2]=‘‘cff"(j−i) mod 530 ...