C# 值类型,自定义值类型(struct,enum)

/*C#值类型 ValueType
 * 1.有两种自定义值类型:结构,枚举;
 * 2.值类型(value type)和引用类型(reference type):区别源于复制策略的不同,后者又造成每种类型在内存中以不同的方式存储。值类型:直接包含值,换句话说就是引用的位置就是值在内存中
 * 实际存储位置,寻址方式就是直接寻址;值类型存储在栈里面,引用类型存储在堆里面,变量名称存储在栈里面;值类型需要一个内存副本;
 * 值类型传值得方式是复制;引用是共享同一块内存;引用类型的变量关联了两个存储位置:直接和变量关联的存储位置,以及由变量中存储的值引用的存储位置,
 * 相当于是间接寻址;堆需要垃圾回收;复制引用类型的值时,只是赋值的是引用,这个引用很小,32位机是4B,64位机是8B的引用,如果复制引用
 * 类型的代价比引用类型的要高的话就把这个东西设计为引用类型,要求值类型不能超过16B;除了object和string类型是引用类型,所有C#的内建类型
 * 都是值类型;Use keyword struct to declare a vlaue type;declaring a reference type as a struct would create a value type larger than 16 bytes;
 * 3.结构不能显式的包含无参的构造函数,每个结构会自动获取一个无参的构造器将所有字段初始化为各自的默认值,默认的没有写继承自哪的话,默认继承自System.ValueType
 * 4.readonly只能修饰字段,是不能修饰属性的
 * 5.不能在声明时为字段赋初始值;但这不是说明字段不需要初始化,除非所有的字段都初始化,否则结构类型的局部变量无法使用
 * 6.为了保证值类型的局部变量被完全初始化,每个构造器都必须初始化结构中的所有字段;
 * 7.必须对自动实现的属性的支持字段完全赋值,才能将控制返回给调用方;
 * 8.方法和属性是在初始化好所有的字段才能访问,需要直接初始化好所有的字段,包括属性的支持字段;
 * 9.为引用类型使用new操作符,会造成“运行时”在堆上创建对象的新实例,并将所有的字段初始化为默认值,然后再调用构造器,将对该实例的引用逸this传给构造器;结果是对最终的的
 * 实例的引用,该(引用)将被复制到最终的目的地;
 * 10.为值类型使用new操作符会造成“运行时”在临时存储池中创建对象的新实例,并将所有的字段初始化为默认值,再调用构造器(将临时存储位置作为ref变量以this传给构造器),结果
 * 是临时存储位置的值,该(值)将被复制到最终的目的地;
 * 11.结构不支持终结器(finalize),只有类类型才能包含终结器;引用类型具有“引用同一性”,结构以值得形式复制;
 * 12.任何值类型都可以使用new 变量类型();
 * 13.所有的值类型都隐式的密封,除了枚举类型(extends System.Enum而它继承自ValueType类)外其他的所有的值类型都派生自System.Value.这意味着就够的继承链总是从object到System.Value到结构;
 * 14:值类型可以实现接口;
 * 15.再次复习一下,在命名空间下只有两种形式:internal和public
 * 16.枚举类型到了CIL中就会多了一个字段就是Value__;而且每一项都是一个字段,以Int32的形式,枚举的顺序代表不同的值,所以不要再将来为枚举添加新项时插入中间,而在末尾,
 * 要不就是显示的赋值;
 * 17.enum里面的字段都会编译成static
 * 18.规范:不要定义结构,除非他在逻辑上代表单个值,消耗16B火更少的存储空间,不可变,而且很少装箱;枚举的主要功能是代码的可读性上面;
 * User: YuanWei
 * Date: 2015/1/19
 * Time: 15:24
 *
 */
using System;

namespace LearningValueType
{
    class Program
    {
        public static void Main(string[] args)
        {
            // TODO: Implement Functionality Here
            ConnectionState1[] states=(ConnectionState1[])(Array)new ConnectionState2[42];
//            float fNum=23f;
//            byte bNum=3;
//            sbyte sbNum=4;
            int firstNum=23;
            int secondNum=24;
//            uint uiNum=24;
            float fNum=new float();//任何值类型都可以使用new 变量类型();跟 float FNum=0;default(int)是一样的
            Console.WriteLine(fNum);
            Angle angle=new Angle(30,30,30);
            Console.WriteLine(new Program().Add(firstNum ,secondNum ));
            Console.ReadKey(true);
        }
        public int Add(int firstValue,int secondValue)
        {
            return firstValue+secondValue;
        }
    }
    public struct Angle
    {
        interface IDisplyable
        {
            //在结构中可以声明接口
        }
         enum Sex//在结构里面默认是private
        {
            Man,
            Woman
        }
//        public Angle()//为隐式构造,不能显式给出;
//        {
        //报错:结构不能显式的包含无参的构造函数
//        }
        /// <summary>
        ///构造函数,不能显式的包含无参的构造函数
        /// </summary>
        /// <param name="degrees">度</param>
        /// <param name="minutes">分</param>
        /// <param name="seconds">秒</param>
        public Angle(int degrees,int minutes,int seconds)
        {
            _Degrees=degrees;
            _Minutes=minutes;
            _Seconds=seconds;
        }
        public int Degrees{get{return _Degrees;}}//property of Degrees
        private readonly int _Degrees;//Filed of _Degrees
//        private int Num=23;//错误:不能在声明时为字段赋初始值;但这不是说明字段不需要初始化,除非所有的字段都初始化,否则结构类型的局部变量无法使用
        public int Minutes{get{return _Minutes;}}
        private readonly  int _Minutes;
        public int Seconds{get{return _Seconds;}}
        private readonly int _Seconds;
//        public int Num{get;set;}//会报错:必须对自动实现的属性的支持字段完全赋值,才能将控制返回给调用方。
        public Angle Move(int degrees,int minutes,int seconds)
        {
            return new Angle(Degrees+degrees,Minutes+minutes,Seconds+seconds);
        }
//        ~Angle()
//        {
//            报错:只有类类型才能包含析构函数
//        }
        public string  ReportSex()
        {
            return (Sex.Man).ToString();
        }
    }
     enum Gender//默认为internal,到了CIL中就是密闭的类,internal的话就是private,public的就是public的
    {
        Male,
        Female
    }
     enum ConnectionState1
     {
         Disconnection,
         Connecting,
         Connected,
         Disconnecting
     }
     enum ConnectionState2
     {
         Disconnection,
         Connecting,
         Connected,
         Disconnecting
     }
}
时间: 2024-10-15 14:11:33

