国内大多数大学的软件相关专业大多强制学生学习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. spark运行方式及其常用参数

    yarn cluster模式 例行任务一般会采用这种方式运行 指定固定的executor数 作业常用的参数都在其中指定了,后面的运行脚本会省略 spark-submit \ --master yarn ...

  2. 编程方式取得Spring上下文的Properties

    在spring初始化时,可以使用Properties配置器把properties文件装载到Spring的上下文中. ... xmlns:context="http://www.springf ...

  3. 洛谷 - P1403 - 约数研究 - 数论

    https://www.luogu.org/problemnew/show/P1403 可以直接用线性筛约数个数求出来,但实际上n以内i的倍数的个数为n/i的下整,要求的其实是 $$\sum\limi ...

  4. 洛谷 - P2602 - 数字计数 - 数位dp

    https://www.luogu.org/problemnew/show/P2602 第二道数位dp,因为“数位dp都是模板题”(误),所以是从第一道的基础上面改的. 核心思想就是分类讨论,分不同情 ...

  5. Codeforces gym 101061 G【递推公式+逆元】

    题意: 就是n复制m次,然后数mod1e9+7; 思路: 案例:31*10^6 + 31*10^4 + 31*10^2 + 31*10^0 所以就是一个等比数列,然后整理一下就是n*(10^(m*le ...

  6. bzoj 2946: [Poi2000]公共串【SAM】

    对第一个串建SAM,把剩下的串在上面跑,每次跑一个串的时候在SAM的端点上记录匹配到这的最大长度,然后对这些串跑的结果取min,然后从这些节点的min中取max就是答案 注意在一个点更新后它的祖先也会 ...

  7. 报错org.springframework.dao.DataIntegrityViolationException

    最简单的原因可能是数据库外键字段选择了不能为空, 改为允许为空就行了.

  8. 天天坐在电脑面前,小心抑郁!来自一个人的旅行<自导自演>

    画图画累了?写代码写累了?何不放松一下呢. 一望无际.亲近自然.忘乎所以.放空自我! 一个人的旅行, GoPro拍摄,后期采用FCPX.记录梦想, 自导自演.一个人去了很多地方, 认识和很多当地人,交 ...

  9. 强连通分量再探 By cellur925

    我真的好喜欢图论啊. (虽然可能理解的并不深hhh) 上一次(暑假)我们初探了强联通分量,这一次我们再探.(特别感谢pku-lyc老师的课件.有很多引用) 上次我们忘记讨论复杂度了.tarjan老爷爷 ...

  10. hdu 3367 Pseudoforest 最大生成树★

    #include <cstdio> #include <cstring> #include <vector> #include <algorithm> ...