热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

02值类型

分配在栈上、派生于System.ValueType的值类型:●简单类型,比如int,uint,byte,sbyte,short,long,ulong,char,float,do

分配在栈上、派生于System.ValueType的值类型:

简单类型,比如int,uint,byte,sbyte,short,long,ulong,char,float,double,decmial,bool都属于值类型。简单类型对应BCL基类库的别名,比如byte对应System.Byte,short对应System.Int16等。

结构和枚举属于值类型。

 

什么是BCL基类库:
Base Class
Library基类库,即mscorlib.dll这个程序集中包含类库。不管项目的"引用"文件夹里是否引用,默认是引用进来的。C#中的关键字,比如int,
string都会被映射到BCL基类库中的对应类型。BCL也为中间语言CIL提供基础支持。

 

栈(Stack)和堆(Heap):
bubuko.com,布布扣
title="栈和堆" border="0" alt="栈和堆" src="https://img8.php1.cn/3cdc5/1e804/3b4/3ced152850f49b5a.jpeg"
>

 

 
在对变量操作前是不会入栈的


bubuko.com,布布扣bubuko.com,布布扣展开using System;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
MyCuteCat cat;
}
}
public struct MyCuteCat
{
public int _age;
public MyCuteCat(int age)
{
this._age = age;
}
}
}


bubuko.com,布布扣
title="1" border="0" alt="1" src="https://img8.php1.cn/3cdc5/1e804/3b4/d64dde1dbf021096.jpeg"
>

 

 
一旦对变量操作,就会有出栈和入栈操作


bubuko.com,布布扣bubuko.com,布布扣展开 class Program
{
static void Main(string[] args)
{
MyCuteCat cat;
cat._age = 1;
Console.WriteLine(cat._age);
Console.ReadKey();
}
}


bubuko.com,布布扣
title="2" border="0" alt="2" src="https://img8.php1.cn/3cdc5/1e804/3b4/d3f8eff0880a6e9b.jpeg"
>  

 

 
引用类型初始化需要new对象,否则报错

把结构类型改成class,生成的时候会出现编译错误。


bubuko.com,布布扣bubuko.com,布布扣展开using System;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
MyCuteCat cat;
cat._age = 1;
Console.WriteLine(cat._age);
Console.ReadKey();
}
}
public class MyCuteCat
{
public int _age;
public MyCuteCat(int age)
{
this._age = age;
}
}
}


bubuko.com,布布扣
title="3" border="0" alt="3" src="https://img8.php1.cn/3cdc5/1e804/3b4/0756953c75b2ec31.jpeg"
>

 

 
所有的元素在使用前必须初始化,否则报错

把cat._age = 1;注释掉。


bubuko.com,布布扣bubuko.com,布布扣展开using System;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
MyCuteCat cat;
//cat._age = 1;
Console.WriteLine(cat._age);
Console.ReadKey();
}
}
public struct MyCuteCat
{
public int _age;
public MyCuteCat(int age)
{
this._age = age;
}
}
}


bubuko.com,布布扣
title="4" border="0" alt="4" src="https://img8.php1.cn/3cdc5/1e804/3b4/0e0063300a1981e1.jpeg"
>

 

 
对结构而言,在调用方法之前需要对所有字段进行赋值


bubuko.com,布布扣bubuko.com,布布扣展开using System;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
MyCuteCat cat;
//cat._age = 1;
//Console.WriteLine(cat._age);
cat.SayHi();
Console.ReadKey();
}
}
public struct MyCuteCat
{
public int _age;
public MyCuteCat(int age)
{
this._age = age;
}
public void SayHi()
{
Console.WriteLine("我是猫小姐,我今年" + _age + "岁了");
}
}
}


bubuko.com,布布扣
title="5" border="0" alt="5" src="https://img8.php1.cn/3cdc5/1e804/3b4/bf0c8b3f57156343.jpeg"
>

去掉cat._age = 1;的注释,运行。

bubuko.com,布布扣
title="6" border="0" alt="6" src="https://img8.php1.cn/3cdc5/1e804/3b4/6c6a7f85b360a364.jpeg"
>

如果要对结构的每个字段赋值会很麻烦。

 

 
结构类型的构造函数

□ 使用结构的构造函数对结构字段进行初始化

 

是由编译器隐式为结构类型创建的。在构造函数中对结构类型进行初始化,值类型的初始值是0,引用类型的初始值是null。

注意:不可以对结构类型显式地声明构造函数。


bubuko.com,布布扣bubuko.com,布布扣展开using System;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
MyCuteCat cat = new MyCuteCat();
//cat._age = 1;
//Console.WriteLine(cat._age);
cat.SayHi();
Console.ReadKey();
}
}
public struct MyCuteCat
{
public int _age;
public MyCuteCat(int age)
{
this._age = age;
}
public void SayHi()
{
Console.WriteLine("我是猫小姐,我今年" + _age + "岁了");
}
}
}


运行结果:
bubuko.com,布布扣
title="7" border="0" alt="7" src="https://img8.php1.cn/3cdc5/1e804/3b4/89d9e6c99cc0a4a0.jpeg"
>

 