C# 值类型,自定义值类型(struct,enum)的相关文章

struct 如何存储指针类型的值

通过 __unsafe_unretained标示符标示指针类型的值,否则xcode会报以下错误(前提,你使用的是ARC模式): ARC forbids Objective-C objects in struct 例如: 1 typedef struct { 2 3 __unsafe_unretained NSString *name; 4 } myStruct;

C# 类型基础 值类型和引用类型

引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复制(Shallow Copy)和深度复制(Deep Copy),浅度复制和深度复制又是以如何复制引用类型成员来划分的.由此又引出了引用类型和值类型,以及相关的对象判等.装箱.拆箱等基础知识.索性从最基础的类型开始自底向上写起. 值类型和引用类型 先简单回顾一下C#中的类型系统.C# 中的类型一共分为

swift 学习笔记:值类型and参考类型!

helloworld篇章 值: swift中类型分为两种:第一种是值类型,该类型的每个实例持有数据的副本,并且该副本对于每个实例来说是独一无二的一份,比如结构体(struct).枚举(enum).元组(tuple)都是值类型.第二种是参照类型,该类型的实例共享数据唯一的一份副本(在native层面说的话,就是该类型的每个实例都指向内存中的同一个地址),比如类(class)就是参照类型 如果你想创建一个新类型,那么你应该选择值类型还是参照类型呢?当你使用Cocoa框架时,很多API都是NSObje

广工 数据结构 表达式类型求值(上)

一.  需求分析 一个表达式和一棵树之间存在自然的对应关系,实现以下操作: (1)以字符序列的形式输入语法正确的后缀表达式并构造表达式. (2)可实现对应原表达式的加.减.乘.除四则混合运算. (3)运算数可以是整数.实数或变量,若是变量,可对变量赋值,以求得对应原表达式的值. (4)可以求表达式的中缀和后缀序列,还可以求所建立的二叉树的深度. [测试数据] 1)分别输入0:a; -91; 2 4 +; 1.5 a uuu / *; 2  11 + 3 ^并输出. 2)每当输入一个表达式后,对其

探讨Swift值类型和参照类型的使用价值

在Swift中,类型分为两类:第一种是值类型,该类型的每个实例持有数据的副本,并且该副本对于每个实例来说是独一无二的一份,比如结构体(struct).枚举(enum).元组(tuple)都是值类型.第二种是参照类型,该类型的实例共享数据唯一的一份副本(在native层面说的话,就是该类型的每个实例都指向内存中的同一个地址),比如类(class)就是参照类型.在这篇文章中,我们将深入探讨值类型和参照类型的使用价值,以及如何在某种场景下选择正确的类型.推荐学习iOS开发率先升级-Swift语言视频教

第3章 类型、值和变量

1. JS数据类型分为两类:原始类型(primitive type)和对象类型(object type).原始类型包括数字.字符串.布尔值以及null(空)和undefined(未定义)两个特殊原始值,null和undefined分别代表了各自特殊类型的唯一成员. 对象是属性的集合,每个属性由“名/值对”构成.JS中普通的对象是“命名值”(或者说“名/值对”)的无序集合,不过JS定义了一种特殊对象——数组,表示带编号值的有序集合. JS还定义了另外一种特殊对象——函数,JS中函数也是对象.数组和

Lua语言基础(1) -- 类型与值

基础介绍 Lua是一种动态类型的语言.在语言中没有类型定义的语法,每个值都带有其自身的类型信息.在Lua中有8种基本类型,分别是: nil(空)类型 boolean(布尔)类型 number(数字)类型 string(字符串)类型 userdata(自定义类型) function(函数)类型 thread(线程)类型 table(表)类型 以上是Lua中的8中基本类型,我们可以使用type函数,判断一个值得类型,type函数返回一个对应类型的字符串描述.例如: 1 2 3 4 5 6 7 8 9

Lua(一)——类型与值

lua是一款小巧的脚本语言,是巴西里约热内卢天主教大学里的一个研究小组于1993年开发其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译.运行.lua并没有提供强大的库,这是由它的定位决定的,所以lua不适合作为开发独立应用程序的语言,在游戏开发等领域使用较多. 1. 引子 1.1 保留字 保留字的概念不用多说,lua中的保留字如下21个: and break do else elseif end false fo

Object变量可包含值类型或引证类型

改动s1值对s2没有影响.这更使string看起来像值类型.实际上,这是运算符重载的成果,当s1被改动时,.NET保管堆上为s1重新分配了内存.这样的意图为了将做为引证类型的string完成为一般语义下的字符串. 4.值类型和引证类型在内存中的组织 常常听说,而且常常在书上看到值类型布置在栈上,引证类型组织在保管堆上.实际上并没有这么简略.MSDN上说:保管堆上布置了一切引证类型.这很简略了解.当创建一个使用类型变量时:objectrefer=newobject; 关键字new将在保管堆上分配内