热门标签 | 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


推荐阅读
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
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社区 版权所有