访问结构时为什么需要默认值?

时间:2016-07-13 06:45:43

标签: c# vb.net winforms

我有这个VB方法,我转换为C#

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

使用Telerik Online Converter转换为C#我得到了这个

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 定义为

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

我想知道这条线的意义是什么

  

FrontEndStructures.ToricDataType functionReturnValue =   默认(FrontEndStructures.ToricDataType);

为什么在线工具使用默认关键字以及为什么关键字无法使用? 由于类是结构类型而结构是值类型,因此分配的内存(堆栈或堆)以及数据成员的初始化方式在哪里?

我期待对此进行详细解释,并希望知道使用 运算符会帮助我达到同样的目的吗?

1 个答案:

答案 0 :(得分:2)

C#null与VB Nothing不完全相同。在VB中,Nothing表示类型的默认值。对于作为空引用的引用类型,以及对于其所有字段都设置为默认值的值的值类型。在C#中,null表示引用类型的空引用,但不能用于初始化值类型。 default运算符完成了为值类型提供默认值的等效工作。

另请注意,与VB不同,C#函数没有默认返回值。在VB中,您可以分配以函数命名的隐式局部变量,如果未命中显式Return语句,则返回该值。在C#中,您必须显式返回一些内容,因此需要额外的局部变量。我真的建议不要在VB中使用隐式返回。显式返回使您的代码更清晰。

编辑:您可以使用new关键字创建新实例并具有相同的效果。您必须使用default的一种情况是,您传递的类型是泛型类型参数,在这种情况下,您通常不会知道它是引用类型还是值类型。