2016-07-13 22 views
2

Ich hatte diese VB-Methode, die ich Warum brauche ich beim Zugriff auf eine Struktur einen Standard?

Public Function GetToricData(ByRef SaveFileName As String) As ToricDataType 
     Dim filenumber As Short 
     Dim InString As String = "" 
     filenumber = FreeFile() 
     If System.IO.File.Exists(SaveFileName) Then 
      With GetToricData 
       FileOpen(filenumber, SaveFileName, OpenMode.Input) 
       Input(filenumber, InString) 
       If IsNumeric(InString) Then 
        .ToricAppDiam = Convert.ToDouble(InString) 
       End If 
       Input(filenumber, InString) 
       If IsNumeric(InString) Then 
        .NumToricOpticZones = Convert.ToInt16(InString) 
       End If 
       FileClose(filenumber) 
      End With 
     Else 
      With GetToricData 
       .NumToricOpticZones = 20 
       .ToricAppDiam = 3 
      End With 
      SaveToricData(SaveFileName, GetToricData) 
     End If 
    End Function 

Beitrag Umwandlung in C# Telerik Online Converter ich diese

public static FrontEndStructures.ToricDataType GetToricData(ref string SaveFileName) 
     { 
      var title = ((AssemblyTitleAttribute)System.Reflection.Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false)[0]).Title; 
      FrontEndStructures.ToricDataType functionReturnValue = default(FrontEndStructures.ToricDataType); 
      //FrontEndStructures.ToricDataType functionReturnValue = new FrontEndStructures.ToricDataType(); 

      int filenumber = 0; 
      string InString = ""; 
      filenumber = FileSystem.FreeFile(); 
      if (System.IO.File.Exists(SaveFileName)) 
      { 
       var _with38 = functionReturnValue; 
       FileSystem.FileOpen(filenumber, SaveFileName, OpenMode.Input); 
       FileSystem.Input(filenumber,ref InString); 
       if (Information.IsNumeric(InString)) 
       { 
        _with38.ToricAppDiam = Convert.ToDouble(InString); 
       } 
       FileSystem.Input(filenumber,ref InString); 
       if (Information.IsNumeric(InString)) 
       { 
        _with38.NumToricOpticZones = Convert.ToInt16(InString); 
       } 
       FileSystem.FileClose(filenumber); 
      } 
      else 
      { 
       var _with39 = functionReturnValue; 
       _with39.NumToricOpticZones = 20; 
       _with39.ToricAppDiam = 3; 
       SaveToricData(ref SaveFileName, ref _with39); 
      } 
      return functionReturnValue; 
     } 

ToricDataType bekam zu C#

umgewandelt als

public struct ToricDataType 
     { 
      public double ToricAppDiam; 
      public short NumToricOpticZones; 
     } 

definiert ist Ich möchte wissen, was die Bedeutung der Linie

ist

FrontEndStructures.ToricDataType FunktionReturnValue = Standard (FrontEndStructures.ToricDataType);

warum hat das Online-Tool Standard Schlüsselwort verwenden und warum neue Stichwort könnte nicht verwendet werden? Da es sich bei der Klasse um einen Strukturtyp und Strukturen um Werttypen handelt, wo ist also der zugewiesene Speicher (Stack oder Heap) und wie werden Datenelemente initialisiert?

ich eine detaillierte Erklärung zu diesem Thema erwarten und wissen will, dass neuenOperator würde mir den gleichen Zweck oder nicht erreichen helfen?

+0

"Da die Klasse ein Strukturtyp ist". Ähm, nein. Eine Klasse ist eine Klasse und eine Struktur ist eine Struktur. Wenn du ein Wort haben willst, das sich auf beides beziehen kann, dann benutze "type". – jmcilhinney

+0

"Strukturen sind Werttypen, also wo ist der Speicher zugeordnet". Wo ist der Speicher IMMER für Werttypen reserviert? Es spielt keine Rolle, um welchen Wert es sich handelt. – jmcilhinney

+0

"wie Datenelemente initialisiert werden". Der ganze Punkt von 'default' ist, dass es der Standardwert für den Typ ist. Genau wie 'Nothing' in VB entspricht dies dem Auffüllen des Stack-Speichers der Variablen mit Nullen. Das bedeutet, dass jedes Feld auch den Standardwert für seinen Typ hat. – jmcilhinney

Antwort

2

Die C# null ist nicht ganz die gleiche wie die VB Nothing. In VB bedeutet Nothing den Standardwert für einen Typ. Bei einem Referenztyp, bei dem es sich um eine Nullreferenz handelt, und bei einem Werttyp, bei dem es sich um einen Wert handelt, dessen Felder alle auf Standardwerte festgelegt sind. In C# bedeutet null eine Nullreferenz für Referenztypen, kann jedoch nicht zum Initialisieren von Werttypen verwendet werden. Der Operator default führt die gleichwertige Aufgabe aus, einen Standardwert für einen Werttyp anzugeben.

Beachten Sie auch, dass C# -Funktionen im Gegensatz zu VB keinen Standard-Rückgabewert haben. In VB können Sie der impliziten lokalen Variablen zuweisen, die nach der Funktion benannt ist, und dieser Wert wird zurückgegeben, wenn keine explizite Anweisung Return getroffen wird. In C# müssen Sie explizit etwas zurückgeben, daher die zusätzliche lokale Variable. Ich würde wirklich vorschlagen, diese implizite Rückkehr in VB sowieso nicht zu verwenden. Explizite Returns machen Ihren Code klarer.

BEARBEITEN: Sie können das Schlüsselwort new verwenden, um eine neue Instanz zu erstellen und denselben Effekt zu erzielen. Das einzige Szenario, in dem Sie default verwenden müssen, ist, wenn es sich bei dem übergebenen Typ um einen generischen Typparameter handelt. In diesem Fall wissen Sie normalerweise nicht, ob es sich um einen Referenztyp oder -typ handelt.

+0

Was ist mit dem neuen Operator? – Apoorv

+0

Siehe meine Bearbeitung oben. – jmcilhinney

+0

Ausgezeichnete Antwort –

Verwandte Themen