C#中值类型和引用类型及类型的转换

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/article/details/52911145

在 C# 中,变量分为以下几种类型:

  • 值类型(Value types)
  • 引用类型(Reference types)
  • 指针类型(Pointer types)

和Javascript一样,值类型保存在栈中,引用类型值存储在堆中,值的引用保存在栈中。数据操作运算和js一样,值类型复制copy值本身,引用类型复制copy引用指针。有一个区别就是在C#中String类型是引用类型。

值类型

值类型变量可以直接分配给一个值。它们是从类 System.ValueType 中派生的,值存储在中。 值类型直接包含数据。比如 int、char、float,它们分别存储数字、字母、浮点数。

引用类型

引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。 引用位置保存在栈中,数据存储在堆中 换句话说,它们指的是一个内存位置。使用多个变量(栈引用)时,引用类型可以指向一个内存位置(堆)。如果内存位置的数据是由一个变量改变的,其他变量(栈引用)会自动反映这种值的变化。内置的 引用类型有:object、dynamic 和 string。

字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。

C# string 字符串的前面可以加 @(称作”逐字字符串”)将转义字符(\)当作普通字符对待,比如:

string str = @"C:\Windows";

等价于:

string str = "C:\\Windows";
string s1 = "kenny";
string s2 = "kenny";
Console.WriteLine(s1 == s2); //True
Console.WriteLine((Object)s1 == (Object)s2); //True
//公司.Neter说字符串会做缓存处理,其他引用类型不会相等,证实确实这样

指针类型(Pointer types)

指针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针有相同的功能。 声明指针类型的语法:

type* identifier;

类型转换

  • 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
  • 显式类型转换 - 使用预定义的函数显式完成的。显式转换需要强制转换运算符。
namespace TypeConversionApplication
{
    class ExplicitConversion
    {
        static void Main(string[] args)
        {
            double d = 5673.74;
            int i;

            // 强制转换 double 为 int
            i = (int)d;
            Console.WriteLine(i);
            Console.ReadKey();

        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CVer

排序算法 | 冒泡排序(含C++/Python代码实现)

排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。排序算法有很多,本文将介绍最经典的排序算法:冒泡排序...

14520
来自专栏java工会

Java基础第一阶段知识点,招实习的面试官都在问这些

a) 答:Java源文件被编译成字节码的形式,无论在什么系统环境下,只要有java虚

13810
来自专栏python成长之路

lambda函数常见用法

18550
来自专栏Java技术栈

JDK8新特性之Lambda表达式

什么是Lambda表达式 Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个...

35150
来自专栏林德熙的博客

C# 传入 params object 长度

刚刚 LiesAuer 大神问了一个问题,如果在 params object 传入 object 数组,那么拿到的值是的长度是多少 我做了测试在传入不同的值可能...

17020
来自专栏程序员互动联盟

【编程基础】如何赢得C++面试

1.new、delete、malloc、free关系 delete会调用对象的析构函数,和new对应的是free,free只会释放内存,new调用构造函数。m...

40270
来自专栏深度学习思考者

面向对象三要素:封装继承多态的阐述及示例

  面向对象的三个基本特征是:封装、继承、多态。 一 封装   封装就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员。隐藏了类的实...

26050
来自专栏Python小屋

Python标准库base64用法简介

base64模块提供了大量函数用来把二进制数据编码为可打印的ASCII字符,以及将其解码为二进制数据。提供了RFC3548中Base16、Base32、Base...

91780
来自专栏desperate633

浅谈javascript中的的闭包作用域链引出闭包利用闭包突破作用域链的三种方法小结

闭包可以说是javascript中最令人迷惑的概念了。需要我们在实践中去慢慢理解,在实际编码中,由于闭包的效率和会产生大量无法销毁的内存,所以原则是尽量少使用闭...

7910
来自专栏开发与安全

从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等

一、bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节。 声明方式...

20100

扫码关注云+社区

领取腾讯云代金券