国内大多数大学的软件相关专业大多强制学生学习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代码的注意事项的更多相关文章

  1. 使用p4c将P4 14代码转换为16代码

    参考: [Question] How to make conversion between P4 14 and P4 16? 使用p4c将P4 14代码转换为16代码: $ p4test --p4v ...

  2. Android学习笔记_32_通过WebView实现JS代码与Java代码互相通信

    webview两种实现方法,覆盖onKeyDown()方法 缓存 WebSettings应用注意的几个问题 1.要实现JS代码与Java代码互相通信,需要通过Android的WebView控件,在视图 ...

  3. C代码调用Java代码

    C代码调用Java代码应用场景 复用已经存在的java代码 c语言需要给java一些通知 c代码不方便实现的逻辑(界面) 反射 //1.加载类字节码 Class clazz = Demo.class. ...

  4. 把调试好的SQL语句转换为JAVA代码小工具

    关键点:Pattern实现SQL拆解.ZeroClipboard.js实现复制到剪切板 主要代码: <%@ page language="java" import=" ...

  5. spring jdbc分离数据库代码和java代码

    读取配置文件类 package com.eshore.ismp.contract.sql; import java.io.FileInputStream; import java.io.FileNot ...

  6. Android NDK开发(五)--C代码回调Java代码【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41862479 在上篇博客里了解了Java层是怎样传递数据到C层代码,并且熟悉了大部 ...

  7. 【安卓】数据库基于脚本的&quot;增量更新&quot;,每次更新时不需改动java代码、!

    思路: 1.当然是基于SQLiteOpenHelper.onCreate(第一次安装程序时调用).onUpdate(升级程序时调用) 2.用"脚本"(脚本制作详细方法问度娘)做数据 ...

  8. Rational Rose正逆向工程(类图转Java代码,Java代码转类图)

     一,正向工程     1.设置默认语言为Java,Tools->Options->Notation->default:选择Java.         2.设置环境变量Class ...

  9. python 内置2to3工具将python2代码转换为python3代码

    python2与python3代码不兼容,如果需要python2代码在python3环境下运行,需要将代码进行转换,本文介绍使用python3内置工具2to3.py对代码进行转换 一:2to3.py在 ...

随机推荐

  1. HDU6028:Forgiveness(TLE ing,占位)

    Problem Description Little Q is now checking whether string A matches B. Two strings are considered ...

  2. NOIP2007 矩阵取数游戏(区间DP)

    传送门 这道题第一眼看上去可能让人以为是贪心……不过贪心并不行,因为每次的操作是有2的幂次方的权值的.这样的话直接每次贪心最小的就目光短浅.所以那我们自然想到了DP. 据说这是一道很正常的区间DP? ...

  3. Code:NLog

    ylbtech-Code:NLog 1. NLog介绍使用返回顶部 1. NLog是什么 NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码.NLog ...

  4. (二十四)权限控制(粗粒度)-通过filter

    扩展:权限控制(粗粒度)-通过filter 过滤器编写步骤: 1.编写一个类 实现filter接口 重写方法 2.编写配置文件 <filter> <filter-mapping> ...

  5. ubuntu scp命令或者用root连接ssh提示:Permission denied, please try again.错误

    1.su - #!!! 2.vi /etc/ssh/sshd_config 3.PermitRootLogin yes # 找到此字段,改为此行所示 4./etc/init.d/ssh restart ...

  6. leetCode :103. Binary Tree Zigzag Level Order Traversal (swift) 二叉树Z字形层次遍历

    // 103. Binary Tree Zigzag Level Order Traversal // https://leetcode.com/problems/binary-tree-zigzag ...

  7. .NET Core 3.0之深入源码理解Configuration(二)

      文件型配置基本内容 上一篇文章讨论了Configuration的几个核心对象,本文继续讨论Configuration中关于文件型配置的相关内容.相比较而言,文件型配置的使用场景更加广泛,用户自定义 ...

  8. codeforces 611C

    题意: 给你一个矩阵,矩阵里有" . "和" # "," . "表示空的," # "表示禁止的. 多米诺骨牌将占据正好有 ...

  9. ErrorObject OpenAsync(Action<ErrorObject>arg_fnRet)

    ErrorObject OpenAsync(Action<ErrorObject>arg_fnRet) public static ErrorObject Open(this ReadWr ...

  10. loj #6302. 「CodePlus 2018 3 月赛」寻找车位【线段树+单调队列】

    考虑静态怎么做:枚举右边界,然后枚举上边界,对应的下边界一定单调不降,单调栈维护每一列从当前枚举的右边界向左最长空位的长度,这样是O(nm)的 注意到n>=m,所以m<=2000,可以枚举 ...