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

时间:2022-06-11
本文章向大家介绍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();

        }
    }
}