我有这个VB代码
Public Function InitMeridDataType() As MeridDataType
Dim OutData As MeridDataType
With OutData
.NumCurves = 0
Erase .CurveData
End With
Return OutData
End Function
将此代码转换为C#
C#代码是
public static MeridDataType InitMeridDataType()
{
MeridDataType OutData = default(MeridDataType);
var _with1 = OutData;
_with1.NumCurves = 0;
_with1.CurveData = null;
return OutData;
}
MeridDataType 在VB中定义为
Public Structure MeridDataType
Dim NumCurves As Short
Dim CurveData() As CurveDataType
End Structure
我觉得C#代码存在严重问题。不应该返回 _with1 吗?
我写的一个版本是
public static MeridDataType InitMeridDataType()
{
MeridDataType OutData = default(MeridDataType);
//var _with1 = OutData;
OutData .NumCurves = 0;
OutData .CurveData = null;
return OutData;
}
任何线索?
答案 0 :(得分:3)
我觉得C#代码存在严重问题。
我同意。 MeridDataType
被定义为值类型,因此尝试通过副本OutData
修改_with1
将不会产生预期效果:将返回未修改的OutData
。
如果你需要做的就是在数据对象上设置一些属性,这就像在C#中获得的那样简单:
public static MeridDataType InitMeridDataType()
{
return new MeridDataType() // the parentheses are actually optional
{
NumCurves = 0,
CurveData = null
};
}
(顺便说一句:明确地将NumCurves
和CurveData
设置为&#34;空值&#34;实际上并不是必需的。这已经通过默认构造函数隐式完成,默认构造函数初始化基础记忆到&#34;全部为零&#34;,所以重置这些属性没有额外的效果!不过,这个可能是个好主意,因为它明确了你的值应该被初始化为什么。)< / p>
new T()
或default(T)
? TL; DR:使用new T(…)
创建T
个实例,而不是default(T)
...即使是struct
s。
通过T
正确完成某种类型new T()
的新实例。与default(T)
不同,这清楚地说明了你的意图,并且总是做你想做的事情:
仅对于值类型(struct
s),C#&#39; s default(T)
等同于new T()
默认构造函数:两者都给出你是一个值类型的实例,它的底层内存初始化为&#34;全部为零&#34;。但它是创建一个新实例的偷偷摸摸的方式,而不是非常透明。如果您不了解实际类型default(T)
,例如T
,请更好地保留使用class
的情况。在通用方法中。
对于参考类型(例如interface
,default(T)
),null
将返回T
引用,因此随后访问#include <stdio.h>
#include <stdlib.h>
int main(){
int i,n;
float *ptr1, *ptr2;
printf("enter a total number of float items: ");
scanf("%d", &n);
ptr1 = malloc(n*sizeof(float));
ptr2 = calloc(n, sizeof(float));
printf("malloc | calloc\n");
printf("----------------------\n");
for(i=0;i<n;i++)
printf("%-10f %10f\n", *(ptr1+i), *(ptr2+i));
printf("\n");
free(ptr1);
free(ptr2);
return 0;
}
将产生异常。
答案 1 :(得分:0)
参考默认值:https://msdn.microsoft.com/en-us/library/xwth0h0d.aspx。 如果MeridDataType是一个结构,那么你的代码应该可以正常工作。如果它是一个类,那么最好使用默认构造函数进行实例化。
public static MeridDataType InitMeridDataType()
{
MeridDataType OutData = new MeridDataType();
OutData.NumCurves = 0;
OutData.CurveData = null;
return OutData;
}
答案 2 :(得分:-1)
OutData和_with1是同一个对象,所以它确实与你返回的对象不匹配。