IL部分:
bubuko.com,布布扣
title="8" border="0" alt="8" src="https://img8.php1.cn/3cdc5/1e804/3b4/ffe6ef050959240f.jpeg"
>

 

可见:
MyCuteCat
cat意味着在线程栈上创建了一个类型为MyCuteCat的变量cat,并入栈。
new
MyCuteCat()并不是创建实例,也不不会分配内存,仅仅是调用结构的构造函数对字段进行初始化。

 

□ 如果没有声明局部变量,会创建一个临时变量


bubuko.com,布布扣bubuko.com,布布扣展开using System;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(new MyCuteCat()._age);
Console.ReadKey();
}
}
public struct MyCuteCat
{
public int _age;
public MyCuteCat(int age)
{
this._age = age;
}
public void SayHi()
{
Console.WriteLine("我是猫小姐,我今年" + _age + "岁了");
}
}
}


bubuko.com,布布扣
title="9" border="0" alt="9" src="https://img8.php1.cn/3cdc5/1e804/3b4/6e0df235521a6e92.jpeg"
>

 

□ 通过结构的构造函数为结构字段赋初值


bubuko.com,布布扣bubuko.com,布布扣展开using System;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
MyCuteCat cat = new MyCuteCat(10);
cat.SayHi();
Console.ReadKey();
}
}
public struct MyCuteCat
{
public int _age;
public MyCuteCat(int age)
{
this._age = age;
}
public void SayHi()
{
Console.WriteLine("我是猫小姐,我今年" + _age + "岁了");
}
}
}


bubuko.com,布布扣
title="10" border="0" alt="10" src="https://img8.php1.cn/3cdc5/1e804/3b4/abed74f5f54bc6a0.jpeg"
>

 

IL部分:
bubuko.com,布布扣
title="11" border="0" alt="11" src="https://img8.php1.cn/3cdc5/1e804/3b4/11946da445f77e62.jpeg"
>

 

※参考资料
《.NET之美》--张子阳,感谢写了这么好的书!

02值类型,布布扣,bubuko.com


推荐阅读
  • 单链表的高效遍历及性能优化策略
    本文探讨了单链表的高效遍历方法及其性能优化策略。在单链表的数据结构中,插入操作的时间复杂度为O(n),而遍历操作的时间复杂度为O(n^2)。通过在 `LinkList.h` 和 `main.cpp` 文件中对单链表进行封装,我们实现了创建和销毁功能的优化,提高了单链表的使用效率。此外,文章还介绍了几种常见的优化技术,如缓存节点指针和批量处理,以进一步提升遍历性能。 ... [详细]
  • NOIP2000的单词接龙问题与常见的成语接龙游戏有异曲同工之妙。题目要求在给定的一组单词中,从指定的起始字母开始,构建最长的“单词链”。每个单词在链中最多可出现两次。本文将详细解析该题目的解法,并分享学习过程中的心得体会。 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 资源管理器的基础架构包括三个核心组件:1)资源池,用于将CPU和内存等资源分配给不同的容器;2)负载组,负责承载任务并将其分配到相应的资源池;3)分类函数,用于将不同的会话映射到合适的负载组。该系统提供了两种主要的资源管理策略。 ... [详细]
  • 本文深入解析了Java面向对象编程的核心概念及其应用,重点探讨了面向对象的三大特性:封装、继承和多态。封装确保了数据的安全性和代码的可维护性;继承支持代码的重用和扩展;多态则增强了程序的灵活性和可扩展性。通过具体示例,文章详细阐述了这些特性在实际开发中的应用和优势。 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • 初探性能优化:入门指南与实践技巧
    在编程领域,常有“尚未精通编码便急于优化”的声音。为了从性能优化的角度提升代码质量,本文将带领读者初步探索性能优化的基本概念与实践技巧。即使程序看似运行良好,数据处理效率仍有待提高,通过系统学习性能优化,能够帮助开发者编写更加高效、稳定的代码。文章不仅介绍了性能优化的基础知识,还提供了实用的调优方法和工具,帮助读者在实际项目中应用这些技术。 ... [详细]
  • C# .NET 4.1 版本大型信息化系统集成平台中的主从表事务处理标准示例
    在C# .NET 4.1版本的大型信息化系统集成平台中,本文详细介绍了主从表事务处理的标准示例。通过确保所有操作要么全部成功,要么全部失败,实现主表和关联子表的同步插入。主表插入时会返回当前生成的主键,该主键随后用于子表插入时的关联。以下是一个示例代码片段,展示了如何在一个数据库事务中同时添加角色和相关用户。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 在本文中,我们将深入探讨C#中的构造函数及其应用场景。通过引入构造函数,可以有效解决在访问类属性时反复赋值导致的代码冗余问题,提高代码的可读性和维护性。此外,还将介绍构造函数的不同类型及其在实际开发中的最佳实践。 ... [详细]
  • 本文详细探讨了使用纯JavaScript开发经典贪吃蛇游戏的技术细节和实现方法。通过具体的代码示例,深入解析了游戏逻辑、动画效果及用户交互的实现过程,为开发者提供了宝贵的参考和实践经验。 ... [详细]
author-avatar
萧勇志762852
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有