net代码转java_【持续更新】把.net代码转换为java代码的注意事项

这篇博客主要介绍了如何将.NET代码(包括VB和C#)转换为Java代码,特别提到了枚举类型、异常处理、标识符类型推断以及异步操作的转换问题。作者分享了一些转换技巧,并指出在Java中处理非运行时异常需要使用Throws声明,而异步操作的转换可能较为复杂。文章还提醒读者,对于特定的.NET特性,如不安全模式、动态类型、LINQ等,可能需要在Java中重新实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

国内大多数大学的软件相关专业大多强制学生学习c和Java,但.net 的几个语言可以说是选学的。

由于visual studio在windows平台上使用相对方便,一些同学会在上大学的Java课之前自学.net开发技术。

这一类同学就需要一些代码转换技巧来帮助学习Java。

在这之前我吐槽一下TinyMCE编辑器,它不能正确染色一些vb.net的关键字,比如Async, NameOf, Aggregate 。c#的某些关键字也不能正确染色,如__arglist。

由于我这学期才开始上Java课,代码中出现的错误欢迎大家指正。

1. 枚举类型

VB

Public EnumDirection Right = 1DownRight

DownDownLeft

Left

UpLeftUp

UpRightEnd Enum

C#

public enumDirection {

Down = 1,

DownLeft,

Left,

UpLeft,

Up,

UpRight,

Right,

DownRight

}

转换成Java是这样的。感觉跟c++/cli和c++/cx的enum class差不多。

如果原先的枚举比较长,最好写个小程序转换一下。

public enumDirection {

Down(1),

DownLeft(2),

Left(3),

UpLeft(4),

Up(5),

UpRight(6),

Right(7),

DownRight(8)private int__value; private Direction(intvalue) {this.__value =value;

}

@OverridepublicString toString() {return String.valueOf(this.nCode);

}

}

那个__value是我抄.net参考源码的,如果看不顺眼可以改名。

2.异常

Java的异常如果不是RuntimeException这一类的,就得用Throws 声明,否则像AccessViolationException这一类错误一样只能在UnhandledException(ErrorListener)那里处理。

转换代码的时候写一堆Throws比较麻烦,写了一层就忘了下面那一层有什么异常了。

这个比较好办,只要不是致命的异常,那自定义异常就都继承RuntimeException好了。自带的几个需要用Throws的异常用ErrorListener拦截。

class PointOutOfScreenException extendsRuntimeException{publicPointOutOfScreenException(){super("点出屏幕了...");

}

}

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) AsTask forestTiles= Await SpriteSheet.LoadAsync(device, $"SpriteSheets/ForestTiles{NameOf(ImageID)}.png", New Vector2(64, 64), Vector2.Zero)

wizardWalk= Await SpriteSheet.LoadAsync(device, "SpriteSheets/WizardWalkRight.png", New Vector2(128, 192), New Vector2(64, 150))

wizardIdle= Await SpriteSheet.LoadAsync(device, "SpriteSheets/WizardIdleRight.png", New Vector2(128, 192), New Vector2(64, 150))End Function

C#

asyncTask LoadImages(CanvasDevice device)

{

forestTiles= await SpriteSheet.LoadAsync(device, $"SpriteSheets/ForestTiles{nameof(ImageID)}.png", new Vector2(64, 64), Vector2.Zero);

wizardWalk= await SpriteSheet.LoadAsync(device, "SpriteSheets/WizardWalkRight.png", new Vector2(128, 192), new Vector2(64, 150));

wizardIdle= await SpriteSheet.LoadAsync(device, "SpriteSheets/WizardIdleRight.png", new Vector2(128, 192), new Vector2(64, 150));

}

VB

Public Function CalculateClipGeometry(resource As ICanvasResourceCreator, SourcePoint As Vector2, Geometies As CanvasGeometry(), ScreenSize As Size) AsCanvasGeometryDim geos = Aggregate geo InGeometies

Let Lines= Aggregate tes Ingeo.Tessellate

From lnIn {New LineSegment(tes.Vertex1, tes.Vertex2), New LineSegment(tes.Vertex1, tes.Vertex3), NewLineSegment(tes.Vertex3, tes.Vertex2)}Selectln Distinct Into ToArraySelect Rays = Aggregate tes Ingeo.Tessellate

From lightIn {New LineSegment(SourcePoint, tes.Vertex1), New LineSegment(SourcePoint, tes.Vertex2), NewLineSegment(SourcePoint, tes.Vertex3)}

WhereNot (Aggregate l InLines Where light.RayToBoundary(ScreenSize).HasIntersection(l) Into Any)Selectlight

Into ToArray

Where Rays.Length>= 2 AndAlso Rays(0).Name Like "Ln*"Let Fir=Rays.FirstSelect Arr = Aggregate ln InRays Order By ln.Angle(Fir) Into ToArraySelectCanvasGeometry.CreatePolygon(resource, {Arr.First.Point2, Arr.First.RayToBoundary(ScreenSize).Point2, Arr.Last.RayToBoundary(ScreenSize).Point2, Arr.Last.Point2})

Into ToArrayReturngeos.UnionEnd Function

C#

public unsafe voidAddThree(__arglist)

{var args = newArgIterator(__arglist);var a = (byte*)TypedReference.ToObject(args.GetNextArg());*a+=3;

}

Java

//TODO: 自己重新写吧。直接转换这种代码反而浪费时间!

我还要上课呢,这次就写到这里吧。喜欢Java的可以找出描述不合理的地方,但是请勿喷。

原文:http://www.cnblogs.com/Nukepayload2/p/dotnet_java_conv.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值