5、C#基础 - C#的值类型
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
下一篇:
5、C#基础 - C#的值类型的更多相关文章
- C#基础篇五值类型和引用类型
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace P01M ...
- .NET基础知识(01)-值类型与引用类型
常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还是值类型?enum.int[]和string呢? 4. 堆和栈的区别? 5. 什么情况下会在堆 ...
- C#基础(四)--值类型和引用类型,栈和堆的含义
本文主要是讨论栈和堆的含义,也就是讨论C#的两种类据类型:值类型和引用类型: 虽然我们在.net中的框架类库中,大多是引用类型,但是我们程序员用得最多的还是值类型. 引用类型如:string,Obje ...
- c#1所搭建的核心基础之值类型和引用类型
这个主题很重要,在.NET中做的一切其实都是在和一个值类型或者引用类型打交道. 现实世界中的值和引用 假定你在读一份非常棒的东西,希望一个朋友也去读他.于是你到复印室里复印了一份.这个时候他获得了属于 ...
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32(); // a = 0 a = 1 ...
- C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)
前言 之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处. 本文的重点就是:值类型直接存储其值,引 ...
- [c#基础]值类型和引用类型的Equals,==的区别
引言 最近一个朋友正在找工作,他说在笔试题中遇到Equals和==有什么区别的题,当时跟他说如果是值类型的,它们没有区别,如果是引用类型的有区别,但string类型除外.为了证实自己的说法,也研究了一 ...
- Swift语言指南(七)--语言基础之布尔值和类型别名
原文:Swift语言指南(七)--语言基础之布尔值和类型别名 布尔值 Swift有一个基本布尔类型,叫做布尔(bool),布尔值又称逻辑值(logical),因为它只能为真(true)或假(false ...
- C#基础--值类型和引用类型
C#中大多数类型都是引用类型,只有个别特殊情况是值类型. 值类型: 枚举(enum) 结构(struct) 基础类型:int, short, char, bool....(string是引用类型) 引 ...
随机推荐
- 暑假练习赛 003 A Spider Man
A - Spider Man Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:262144KB ...
- Mr. Frog’s Game
Mr. Frog’s Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- Jumpserver部署与安装
jumpserver特点: 完全开源,GPL授权 Python编写,容易再次开发 实现了跳板机基本功能,认证.授权.审计 集成了Ansible,批量命令等 支持WebTerminal Bootstra ...
- express的学习,与使用
最近在学习vue的一个实战项目,碰到一个express,当时很萌,就随便看了看................ expres是基于node 的一个web框架, 首先可以找到它的官网照着学习 这里只讲一 ...
- [Bayesian] “我是bayesian我怕谁”系列 - Gaussian Process
科班出身,贝叶斯护体,正本清源,故拿”九阳神功“自比,而非邪气十足的”九阴真经“: 现在看来,此前的八层功力都为这第九层作基础: 本系列第九篇,助/祝你早日hold住神功第九重,加入血统纯正的人工智能 ...
- 浅谈如何使用swfupload工具与struts2无缝相接
笔者在网上查找流行的上传组件,swfupload引入眼帘,受到JavaEye的一篇文章启发,历时三天,加以研究,现将心得奉上,献礼JavaEye. 由于笔者才疏学浅,经验匮乏,介绍不深入,仅供菜鸟参考 ...
- SQL命令语句进行大数据查询如何进行优化
SQL 大数据查询如何进行优化? 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索 2.应尽量避免在 where 子句中对字段进行 null 值 ...
- 无限分级Repeater递归实现:读取一次数据库,使用LINQ2SQL技术,支持排序&显示隐藏
预览效果图: Selenium 数据库结构: id(int) classname(string) parentid(int) sort(int用于显示与排序) 1 家居 0 1 2 家电 0 ...
- 初始MyBatis
初始MyBatis 框架的概念: 框架是一个提供可重复的功用结构的半成品.它为我们构建新的应用程序提供了极大的便利,一方面提供了可以拿来就用的工具,更重要的是提供了可重用的设计.D 框架技术的优势: ...
- Redis全面介绍
最近重新认识了一下Redis,借着这个机会,也整理一篇算是比较详尽和全面的文章吧. 缓存 缓存就是数据交换的缓冲区(称作Cache)——摘自百度百科.无论是在计算机硬件体系结构还是软件体系结构中, ...