Delphi中的Type用C#怎么描述!(50分)

  • 主题发起人 主题发起人 dragon_man2002
  • 开始时间 开始时间
D

dragon_man2002

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi:
Type
TmyType =(a,b,c,d);
TUserInfo = packed Record
Code,
LoginName : string[15];
Name : string[20];
end;
以上格式用C#怎么描述?
 
D的记录类型
C的结构体
http://tech.163.com/05/0331/14/1G68FN0P00091589.html
 
通过SiWeiLiuLang提供的资料可以把
TUserInfo = packed Record
Code,
LoginName : string[15];
Name : string[20];
end;
用struct来描述
但TmyType =(a,b,c,d);
这个怎么描述呢?(刚学C#,好多不懂请谅解)
 
顺便问一下,
Tmytype = packed Record
.....
end;

Tmytype = { .....}
有什么不同啊?
 
在线等待
 
一个一个来说,
第一个:
是记录类型的内存如何分配的,如果你把记录类型保存成文件,然后用流再读出的话,记录类型的Size是很重要的,DFW上讨论过几回了,发个文章吧:
//************************************
Packed Record和Record的不同之处!
问题:
type
MyRec=Record
var1:integer;
var2,var3,var4,var5,var6,var7,var8:shortint;
var9:integer;
var10:shortint;
var11:integer;
var12,var13:shortint;
end;

...
ShowMessage(intTostr(SizeOf(MyRec)));
结果显示为18,而按我想象应为16。请高手讲解一下Delphi5.0中变量内存空间分配机制,因为我有一个数组MyArray:Array[1..1000000] of MyRec;需要考虑节省内存问题,
另外不要说我懒不爱看书,我手头所有关于Delphi的书都没有提到这个问题。
回答:
显示的结果应该为28,而不是18!按道理应该是22。用Packed的结果就是22。
拟定义的数组比较大,应该用packed record!
原因如下:
在Windows中内存的分配一次是4个字节的。而Packed按字节进行内存的申请和分配,这样速度要慢一些,因为需要额外的时间来进行指针的定位。因此如果不用Packed的话,Delphi将按一次4个字节的方式申请内存,因此如果一个变量没有4个字节宽的话也要占4个字节!这样就浪费了。按上面的例子来说:
var1:integer;//integer刚好4个字节!
var2-var5占用4个字节,Var6-Var8占用4个字节,浪费了一个字节。
var9:integer//占用4个字节;
var10:占用4个字节;浪费3个字节
var11:占用4个字节;
var12,var13占用4个字节;浪费2个字节
所以,如果不用packed的话,那么一共浪费6个字节!所以原来22个字节的记录需要28个字节的内存空间!
Write By Kingron.
//****************************************************
 
//********************************
第二个:
Type
TmyType =(a,b,c,d);
为枚举类型,给你找了段资料如下,你可以看看。
它可以对应于C#中的枚举类型,也就是Enum,把MSDN中的帮助也给你找了放在下面!
//***************************************************************
Delphi:
枚举类型
枚举类型又是一种自定义有序类型。在枚举类型中,你列出所有该类型可能取的值,而不是指定现有类型的范围。换句话说,枚举类型是个可取值的序列。见下例:
type
Colors = (Red, Yellow, Green, Cyan, Blue, Violet);
Suit = (Club, Diamond, Heart, Spade);
序列中每个值都对应一个序号,序号从0开始计数。使用Ord 函数,即可得到一个枚举类型值的序号。例如,Ord (Diamond) 返回值1。
注意:枚举类型有多种内部表示法。缺省时,Delphi 用8位表示法;如果有多于256个不同的值,则用16位表示法。还有一种32位表示法,需要与C、C++库兼容时会用到。使用$Z 编译指令可改变缺省设置,请求更多位的表示法。
Delphi VCL(可视控件库)在很多地方用了枚举类型。例如,窗体边框类型定义如下:
type
TFormBorderStyle = (bsNone, bsSingle, bsSizeable,
bsDialog, bsSizeToolWin, bsToolWindow);
当属性值是枚举类型时,你可以从Object Inspector显示的下拉列表框中选值
//***************************************************************
C#
枚举类型:
enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常数组成的独特类型。每种枚举类型均有一种基础类型,此基础类型可以是除 char 类型外的任何整型。声明采用下列形式:
[attributes] [modifiers] enum identifier [:base-type] {enumerator-list} [;]
其中:
attributes(可选)
附加的声明性信息。有关属性和属性类的更多信息,请参见 17. 属性。
modifiers(可选)
允许使用的修饰符有 new 和四个访问修饰符。
identifier
enum 名称。
base-type(可选)
指定分配给每个枚举数的存储大小的基础类型。可以是除 char 类型外的整型之一。默认为 int。
enumerator-list
由逗号分隔的枚举数标识符,也可以包括值分配。
备注
枚举元素的默认基础类型为 int。默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增 1。例如:
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
在此枚举中,Sat 为 0,Sun 为 1,Mon 为 2,依此类推。枚举数可以具有重写默认值的初始值设定项。例如:
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
在此枚举中,强制元素序列从 1 而不是 0 开始。
enum E 的默认值为表达式 (E)0 产生的值。
基础类型指定为每个枚举数分配的存储大小。但是,从 enum 类型到整型的转换需要用显式类型转换来完成。例如,下列语句使用从 enum 到 int 的显式转换,将枚举数 Sun 赋给 int 类型的变量:
int x = (int) Days.Sun;
有关枚举类型的更多信息,请参见 14. 枚举。
示例 1
在此例中,声明了一个枚举 Days。两个枚举数被显式转换为 int 并被赋给 int 变量。
// keyword_enum.cs
// enum initialization:
using System;
public class EnumTest
{
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
public static void Main()
{
int x = (int) Days.Sun;
int y = (int) Days.Fri;
Console.WriteLine("Sun = {0}", x);
Console.WriteLine("Fri = {0}", y);
}
}
输出
Sun = 2
Fri = 7
注意:如果从 Sat=1 中移除初始值设定项,结果将是:
Sun = 1
Fri = 6
示例 2
在此例中,base-type 选项用于声明成员为 long 类型的 enum。注意:即使枚举的基础类型为 long,仍必须通过显式转换将枚举成员显式转换为 long 类型。
// keyword_enum2.cs
// Using long enumerators
using System;
public class EnumTest
{
enum Range :long {Max = 2147483648L, Min = 255L};
public static void Main()
{
long x = (long) Range.Max;
long y = (long) Range.Min;
Console.WriteLine("Max = {0}", x);
Console.WriteLine("Min = {0}", y);
}
}
输出
Max = 2147483648
Min = 255
//*****************************************************
 
楼上太细致了
 
接受答案了.
 
后退
顶部