为什么我在访问结构时需要默认值
本文关键字:默认值 结构 访问 为什么 | 更新日期: 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
的一种情况是,当您传递的类型是泛型类型参数时,在这种情况下,您通常不知道它是引用类型还是值类型。