Gibt es irgendeinen Unterschied zwischen
Dim x() As String
und Dim x As String()
? Man beachte die Position der Klammern. Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.
Dim x() As String
und Dim x As String()
? Man beachte die Position der Klammern. Niko Ortner schrieb:
Die Array-Deklaration mit den Klammern beim Variablenname sollte man nicht verwenden.
Niko Ortner schrieb:
Private _Value() As Integer 'Welchen Typ hat das Feld?
string[] x
.Test
ist ein (Typangabe:) Integer-Array.Marcus Gräfe schrieb:
Für mich als VB6-Entwickler ist das völlig klar: Es ist ein Integer-Array.
int x[10];
quasi "10 Variablen vom Typ int". Dort, wo du die Variable hinschreibst, liegen tatsächlich auch die 10 ints.Dim x(10 - 1) As Integer
auch so aus, ist aber äquivalent zu Dim X As Integer() = New Integer(10 - 1) {}
. Da, wo du x hinschreibst, liegen also nicht die 10 Integer, sondern eine Referenz auf einen Speicherbereich, der das eigentliche Array it. Das Konzept, 10 Variablen vom Typ Integer zu deklarieren, ist hier also nicht gegeben. Und um diese Verwirrung zu vermeiden, sollte man die Schreibweise mit den Klammern beim Namen nicht verwenden.Dim x() As String
und Dim x As String()
ist ja wirklich egal. Jeder so wie er/sie das besser lesen kann.ErfinderDesRades schrieb:
man kann allerdings das Array auch gleich dimensionieren
Niko Ortner schrieb:
Denn Properties können Parameter haben
Niko Ortner schrieb:
sollte man die Schreibweise mit den Klammern beim Namen nicht verwenden
dive26 schrieb:
Sorry, aber ist das nicht i-Tüpflerei ?
Function Foo() As Integer
deklarieren.Dim x(10 - 1) As Integer : Console.WriteLine(x.GetType.Name)
gibt Int32[]
aus, also mit Klammern beim Typ.Dim f As Form
eine Instanziierung draus machen, schreibt man Dim f As New Form
oder Dim f = New Form
, also es ein New
vor den Typ zu schreiben, gibt dir eine neue Instanz des Typs. Will man das gleiche bei Dim x() As Integer
machen, wäre das Äquivalent Dim x() As New Integer
. New Integer
wäre in jeder anderen Situation kein Integer-Array, sondern ein einzelner Integer. (Der Compiler erlaubt diese Syntax übrigens explizit nicht. Arrays können nicht mit "New" deklariert werden.
. Wahrscheinlich, weil es zu verwirrend wäre.) Und hier noch was Ungünstiges: Dim x(10 - 1) As Integer
versteckt das New
, was aber ein entscheidendes Schlüsselwort ist.Marcus Gräfe schrieb:
Ich habe auch noch nie eine Eigenschaft mit Parameter gesehen.
Default
deklariert, also wenn du DeineListe(0)
hinschreibst, ist das Äquivalent zu DeineListe.Item(0)
.) Uh - das ist eine gefährliche Schein-Selbstverständlichkeit, auch nur in irgendeinem Detail von vb6 auf vb.net zu schliessen.Marcus Gräfe schrieb:
Das ist mir natürlich bewusst.
Integer()
, und nicht anders.As Integer
- und das ist falsch! x
ist hier ein Integer()
, und kein Integer
- das ist ein Unterschied wie zwischen Praline und Pralinen-Schachtel.Das ist das Problem, dass VB so wenig restriktiv ist, wohl, um .NET Anfängern schmackhaft zu machen.ErfinderDesRades schrieb:
Aber der vb-Compiler versteht das so, und der sitzt letztlich am längeren Hebel.
int a[]
hinter dem Variablennamen, aber der Typ ist nicht int sondern int[]. Warum das so ist k.A., aber es ermöglicht Inlinedeklarationen int a, b[2], c[3];
. Das ist das Problem, dass VB so wenig restriktiv ist, wohl, um .NET Anfängern schmackhaft zu machen.
Da bin ich lieber bei C#.
Ich zähle mich einfach mal nicht dazu , bleibe aber trotzdem bei VB.dive26 schrieb:
Wir VB-ler lieben das "wenig restriktive"
Dim x(3) As Integer
haben wir zweifache Funktionalität:ErfinderDesRades schrieb:
Uh - das ist eine gefährliche Schein-Selbstverständlichkeit
ErfinderDesRades schrieb:
Die vb6-Schreibe ist daher völlig unlogisch:
Shared Array.CreateInstance()
, das ist zwar logisch aber so verquast und umständlich - dass die unlogische Variante immer noch den besser verständlichen Code ergibt.)Siehe:Gonger96 schrieb:
Warum das so ist k.A.,
Niko Ortner schrieb:
Bei C deklarierst du mit int x[10]; quasi "10 Variablen vom Typ int".
Dim x(0 To 9) As Integer
bzw. Dim x = New Integer(0 To 9) {}
. Also 0 bis 9 sind die gültigen Indices. x.UpperBound ist 9 und x.LowerBound ist 0.Dim x(4 To 9) As Integer
meckert der Compiler an: Untere Arraybegrenzung kann nur "0" sein.
Die CLR könnte das krasserweise aber: Dim a As Array = Array.CreateInstance(GetType(Integer), {6}, {4})
. Das ist aber schon nicht mehr trivial verwendbar. Ich hätte mir vorstellen können, um mit Krams zusammenzuarbeiten, bei dem Array-Indices bei 1 anfangen, wäre es praktisch gewesen, aber DirectCast(a, Integer())
löst eine InvalidCastException aus: Das Objekt des Typs "System.Int32[*]" kann nicht in Typ "System.Int32[]" umgewandelt werden.
Man muss umständlich mit a.GetValue und a.SetValue arbeiten und damit ist das eigentlich ziemlich unsinnig.Marcus Gräfe schrieb:
Mir fällt nämlich keine Sprache ein, wo das nicht geht.
int x[10];
wäre eine Größenangabe bei der Deklaration. Ist in C# nicht erlaubt, weil's eben nicht das Gleiche wie in C und C++ bedeutet. unsafe struct Foo { public fixed int x[10]; }
bedeutet dann wirklich das Gleiche wie in C und C++!Helpermethode für String.Concat
Daniel Baumert - - Sonstige ProblemstellungenUnterschied zwischen Integer & string
Freez-Planet - - Sonstige Problemstellungen