优秀的编程知识分享平台

网站首页 > 技术文章 正文

C#编程零基础到入门学习-C# 值类型和引用类型(4-8)

nanyue 2024-11-12 11:47:50 技术文章 1 ℃

在C#中,根据这些数据类型在内存中存储值的方式对它们进行分类。

C#包括以下类别的数据类型:

  1. 值类型
  2. 引用类型
  3. 指针类型

值类型

在C#中,值类型是一种用于存储简单数据的数据类型,它们直接存储数据的实际值,而不是指向数据的引用(类似快捷方式)。值类型在内存中被分配在堆栈上。

所有值类型都从System.ValueType派生,而System.ValueType又从System.Object派生。

派生:派生是指创建一个新的类,该类继承自一个或多个现有的类。派生类可以获得基类的属性和方法,并可以添加自己的属性和方法,以及重写基类的方法。暂时还没有学到派生的概念,这里紧紧提一下,知道有这个概念就行,后面会陆续介绍包括与其相关的一些概念和用法还有堆栈的一些相关知识。

例如,整数变量 int i= 100;

系统将100存储在为变量 i 分配内存空间中。实际上读取的就是内存地址所对应的值(比较拗口,仔细读好好品哈)

下图说明了如何将100存储在“i”的内存(0x239110)中的(假设)位置:

值类型汇总:

  • bool byte char decimal double enum float int long sbyte short
  • struct uint ulong ushort

C#中的值类型包括以下几种常见的类型介绍:

后面会慢慢的把前面学过的一些知识嵌入到后面的内容里面,您有可能会看到与前些文章内容相识或相近的知识点,省的往前面翻了。

  1. 数值类型:包括整数类型(如int、long、short等)和浮点数类型(如float、double、decimal等)。
  2. 布尔类型:bool,表示逻辑值,只有两个可能的值:true或false。
  3. 字符类型:char,表示单个字符。
  4. 枚举类型:enum,表示一组具名常量的集合。
  5. 结构体类型:struct,表示用户自定义的值类型,可以包含多个字段。

值类型具有以下特点:

1、值类型的变量直接存储数据的值,而不是引用。这意味着当一个值类型的变量被赋值给另一个变量时,实际的值会被复制。

2、值类型在内存中被分配在堆栈上,而不是在托管堆中。这使得值类型的访问速度更快,但也限制了它们的大小和生存周期。

3、值类型是不可变的,即它们的值不能被修改。当对一个值类型的变量进行修改时,实际上是创建了一个新的值,并将其赋值给变量。

4、值类型的默认值是其零值,例如0、false或null(对于可空类型)。

使用值类型可以提高程序的性能,因为它们占用的空间较小,并且在传递参数或赋值时具有复制的特性。然而,需要注意的是,对于较大的数据结构或需要频繁修改值的情况,可能会导致性能下降。在这种情况下,可以考虑使用引用类型来代替。

enum和struct还没有学到,可以不用在意细节了,后面会陆续介绍,知道是值类型就行。

传递值类型变量

当将值类型的变量从一种方法传递到另一种方法时,系统会在另一种方法中创建变量的单独副本。如果在一个方法中更改了值,则不会影响另一方法中的变量。

示例代码:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace ValueTypeAndReferenceType//命名空间
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int i = 100;//首先定义了一个整数变量i并初始化为100
            Console.WriteLine(i);
            ChangeValue(i);
            Console.WriteLine(i);//在调用ChangeValue方法之前将number的值打印到控制台,这时输出的结果为100
        }
        static void ChangeValue(int x)//首先定义了一个整数变量x并初始化为200
        {
            x = 200;
            Console.WriteLine(x);
        }
    }
}


即使在将 Main ()方法中的变量 i 传递给 ChangeValue ()方法并更改其值之后,它仍然保持不变.

引用类型

与值类型不同,引用类型不会直接存储其值。相反,它存储正在存储值的地址。换句话说,引用类型包含指向另一个保存数据的存储位置的指针(比喻为酒店的房间编号)。先不要纠结于指针。

 string S= "Hello World";  

上图系统为变量s选择内存中的随机位置(0x803200)。变量s的值为0x600000,这是实际数据值的内存地址。因此,引用类型存储实际值所在位置的地址,而不是值本身。

涉及到:

S的内存位置的值为(0x803200

S的值位置(0x600000

S的值(helloworld!)

S的值位置(0x600000)所对应(引用)的值是S的值(helloworld!)

有时候不太好理解。

以下是引用类型数据类型:

  • 字符串 数组(即使它们的元素是值类型) 类 委托

类、委托还没有学到这里可以稍作了解即可,后面有详细介绍。

传递引用类型变量

当将引用类型变量从一个方法传递到另一个方法时,它不会创建新的副本; 相反,它会传递变量的地址。因此,如果我们改变方法中变量的值,它也会反映在调用方法中。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ReferenceType
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Student std1 = new Student();
            std1.StudentName = "LiSi";
            Console.WriteLine("第1个值:{0}",std1.StudentName);//未传递前为LiSi
            ChangeReferenceType(std1);//传递值zhangsan
            Console.WriteLine("第2个值:{0}", std1.StudentName);//传递后为ZhangSan
        }
        static void ChangeReferenceType(Student std2)
        {
            std2.StudentName = "ZhangSan";
            Console.WriteLine(std2.StudentName);//std2的为zhangsan
        }
        public class Student
        {
            public string StudentName;
        }
    }
}


在上面的示例中,我们将 Student 对象 std1 传递给ChangeReferenceType()方法。在这里,它实际上传递std1的内存地址。因此,当ChangeReferenceType()方法更改StudentName时,它实际上是在更改std1对象的StudentName,因为std1和std2都指向内存中的同一地址。

Null 值

引用类型变量的默认值null是未初始化时。 Null表示不引用任何对象。

值类型变量不能为null,因为它保存值而不是内存地址。C#2.0引入了可为空的类型,使用它可以为值类型变量分配null或声明值类型变量而无需为其分配值。



Tags:

最近发表
标签列表