【问题标题】:Why do I need default while accessing a structure?为什么访问结构时需要默认值?
【发布时间】:2016-07-13 06:45:42
【问题描述】:

我有这个我转换成 C# 的 VB 方法

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);

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

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

【问题讨论】:

  • “因为类是结构类型”。不。类是类,结构是结构。如果你想要一个可以指代任何一个的词,请使用“type”。
  • “结构是值类型,所以分配的内存在哪里”。总是为值类型分配的内存在哪里?它是什么值类型并不重要。
  • “如何初始化数据成员”。 default 的全部意义在于它是该类型的默认值。就像 VB 中的Nothing 一样,它相当于用零填充变量的堆栈内存。这意味着 ever 字段也将具有其类型的默认值。

标签: c# vb.net winforms


【解决方案1】:

C# null 与 VB Nothing 不太一样。在 VB 中,Nothing 表示类型的默认值。对于作为空引用的引用类型和作为所有字段设置为默认值的值的值类型。在 C# 中,null 表示引用类型的空引用,但不能用于初始化值类型。 default 运算符执行为值类型提供默认值的等效工作。

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

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

【讨论】:

  • 使用 new 运算符怎么样?
  • 那么内存分配在哪里?
  • 正如我评论你的问题,它是一个值类型,值类型总是存储在同一个地方。你不需要我告诉你那个地方在哪里。
  • @jmcilhinney 我第一次遇到这个问题所以问。我知道 new 运算符在堆上分配内存,而 Structure 是一种值类型,因此它使用堆栈。因此,当将 new 与将创建内存的结构类型一起使用时会造成混淆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多