1、C#的值类型

有几个特点:

  • 存储在栈里
  • 基于值类型的变量直接包含值(值类型存储实际值)。 将一个值类型变量赋给另一个值类型变量时,将复制包含的值。 这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
  • 所有的值类型均隐式派生自 System.ValueType。
  • 与引用类型不同,不能从值类型派生出新的类型。 但与引用类型相同的是,结构也可以实现接口。
  • 与引用类型不同,值类型无法包含 null 值。 但是,可以为 null 的类型 功能允许值类型分配给 null。
  • 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。

值类型分为两类: struct( 结构 )、 enum(枚举 )

struct( 结构 )分为以下几类:

  • Numeric(数值)类型

    • 整型

    • 浮点型

    • decimal

  • bool

  • 用户定义的结构。

下表列出了 C# 中内置类型中可用的值类型:

类型 描述 范围 默认值
bool 布尔值 True 或 False False
byte 8 位无符号整数 0 到 255 0
char 16 位 Unicode 字符 U +0000 到 U +ffff '\0'
decimal 128 位精确的十进制值,28-29 有效位数 (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 0.0M
double 64 位双精度浮点型 (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 0.0D
float 32 位单精度浮点型 -3.4 x 1038 到 + 3.4 x 1038 0.0F
int 32 位有符号整数类型 -2,147,483,648 到 2,147,483,647 0
long 64 位有符号整数类型 -923,372,036,854,775,808 到 9,223,372,036,854,775,807 0L
sbyte 8 位有符号整数类型 -128 到 127 0
short 16 位有符号整数类型 -32,768 到 32,767 0
uint 32 位无符号整数类型 0 到 4,294,967,295 0
ulong 64 位无符号整数类型 0 到 18,446,744,073,709,551,615 0
ushort 16 位无符号整数类型 0 到 65,535 0

实际上是简单类型,所有的简单类型(C# 语言的组成部分)均为 .NET Framework 系统类型的别名。 例如,int 是 System.Int32 的别名。可使用文字初始化简单类型。 例如,“A”是 char 类型的文字,而 2001 是 int 类型的文字。如需得到一个类型或一个变量在特定平台上的准确尺寸,可以使用 sizeof 方法。表达式 sizeof(type) 产生以字节为单位存储对象或类型的存储尺寸。下面举例获取任何机器上 int 类型的存储尺寸:

 namespace DataTypeApplication
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Size of int: {0}", sizeof(int));
Console.ReadLine();
}
}
}

当上面的代码被编译和执行时,它会产生下列结果:

Size of int: 

2、 C# 的 struct

struct(结构)通常用作一小组相关变量的容器,在 C# 中它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体,可以按照如下的方式声明 Person结构:

 struct Person
{
public string name;
public int age;
public string sex;
6 };

下面的程序演示了结构的用法:

using System;

namespace MyStruct
{
    struct Person
    {
        public string name;
        public int age;
        public string sex;
    }     class Program
    {
        static void Main(string[] args)
        {
            Person person1;
            person1.name = "张三";
            person1.age = 18;
            person1.sex = "男";             Person person2;
            person2.name = "李四";
            person2.age = 20;
            person2.sex = "男";             //输出 person1 的信息
            Console.WriteLine("person1 姓名:{0}", person1.name);
            Console.WriteLine("person1 性别:{0}", person1.sex);
            Console.WriteLine("person1 年龄:{0}", person1.age);             //输出 person2 的信息
            Console.WriteLine("person2 姓名:{0}", person2.name);
            Console.WriteLine("person2 性别:{0}", person2.sex);
            Console.WriteLine("person2 年龄:{0}", person2.age);             Console.Read();
        }
    }
}

当上面的代码被编译和执行时,它会产生下列结果:

person1 姓名:张三
person1 性别:男
person1 年龄:
person2 姓名:李四
person3 性别:男
person4 年龄:

结构与类具有许多相同的语法,但结构比类受到的限制更多:

  • 结构可带有方法、字段、索引、属性、运算符方法和事件。
  • 结构不能声明默认构造函数(没有参数的构造函数)或终结器。
  • 结构可以声明具有参数的构造函数。
  • 一个结构无法继承自另一个结构或类,并且它不能为类的基类。
  • 结构可实现一个或多个接口。
  • 结构成员不能指定为 abstract、virtual 或 protected。
  • 与类不同,无需使用 new 运算符即可对结构进行实例化。
  • 如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。

多提一下:可将结构类型强制转换为接口类型,这将导致“装箱”操作,以将结构包装在托管堆上的引用类型对象内。 当将值类型传递到接受 Object 作为输入参数的方法时,将发生装箱操作。详细的会在后面装箱和取消装箱说明。

C# 的 enum

枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。 例如,假设您必须定义一个变量,该变量的值表示一周中的一天。 该变量只能存储七个有意义的值。 若要定义这些值,可以使用枚举类型。枚举类型是使用 enum 关键字声明的:

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };

默认情况下,枚举中每个元素的基础类型是 int。 可以使用冒号指定另一种整数值类型,如前面的示例所示。准许使用的类型有 byte、sbyte、short、ushort、int、uint、long 或 ulong。

通常情况下,最好是在命名空间内直接定义枚举,以便该命名空间中的所有类都能够同样方便地访问它。 但是,还可以将枚举嵌套在类或结构中。
默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增 1。 例如,下面的枚举,Sat 是 0,Sun 是 1,Mon 是 2 等。

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

如下面的示例所示枚举数可用初始值来重写默认值。

enum Days {Sat=, Sun, Mon, Tue, Wed, Thu, Fri};

