相关文章连接:
编程之基础:数据类型(一)
- 3.1 引用类型与值类型 41
- 3.1.1 内存分配 42
- 3.1.2 字节序 44
- 3.1.3 装箱与拆箱 45
- 3.2 对象相等判断 46
- 3.3 赋值与复制 50
- 3.3.1 引用类型赋值 50
- 3.3.2 值类型赋值 51
- 3.3.3 传参 52
- 3.3.4 浅复制 55
- 3.3.5 深复制 57
- 3.4 对象的不可改变性 60
- 3.4.1 不可改变性定义 60
- 3.4.2 定义不可改变类型 61
- 3.5 本章回顾 63
- 3.6 本章思考 63
数据类型是编程的基础,每个程序员在使用一种平台开发程序时,首先得知道平台中有哪些数据类型,每种数据类型有哪些特点、又有着怎样的内存分配等。熟练掌握每种类型不仅有利于提高我们的开发效率,还能使我们开发出来的程序更加稳定、健全。.NET中的数据类型共分为两种:引用类型和值类型,它们无论在内存分配还是行为表现上,均有着非常大的差别。
关于对引用类型和值类型的定义,听得最多的是:值类型分配在线程栈中,而引用类型分配在堆中。这个定义并不准确(因为值类型也可以分配在堆中,而引用类型在某种场合也可以分配在栈中),或者说太抽象,它只是从内存分配的角度来区分值类型和引用类型,而对于内存分配,我们开发者是很难直观地去辨别。如果从代码角度来讲,.NET中的值类型是指"派生自System.ValueType的类型",而引用类型则指.NET中排除值类型在外的所有其它类型。下图3-1显示了.NET中的类型布局:
图3-1 类型布局
如上图3-1所示,派生自System.ValueType的类型属于值类型(图中虚线部分,不包括System.ValueType),所有其它类型均为引用类型(包括System.Object、System.ValueType)。在以System.Object为根的庞大"继承树"中圈出一部分(图中虚线框),那么该小部分就属于"值类型"。
注:以上对值类型和引用类型的解释似乎有些难以理解,为什么"根"是引用类型,而某些"枝叶"却是值类型?这是因为.NET内部对派生自System.ValueType的类型做了些"手脚"(这些对我们来讲是不可见的),使其跟其它类型(引用类型)具备不一样的特性。另外,.NET中还有一些引用类型并不继承自System.Object类,比如使用interface关键字定义的接口,它根本不在"继承树"的范围之类,这样看来,像我们平时听见的"所有类型均派生自System.Object类型"的话似乎也不太准确,这些隐藏的不可告人的秘密都是.NET内部做的一些处理,大部分并没有遵守主流规律。
通常值类型又分为两部分:
1)简单值类型:包括类似int、bool、long等.NET内置类型,它们本质上也是一种结构体;
2)复合值类型:使用Struct关键字定义的结构体,如System.Drawing.Point等。复合值类型可以由简单值类型和引用类型组成,下面定义一个复合值类型:
2
3 struct MultipleValType
4 {
5 int a; //NO.1
6 object c; //NO.2
7 }
如上代码Code 3-1所示,MultipleValType类型包含两个成员,一个简单值类型(NO.1处),一个引用类型(NO.2处)。
值类型均默认派生自System.ValueType,又由于.NET不允许多继承,因此我们既不可以在代码中显示定义一个派生自System.ValueType的结构体,同时也不可以让某个结构体继承自其它结构体。
引用类型和值类型各有自己的特性,这具体表现在内存分配、类型赋值(复制)、类型判等几个方面。
本节开头就谈到,引用类型对象与值类型对象在内存中的存储方式不相同,使用new关键字创建的引用类型对象存储在(托管)堆中,而使用new关键字创建的值类型对象则分配在当前线程栈中。
注:堆和栈的具体概念请参见本书后面讲"对象生命期"的第四章。另外,使用类似"int a = 0;"这种方式定义的简单值类型变量,跟使用new关键字"Int32 a = new Int32(0);"效果一样。
下面代码显示创建一个引用类型对象和一个值类型对象:
2
3 class Ref //NO.1
4 {
5 int a;
6 Ref ref;
7 public Ref(int a,Ref ref)
8 {
9 this.a = a;
10 this.ref = ref;
11 }
12 }
13 struct Val1 //NO.2
14 {
15 int a;
16 bool b;
17 public Val1(int a,bool b)
18 {
19 this.a = a;
20 this.b =b;
21 }
22 }
23 struct Val2 //NO.3
关于多选属性如何在OO中表示呢? - 星空物语 阅读原文»
在电子商务系统中 关于产品属性的问题
会设计如下几个表
产品信息 Product
选项信息表 Option 存储 Size Color....
选项值信息表 OptionValue 存储每个选项的值信息 比如 X,XL;red blue 等值信息
选项--选项值信息表 OptionToValue 存储选项和选项值之间的关系【一对多的关系】
产品属性信息表 将产品ID 选项ID 选项值ID 关联起来 ProductAttribute
下面贴出几个表的信息
(
[ProductID] [int] IDENTITY(1,1) NOT NULL,
Name
--当然我简写了
)
(
[OptionID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](64) NOT NULL DEFAULT (''),
[SortOrder] [int] NULL DEFAULT ((0))
)
(
[OptionValueID] [int] IDENTITY(1,1) NOT NULL,
[Value] [nvarchar](64) NOT NULL DEFAULT (''),
[SortOrder] [int] NULL DEFAULT ((0))
)
(
[OptionToValueID] [int] IDENTITY(1,1) NOT NULL,
[OptionID] [int] NOT NULL DEFAULT ((0)),
[OptionValueID] [int] NOT NULL DEFAULT ((0))
)
(
[AttributeID] [int] IDENTITY(1,1) NOT NULL,
[ProductID] [int] NOT NULL DEFAULT ((0)),
[OptionID] [int] NOT NULL DEFAULT ((0)),
[OptionValueID] [int] NOT NULL DEFAULT ((0)),
[SortOrder] [int] NULL DEFAULT ((0))
)
现在我在程序中 使用这几个东西
关系也是明确的
选项--选项值 一对多
产品--选项 一对多
好创建系统中的VO 对象
先来创建 选项 ---选项值 Option类维护一个List<OptionValueInfo> Values 的一个引用 完成一对多关系的维护
没有评论:
发表评论