C#中的用户定义类型(UDT)?

时间:2013-12-15 15:20:06

标签: c# vb.net data-structures struct

我知道在VB中你可以定义一个UDT:

Public Type Buffer1
    ProductCode As String
    SerialNumber As String
    Date As Date
End Type

是否可以在C#中创建用户定义的类型?我知道它们用于实现数据结构。我已经研究过,似乎找不到任何东西。

3 个答案:

答案 0 :(得分:1)

Visual Basic中的"User Defined Data Type"在VB.Net中称为Structure,在C#中称为struct

public struct Buffer1
{
    public string ProductCode;
    public string SerialNumber; 
    public DateTime Date; 
}

请注意,与总是使所有字段都公开的VB6 Type不同,所有.NET类型(包括结构)中的字段都默认为private

答案 1 :(得分:1)

C#有classes and structs

public class Buffer1
{
    string ProductCode;
    string SerialNumber;
    DateTime Date;
}

但如果你不懂课程,你必须先读一些关于C#的文章或书籍(例如CLR via C#

答案 2 :(得分:0)

VB6等效于VB6 Type是一个带有公共字段的结构。如果您需要的是VB6类型的等价物,那么您应该忽略那些告诉您不要使用可变结构的人。

有些人认为所有数据类型都应该像类对象一样,并且由于具有暴露字段的结构行为的方式使得类对象不可能是邪恶的。

实际上,有时候VB6 Type的等价物非常有用,并且任何尝试用暴露字段或其他“可变”结构以外的任何东西来实现这些功能会更加麻烦并且产生的性能代码少于使用其自然语义与人们试图实现的类型完全匹配的类型。请注意,struct字段通常应该作为字段而不是属性公开,因为VB6 Type的整个目的是作为数据类型的聚合,而不是受保护状态的封装。

.NET结构类型存在一个问题,即除非您将结构声明为unsafe类型,否则只能在unsafe代码中使用(并且不能在需要的上下文中使用)能够在部分信任环境中运行),结构中的数组不能实现数组的语义,也不能实现VB6类型中的固定长度字符串。 C#将允许一个人使用fixed关键字在结构中声明固定大小的数组,但仅与unsafe一起提及。结构中的任何其他数组声明都将导致结构保存数组引用而不是数组。因此:

struct MyStruct {int n; int[] Arr; }

MyStruct a,b;

a.Arr = new int[4];
a.Arr[0] = 3;
a.n = 1;
b=a; // Copies the value of n, and the array reference in Arr, but not the array contents
b.n = 2;
b.Arr[1] = 2;

完成上述代码后,b拥有自己的变量n副本,因此对b.n的写入不会影响a.n。但是,字段b.Arr包含与a.Arr相同的数组的引用。直接分配给Arr的字段b可能会使其指向与a.Arr不同的数组,但对b.Arr[1]的分配实际上并未写入字段{{1}而是写入由该字段标识的数组对象,该字段是由字段Arr标识的同一对象。

在某些情况下,您可以使用简单的离散变量列表替换VB6中的固定大小的数组。 Icky,但可行。或者,如果与a.Arr数组关联的限制不是问题,则可以使用这些限制。除此之外,没有任何好方法可以在结构中包含数组。