C#替代VB代码

时间:2016-07-22 08:05:58

标签: c# vb.net winforms

我有这个VB代码

 Public Function InitMeridDataType() As MeridDataType
        Dim OutData As MeridDataType
        With OutData
            .NumCurves = 0
            Erase .CurveData
        End With
        Return OutData
    End Function

我使用Telerik Online Tool

将此代码转换为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;
            }

任何线索?

3 个答案:

答案 0 :(得分:3)

  

我觉得C#代码存在严重问题。

我同意。 MeridDataType被定义为值类型,因此尝试通过副本OutData修改_with1将不会产生预期效果:将返回未修改的OutData

如果你需要做的就是在数据对象上设置一些属性,这就像在C#中获得的那样简单:

public static MeridDataType InitMeridDataType()
{
   return new MeridDataType()  // the parentheses are actually optional
   {
       NumCurves = 0,
       CurveData = null
   };
}

(顺便说一句:明确地将NumCurvesCurveData设置为&#34;空值&#34;实际上并不是必需的。这已经通过默认构造函数隐式完成,默认构造函数初始化基础记忆到&#34;全部为零&#34;,所以重置这些属性没有额外的效果!不过,这个可能是个好主意,因为它明确了你的值应该被初始化为什么。)< / p>

P.S。: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的情况。在通用方法中。

  • 对于参考类型(例如interfacedefault(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是同一个对象,所以它确实与你返回的对象不匹配。