在此枚举中,强制元素序列从 1 而不是 0 开始。 但是,一般建议这样使用。注,枚举数的名称中不能包含空白。

如果变量 meetingDay 的类型为 Days,则只能将 Days 定义的某个值赋给它(无需显式强制转换)。 如果会议日期更改,可以将 Days 中的新值赋给 meetingDay:

Days meetingDay = Days.Monday;
//...
meetingDay = Days.Friday;

可以将任意整数值赋给 meetingDay。 例如,代码行 meetingDay = (Days) 42 不会产生错误。 但也不应该这样做,因为默认约定的是枚举变量只容纳枚举定义的值之一。 将任意值赋给枚举类型的变量很有可能会导致错误。
 
下面的实例演示了枚举变量的用法:

using System;

namespace MyEnum
{
class Program
{
enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };
static void Main(string[] args)
{
int WeekdayStart = (int)Days.Mon;
int WeekdayEnd = (int)Days.Fri;
Console.WriteLine("Monday: {0}", WeekdayStart);
Console.WriteLine("Friday: {0}", WeekdayEnd); Console.Read();
}
}
}

当上面的代码被编译和执行时,它会产生下列结果:

Monday:
Friday:

项目源码下载:https://pan.baidu.com/s/1miOPAdU


C#基础,目录

上一篇:4、C#基础 - C# 的 常见概念简述

下一篇:

5、C#基础 - C#的值类型的更多相关文章

  1. C#基础篇五值类型和引用类型

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace P01M ...

  2. .NET基础知识(01)-值类型与引用类型

    常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还是值类型?enum.int[]和string呢? 4. 堆和栈的区别? 5. 什么情况下会在堆 ...

  3. C#基础(四)--值类型和引用类型,栈和堆的含义

    本文主要是讨论栈和堆的含义,也就是讨论C#的两种类据类型:值类型和引用类型: 虽然我们在.net中的框架类库中,大多是引用类型,但是我们程序员用得最多的还是值类型. 引用类型如:string,Obje ...

  4. c#1所搭建的核心基础之值类型和引用类型

    这个主题很重要,在.NET中做的一切其实都是在和一个值类型或者引用类型打交道. 现实世界中的值和引用 假定你在读一份非常棒的东西,希望一个朋友也去读他.于是你到复印室里复印了一份.这个时候他获得了属于 ...

  5. CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段

    编程语言的基元类型   某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32();  // a = 0 a = 1 ...

  6. C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)

    前言 之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处. 本文的重点就是:值类型直接存储其值,引 ...

  7. [c#基础]值类型和引用类型的Equals,==的区别

    引言 最近一个朋友正在找工作,他说在笔试题中遇到Equals和==有什么区别的题,当时跟他说如果是值类型的,它们没有区别,如果是引用类型的有区别,但string类型除外.为了证实自己的说法,也研究了一 ...

  8. Swift语言指南(七)--语言基础之布尔值和类型别名

    原文:Swift语言指南(七)--语言基础之布尔值和类型别名 布尔值 Swift有一个基本布尔类型,叫做布尔(bool),布尔值又称逻辑值(logical),因为它只能为真(true)或假(false ...

  9. C#基础--值类型和引用类型

    C#中大多数类型都是引用类型,只有个别特殊情况是值类型. 值类型: 枚举(enum) 结构(struct) 基础类型:int, short, char, bool....(string是引用类型) 引 ...

随机推荐

  1. uploadify 配置后,页面显示无效果

    uploadify使用的是Flash版本 谷歌浏览器:默认没有开启Flash,进行如下图设置即可

  2. C++ regex库的三种正则表达式操作

    关于正则表达式的语法和字符含义,网上已经有很不错的博客教学,我当初参考的是 读懂正则表达式就这么简单 - Zery - 博客(http://www.cnblogs.com/zery/p/3438845 ...

  3. Leetcode题解(二)

    4.Median of Two Sorted Arrays(*) 题目 题目要求找到两个排序数组的中位数. 中位数的定义:当n为奇数时,median = array[n/2];当n为偶数时,media ...

  4. Again Stone Game

    Alice and Bob are playing a stone game. Initially there are n piles of stones and each pile contains ...

  5. AngularJS学习篇(五)

    AngularJS Scope(作用域) Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带. Scope 是一个对象,有可用的方法和属性. Scope ...

  6. Ubuntu开启ApacheRewrite功能

    参考原文   :  http://www.knowsky.com/888354.html 1.安装好apache2之后,手动命令启用 执行加载Rewrite模块: a2enmod rewrite 执行 ...

  7. 验证Oracle处理速度

    (这是2009年写的东西了,在网上看到有人对数据库批量操作的'速度'比较关注,于是就把这篇老文章整理了一下) 一.环境及前提 在244上(一台稍好一些的机器,做了RAID,机械硬盘,Raid几忘了), ...

  8. java 猜系统获取的随机数

    int randomNumber=(int)(Math.random()*8)+1; 注释是:得到一个1到8之间的随机整数. /************************************ ...

  9. asp.net应用发布到IIS无法链接到oracle数据库

    遇到这个问题纠结了好久,试了好多的方法,其中我的问题是,先安装了.net frameword4然后又安装的IIS. 正确方式应该是先安装IIS 然后安装.net framework;且应用程序池没有启 ...

  10. C#利用UdpClient发送广播消息

    首先写个接受消息的客户端.这里偷了点懒,new UdpClient(11000)就是用Udp方式侦听11000端口,侦听任何发送到11000端口的消息都会接收到. 代码 : ); Byte[] sen ...