| 

.NET C# Java Javascript Exception

6
Guten Morgen,

ich hätte da mal eine Frage bezüglich statische Klassen, die es in VB.NET ja leider nicht gibt. Die einhellige Empfehlung ist, hier ein Modul zu verwenden. Gut. Auch wenn man jahrelang in VB6 und Vorgängern dazu erzogen wurde, Module größtenteils zu vermeiden und ich dahingehend eine leichte Abneitung entwickelt habe :)

Ich habe mal ein wenig "rumgespielt" und andere Möglichkeiten gefunden, die ich gerne mal diskutieren möchte. Zum einen kann ich innerhalb eines Modules (vermutlich) keine MEF-Exporte importieren (ungeprüft, aber ich glaube nicht, dass das geht). Zum anderen missfällt mir an einem Modul schlichtweg, das ich alle öffentlichen Methoden im Modul direkt aufrufen kann, ohne den Namen des Modules voranzustellen.

Module TestModule
Public Sub ModuleSub()
MessageBox.Show("ModuleSub")
End Sub
End Module

'Kann wie folgt aufgerufen werden:'
TestModule.ModuleSub()
ModuleSub()


Spricht eigentlich irgendwas dagegen, dass man sich in solchen Fällen doch eine Klasse mit statischen Methoden baut? Gefällt mir für die meisten Anwendungszwecke besser.

Public NotInheritable Class TestClass2
Private Sub New()
End Sub
Public Shared Sub ClassSub2()
MessageBox.Show("ClassSub2")
End Sub
End Class


Falls jemanden Gründe einfallen sollten, weshalb das eine schlechte Idee ist, bitte her damit.
News:
06.01.2012
Jens Duczmal 2,6k 1 3 9
2 Antworten
2
Wenn du mit VB.Net arbeiten willst wirst du dich wohl oder übel mit Modulen abfinden müssen. (Gewagte These, ich weis, aber ich werd die Gründe dafür aufführen)

  • Module in VB.Net sind das equivalent zu static Klasses in C#

  • NotInheritable Klassen sind das equivalent zu sealed Klassen in C#

  • Wenn man Erweiterungsmethoden schreiben will (Type-Extensions, Linq-Extensions) etc. muss man static Klassen / Module verwenden

Überall dort wo also explizit static Klassen benötigt werden musst du Module verwenden.

In deinem Anwendungsfall im speziellen spricht aber nichts gegen eine Klasse mit Shared/static Funktionen.
06.01.2012
Floyd 14,6k 3 9
1
Von wollen kann hier nicht die Rede sein. Wir MÜSSEN :(
Meines Erachtens nach ist das reine Zeitverschwendung da 95% allen Codes im Internet in C# sind und man keinen Mehrwert durch ständiges hin- und herkonvertieren erhält. Und das sag ich als langjähriger Ex-VB6ler.

Trotzdem Danke für die Aufschlüsselung
Jens Duczmal 06.01.2012
Ich hab nen ähnlichen Werdegang hinter mir. Hab früher viel in VB6 und VBS(ASP) geschrieben. Hab dann den Umstieg auf VB.Net gemacht und nun bin ich überzeugter C#'ler :)
Ich finde C# mittlerweile deutlich schöner als VB.Net und die Toolunterstützung z.B. durch ReSharper ist deutlich umfangreicher.
Floyd 06.01.2012
3
Die "Idee" die dahinter steckt ist, das fast alle aus der Access-Schiene stammen und man der Meinung ist, der Umstieg wäre dann leichter. Sehe ich nicht so, denn die leicht andere Syntax ist sicher nicht das Problem. Das Problem selbst wird viel mehr Vererbung, Interfaces, WPF etc. sein. Wer vor hat, den Code nur zu kopieren, kann auch gleich bei VB6/Access bleiben. Insofern betrachte ich das Untersagen von C# als nicht sinnvoll. Mir persönlich kostet das massiv Zeit. Und lesen können muss man sowieso beides, sonst findet man ja nichts im Inet.
Jens Duczmal 06.01.2012
@Jens dem kann ich nur zustimmen. Es ist jetzt schon öfter vorgekommen, dass ich zu einer Problemstellung im Internet nach einer fertigen Lösung gesucht habe, und dabei nur VB.NET Code finden konnte.
Wenn ich das nicht lesen könnte, hätte ich mir viel mehr Arbeit machen müssen :)
Karill Endusa 06.01.2012
Wobei man sagen muss das C# und VB.Net Code (mal abgesehen von den offensichtlich syntaktischen Unterschieden) schon sehr ähnelt. Zudem lässt sich VB.Net-Code fast schon wie ein englischer Text lesen.

z.B.: "If x=1 then y=2" -> "Wenn x gleich 1 dann setzte y auf 2"

Die Framework-Methoden sind sowieso die selben.
Floyd 06.01.2012
Eben deshalb wäre ich für einen Umstieg auf C#.
Schreib Du doch mal ein komplettes T4 in VB neu, oder andere Klassen mit 100 Zeilen Quellcode. In C# liegen die vor und wären sofort einsetzbar.
Es gibt zwar einen guten Onlinekonverter (der seit 2 Tagen leider down ist), aber mit Events und LINQ hat der große Probleme (ich sag nur Addhandler statt +=). Für Yield gibts jetzt erst einen Ersatz in der Betaphase (wurde auch Zeit)
Jens Duczmal 06.01.2012
0
Dieses Problem kann ich mit einem Beispiel zeigen.
Wenn man sich den kompilierten VB.NET-Code in IL ausgeben lässt, dann kommt da folgendes:

1) Original VB.NET-Code
Public Module CalculatorModule

Public Function Addition(a As Integer, b As Integer) As Integer
Dim result As Integer
result = a + b
Return result
End Function

End Module


2) IL-Code
.class public auto ansi sealed TestAppVB.CalculatorModule
extends [mscorlib]System.Object
{
.custom instance void [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute::.ctor() = (
01 00 00 00
)
.method public static
int32 Addition (
int32 a,
int32 b
) cil managed
{
.locals init (
[0] int32 Addition,
[1] int32 result
)

IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: add.ovf
IL_0004: stloc.1
IL_0005: ldloc.1
IL_0006: stloc.0
IL_0007: br.s IL_0009

IL_0009: ldloc.0
IL_000a: ret
}
}


class public auto ansi sealed
Das heißt soviel wie:
Public NotInheritable Class CalculatorModule
Public Shared Function Addition(ByVal a As Integer, ByVal b As Integer) As Integer
Dim result As Integer = a + b
Dim num As Integer = result
Return num
End Function
End Class


Anders gesagt: die Entwickler haben statische Klassen in VB.NET nicht vorgesehen.
Wer also lieber immer explizit den Namen des Moduls/der Klasse wie bei C# angeben möchte, ist mit einer Klasse besser dran.
Wenn man jedoch Extension-Methode implementieren möchte geht es nicht anders.

Ich benutze bei Modulen in VB.NET aber auch gerne einmal einen zusätlichen Namespace:
Namespace Internal
Friend Module CalculatorModule
Public Function Addition(a As Integer, b As Integer) As Integer
Dim result As Integer
result = a + b
Return result
End Function
End Module
End Namespace
28.01.2013
Marcus.D 86 1 4

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH