国内大多数大学的软件相关专业大多强制学生学习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. BDB c++例子,从源码编译到运行

    第一步先下载源码,解压后 ./dist/configure --enable-cxx编译,然后make, make install --enable-cxx To build the Berkeley ...

  2. 分享windows自带计划任务Task schedule使用指南

    下面以“启动运行QQ程序,无限期每186秒一次”为例,演示如何使用计划任务功能. 今天IT外包 www.itwaibaow.com 就为大家分享如何使用win7"计划任务“(Task sch ...

  3. Intel® Media SDK(一)

    A cross-platform API for developing media applications on Windows* Fast video playback, encode, proc ...

  4. codeforces 696B B. Puzzles(树形dp+概率)

    题目链接: B. Puzzles time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  5. SPOJ:String Play (?)

    String Play Milo has a string S of length L. Tutu picks a random prefix and Mota picks a random suff ...

  6. [Selenium] Selenium WebDriver 的下载和安装

    为配合较为广泛使用Java 语言的程序员,仅以WebDriver 的Java语言绑定进行讲解. 步骤1:下载并安装Java开发环境 1)在系统中安装JDK(Java开发工具吧,Java Develop ...

  7. 基于active状态类名的web交互开发

    demo: 默认是这样的: 当我们点击更多按钮后,会以CSS3动画的方式展开剩余所有文字信息,如下动图: 下面我们看下关键的CSS代码,这个.active是如何自身无样式的: .box { max-h ...

  8. Codeforces 快速竞技#4

    快速竞技#4 A–Duff and Meat588A = =这题不知道怎么写题解了.. 直接上code---. #include<bits/stdc++.h> #include<st ...

  9. python __builtins__ reversed类 (58)

    58.'reversed',  返回一个反转的迭代器. class reversed(object) | reversed(sequence) -> reverse iterator over ...

  10. 如何阻止浏览器的默认事件,你是否也遇到过无法阻止Google默认事件的情况( 原生JS )

    如题,话不多话,我们先看怎么解决 根据不同的绑定事件的方法,我们有不同的阻止默认事件的方法 如果你不知到如何绑定事件,请查看我的上一篇文章 关于浏览器滚动的兼容性问题以及事件绑定 1.句柄绑定 只需要 ...