C#中等同于VB6中的'Type'的语法构造

4
我尝试将一份相当庞大的VB6源代码移植到C#。这绝非易事,特别是对于我这样对C#.NET还比较新手的人来说。该源代码使用了许多Windows API和各种类型(Type)。我知道在C#中没有VB6 Type的等效物,但我相信有一种方法可以实现相同的结果。我会在下面附上一些代码以进一步解释我的请求。
VB6:
Private Type ICONDIRENTRY
bWidth          As Byte
bHeight         As Byte
bColorCount     As Byte
bReserved       As Byte
wPlanes         As Integer
wBitCount       As Integer
dwBytesInRes    As Long
dwImageOffset   As Long
End Type

Dim tICONDIRENTRY()     As ICONDIRENTRY

ReDim tICONDIRENTRY(tICONDIR.idCount - 1)

For i = 0 To tICONDIR.idCount - 1
    Call ReadFile(lFile, tICONDIRENTRY(i), Len(tICONDIRENTRY(i)), lRet, ByVal 0&)
Next i

我已经尝试使用结构体和类,但目前为止没有成功。
我想看到这个Type结构的转换,但如果有人知道如何转换整个结构,那将非常有帮助。我已经在这个小项目上花费了无数个小时。
如果有区别的话,这仅用于教育目的。
提前感谢您的任何帮助, Evan

当你说“没有运气”时,你是指什么? - rerun
在VB6中,当我键入“Dim tICONDIRENTRY() As ICONDIRENTRY”时,我可以键入“tICONDIRENTRY.”,然后它的变量列表将出现。但是当我在C#中这样做时,什么也没有出现,好像它甚至没有与结构体连接起来。 - user725913
1
你的代码是怎么了... :S 为什么都是大写字母?在C#中,你会创建一个类并实例化它。MyClass myClass = new MyClass(); myClass.MyProperty = "stuff"; - Phill
1
虽然您更喜欢将VB6移植到C#,但由于代码库较大,我建议将其移植到VB.NET。我是根据我们自己的类似经验告诉您的。与重写为C#相比,它需要最少的努力。当然,由于时间限制和非常庞大的代码库,我们不得不坚持使用旧技术,例如ADO而不是ADO.NET :) 只需在VS.net中打开vbp并按照迁移步骤进行操作,并修复未自动完成的问题即可。 - Mubashir Khan
4个回答

11

struct是等价的,你可以这样表示:

struct IconDirEntry {
    public byte Width;
    public byte Height;
    public byte ColorCount;
    public byte Reserved;
    public int Planes;
    public int BitCount;
    public long BytesInRes;
    public long ImageOffset;
}

你可以这样声明一个变量:

IconDirEntry entry;

通常在C#中,不使用类型前缀,也不使用全大写字母,除非是常量。在C#中,struct是值类型,这意味着它们总是按值传递。看起来你正在将它们传递给一个填充它们的方法。如果你想要这种用法,你必须使用类。


7
在VB6中的整数是在C#中的short,而在VB6中的长整型是在C#中的整数。你的结构体不太正确。 - Chris Dunaway
非常感谢。我真的是一个初学者。抱歉。 - user725913

1

我不确定你的问题是什么,但这是一个使用结构体的小例子。

struct aStrt
{
    public int A;
    public int B;
}

static void Main(string[] args)
{
    aStrt saStrt;
    saStrt.A = 5;
}

我没有将结构体内部的项目设为公共的。有点尴尬... - user725913

0

您的问题不够清晰...

当您使用结构体或类并定义这些字段成员时,您遇到了什么问题?您无法使用为该类创建的实例访问这些成员吗?

否则,请将类声明为静态,并使类中的所有成员也都是静态的,这样您就可以在不创建任何实例的情况下访问它们!


0

也许你正在尝试获取类似这样的内容?

struct IconDirEntry 
{
  public byte Width;
  // etc...
}

IconDirEntry[] tICONDIRENTRY = new IconDireEntry[tICONDIR.idCount - 1];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接