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

本文关键字:默认值 结构 访问 为什么 | 更新日期: 2023-09-27 17:56:38

我有这个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 在线转换器转换为 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 函数返回值 = default(FrontEndStructures.ToricDataType);

为什么

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

我期待对此进行详细解释,并想知道使用运算符是否可以帮助我实现相同的目的?

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

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

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

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