关于C#中的结构

其实在介绍Struct之前,我们应对C#关于类(Class)的原理进行初步的研究。但是,从另一个方面,我们也可以先对这个与类有着血缘关系的结构进行探讨以获得对类的进一步的认识。
首先,C#的结构是一个关系重大的语言功能。和类一样,结构也可以包含其他类型。由于结构在内部是值类型的,所以结构有时也被称为类的轻型版本。同时,结构不承担引用对象所带来的开销,除非在对其装箱时例外。
结构也有其重要的限制,所以导致他只能用于非常特殊的场合。 以下就讨论他们的局限性和他的优点。
结构的定义和类的定义基本上是一致的:
[attributes][modifiers] struct <structName> [:interfaces]
{
[struct-body]
}[;]
为了便于理解,我举个实例来展开论述。我们首先定义一个描述具体事物的结构体——"611311班"。
struct STUClass{
public string ClassName;
public object ClassMumber;
public int ClassNumber;
}
到目前为止,这个声明很像一个类。但是,下面你将看到在使用结构方面的许多限制。
客户不必对结构进行实例化(通过new关键字)。这是因为,作为一种值类型,结构一旦被声明,就被分配。
但是正是有了这种用法,所以我们如果不亲自对结构的成员进行显式的初始化(使用new关键字),那么字段就不会被初始化。如下面这段代码,编译将会出错:
STUClass s611311;
Console.WriteLine(s611311.ClassName);
以下的代码将会纠正这个错误。注意,因为s611311.ClassName 是一个值类型,所以初始化模认为 0 ;
STUClass s611311 = new STUClass();
Console.WriteLine(s611311.ClassName);
我所知的结构成员包括构造器、常量、字段、方法、特性、索引器、操作符等类型。但是,在构造器方面,结构有个非常重要的限制:不能位结构创建无参数的构造器。
所以,以下代码不能编译通过:
struct STUClass{
public STUClass();
public string ClassName;
public object ClassMember;
public int ClassNumber;
}
但是,我们可以利用带有参数的构造器原型来定义:
struct STUClass{
public STUClass(string name,object menber,int number)
{
ClassName = name;
ClassMember = menber;
ClassNumber = number;
}
public string ClassName;
public object ClassMember;
public int ClassNumber;
}
如果仔细研究一下定义结构的语法,会注意到其中没有基类的列表。这是由于结构不能基于其他结构或类,而且他们也不能作为其他结构或类的基。如果希望看到更加直观的结论,你最好到.Net 开发环境中分别定义一个具有相同成员的类和结构,然后到编译器产生的MSIL中去比较一下。
从中我们可以得出一下结论:1、结构的定义是封闭的(不能作为基类使用);2、结构隐式地派生自System.ValueType,
而System.ValueType是所有值类型的超类型(终极基类)。3、结构没有默认的构造器。
(欲知使用结构的原则和例程,且看下回分晓...)

时间: 2024-09-17 04:26:17

关于C#中的结构的相关文章

在 SQL Server 2005 中查询表结构及索引

server|索引 在 SQL Server 2005 中查询表结构及索引 -- 1. 表结构信息查询 -- ========================================================================-- 表结构信息查询 -- 邹建 2005.08(引用请保留此信息)-- ========================================================================SELECT     Tab

在SQL Server 2005中查询表结构及索引

server|索引 在 SQL Server 2005 中查询表结构及索引 -- 1. 表结构信息查询 -- ===================================================-- 表结构信息查询-- 邹建 2005.08(引用请保留此信息)-- ====================================================SELECT     TableName=CASE WHEN C.column_id=1 THEN O.name

在C#中如何在函数参数中返回结构数组?

函数|数组 头晕脑涨地研究了一天,就为了实现在函数的参数中返回结构数组. 现供大家分享,节省学习时间. 实例:  /// <summary>  /// 用户信息结构  /// </summary>  public struct TUSER  {   public string LoginName;   public string LoginPass;   public string TrueName;   public string EMail;   public int Leve

C/C++中的结构体

什么是结构体? 简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同. 定义结构体使用struct修饰符,例如: struct test

Visual C++中的结构异常处理

1.引言 在"C++中例外的处理"一文中(见计算机世界网2001年12月20日),我们讨论了C++中的例外(或异常)处理.本文将进一步探讨Visual C++中的结构异常处理. 想象一下,如果在编程过程中你不需要考虑任何错误,你的程序永远不会出错,有足够的内存,你需要的文件永远存在,这将是一件多么愉快的事.这时你的程序不需要太多的if语句转来转去,非常容易写,容易读,也容易理解.如果你认为这样的编程环境是一种梦想,那么你就会喜欢结构异常处理(structu reed exception

ongo 数组删除 pull-Mongo中数组结构的删除

问题描述 Mongo中数组结构的删除 20C 有这样一个Mongo的结构,{_id"" : ""classone""students"" : [ {name"" : ""liming""age"":23 } {name"" : """"jim""age"&qu

关于代码中的结构问题。

问题描述 关于代码中的结构问题. 请问 private final AppointmentBook appointmentBook;这句什么意思呢? 解决方案 这句的意思是声明一个私有的.final类型的变量appointmentBook,此变量只能在声明的类的内部被调用且一旦初始化便不可改变.AppointmentBook 应该是你自定义的类吧 解决方案二: qwe110110110 说的正确的 解决方案三: private AppointmentBook appointmentBook 如果

c-C 语言中返回结构体指针,结果出来了,但是还是出现错误,不知道为什么

问题描述 C 语言中返回结构体指针,结果出来了,但是还是出现错误,不知道为什么 解决方案 p 没有初始化,也就是没有分配空间.典型的指针错误,不初始化,指针指向哪里呢? 解决方案二: array *p = new array(); 解决方案三: array p;test(&p); 解决方案四: 当然,使用指针应该首先初始化一个空地址的,否则,很容易发生指针地址错误其次,看了一下你的程序设计,程序本身是定义了一个array的结构体变量,在主函数中却要申请一个指针变量p(它的类型是结构体),一系列操

OC中的结构体变量和结构体指针变量的区别

问题描述 OC中的结构体变量和结构体指针变量的区别 OC中的结构体变量和结构体指针变量的区别?,请写出相同点和不同点 解决方案 指向结构体变量的指针指向结构体变量的指针引用结构体变量中的成员结构体中的指针变量输出 解决方案二: 一般来说结构变量定义的时候就分配了内存空间;但结构体指针,和其它指针一样,只有4个字节的指针大小,在使用时需要先动态的分配内存.

C中的结构体对齐可以把下一个的类型补到前一个???

问题描述 C中的结构体对齐可以把下一个的类型补到前一个??? 解决方案 结构体对齐说的是编译器的事情,不是你定义一个字段然后自己去凑.千万不要从百度百科这种垃圾网站获得信息. 解决方案二: 同一类型的可以合并,很正常, 从对齐看,对其对齐要求是一样的,不冲突 实际上 char,char ,short 也可以合并成 一个int 当 char 8Bits,short16Bits,int32bits 的时候 只有当下个数据, 不在对齐位置的时候, 才会在两个数据中间插入间隙.