2010-02-22 3 views
11

Gibt es eine Möglichkeit, dies wie in den C-Style Sprachen in VB.NET auszuführen:Multiassignment in VB wie in C-Style Sprachen

struct Thickness 
{ 
    double _Left; 
    double _Right; 
    double _Top; 
    double _Bottom; 

    public Thickness(double uniformLength) 
    { 
     this._Left = this._Right = this._Top = this._Bottom = uniformLength; 
    } 
} 
+1

Gibt es einen Vorteil der Mehrfachbelegung im Vergleich zur einzelnen Zuweisung? Viele Übersetzeranwendungen optimieren die beiden zur Laufzeit gleich. –

+0

Ja, es gibt einen Vorteil. Wenn Sie einen bestimmten Wert zuweisen möchten, sagen wir 1.7834 zu H (I) und W (J), müssen Sie 1.7834 nur einmal eingeben und es effektiv als 1-Zeit-Konstante behandeln, während Sie zweimal tippen, ist es nicht offensichtlich, dass die zwei Konstanten, obwohl gleich, sind die gleiche Konstante. Wenn beispielsweise H & W die Höhe und die Breite sind, könnte es ein Zufall sein, dass die Höhe und die Breite gleich sind oder dass sie immer ein Quadrat darstellen. – Chelmite

Antwort

14

Erweiterung auf Marks richtige Antwort

Diese Art der Zuweisung Stil ist in VB.Net nicht möglich. Die C# -Version des Codes funktioniert, weil in C# -Zuordnung ein Ausdruck steht, der einen Wert erzeugt. Deshalb kann es auf diese Weise verkettet werden.

In VB.Net Zuordnung ist eine Anweisung und kein Ausdruck. Es erzeugt keinen Wert und kann nicht geändert werden. Wenn Sie den Code "a = b" als Ausdruck schreiben, wird er als Wertvergleich und nicht als Zuweisung behandelt.

letzten Blog-Post Eric zu diesem Thema für C#

Bei einer Sprachebene Zuordnung ist eine Aussage und kein Ausdruck.

+0

Große gut erklärte Antwort. – Shimmy

+0

Für Informationen, ist es eine Wunschliste Artikel, um Unterstützung dafür hinzuzufügen: http://blogs.msdn.com/lucian/archive/2010/02/12/req7-have-separate-syntax-for-assignment-and-comparison .aspx –

8

Sobald ich diesen Beitrag, wird jemand ein Beispiel nennen wie es geht. Aber Ich glaube nicht, dass es möglich ist. VB.NET behandelt die einzelnen equals im r-Wert als Vergleich. Zum Beispiel:

Dim i As Integer 
    Dim j As Integer 
    i = 5 
    j = i = 4 
    Debug.Print(j.ToString()) 
    j = i = 5 
    Debug.Print(j.ToString()) 

Der obige Code druckt 0 (falsch) und -1 (true).

+1

Es ist nicht möglich. Hier bloggt Lucian, der die VB.Net-Spezifikation leitet, darüber, ob es sich lohnt hinzuzufügen. http://blogs.msdn.com/lucian/archive/2010/02/12/req7-have-separate-syntax-for-assignment-and-comparison.aspx Für Bonusmarken hier ist Eric Lippert (arbeitet an C# Compiler) Bloggen darüber, wie verwirrend es in C# ist. http://blogs.msdn.com/ericlippert/archive/2010/02/11/chaining-simple-assignments-is-not-so-simple.aspx – MarkJ