Csharp(C#)中的变量--引用类型

C#中的引用类型深入解析

在C#编程世界里,数据类型是构建程序基础的砖石,它们决定了数据如何存储和操作。C#中的数据类型大致可分为两大类:值类型和引用类型。本文将聚焦于引用类型,探讨其特点、应用场景以及如何有效地利用它们来增强代码的灵活性和表现力。

引用类型概览

引用类型不像值类型那样直接存储数据值,而是存储数据的内存地址。这意味着,当你创建一个引用类型的变量并为其赋值时,实际上是创建了一个指向实际数据所在内存位置的指针。因此,多个引用变量可以指向同一块内存,改变其中一个变量所指向的数据会影响到其他共享该内存的变量。

引用类型的关键特性

  1. 共享与复制:当引用类型的变量被赋值给另一个变量时,实际上复制的是引用(内存地址),而不是数据本身。这导致两个变量指向同一数据,任何一方的修改都会影响到另一方。

  2. 动态类型与dynamic关键字:虽然大多数时候我们倾向于使用静态类型以获得编译时的类型安全,但C#提供了dynamic关键字,允许在编译时不确定类型的情况下操作对象。这意味着类型检查延迟到了运行时,提供了更大的灵活性,但可能牺牲了一定程度的安全性。

  3. 对象与类:类是引用类型的典型示例。一个类定义了一组属性和方法,而类的实例(对象)则是这些定义的具体化。通过创建类的实例,你可以封装数据和行为,实现面向对象编程的核心理念。

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

namespace _3_引用数据类型
{
internal class Program
{
static void Main(string[] args)
{

深色版本
        // C#中的变量的类型分为两大类
        // 值类型(基本数据类型) 和 引用数据类型
        // 值类型的变量储存的是值本身
        // 引用类型的变量储存的是数据的内存地址


        // string  字符串类型,用于储存多个字符
        string name = "蔡徐坤";
        string remark = "今天去隔壁老王家了,老王出差了";
        
        // 转义字符   \n 换行   \t tab   \r
        string test = "1\n2\t3\n双引号";
        Console.WriteLine("test: {0}", test);

        // 字符串中一些字符不能直接使用的, \n \t
        // 使用转义字符 对\n再次进行转义    \ 表示 转义 后面的字符
        // \n  转义n   \t 转义t     \\n \有特殊含义,转义    第一个\会去转义第二个\
        string test1 = "a\\nb\\tc";
        Console.WriteLine(test1);


        // ""    @"" 创建的字符串可以不用转义字符就可以显示这些特殊字符
        string test2 = @"12\n34\t5";
        Console.WriteLine("test2: {0}", test2);


        // $""  插值的   往字符串中插入变量
        string fav = "唱跳rap打篮球";
        string test3 = $"我的名字是{name},爱好是{fav},备注{remark}";
        Console.WriteLine(test3);

        // 我的名字是张三,所以他是张三的儿子,他的儿子是张三的孙子
        string n1 = "张三", n2 = "儿子";
        Console.WriteLine("我的名字是{0},所以他是{0}的{1},他的{1}是{0}的孙子", n1, n2);

        Console.WriteLine($"我的名字是{n1},所以他是{n1}的{n2},他的{n2}是{n1}的孙子");




        // object 类型 (对象类型)
        // 1、object是所有类型的父类型,也就是说,object可以储存任意类型的数据
        // object是C#中 所有数据类型的 的终极类型
        object a = 1;
        object b = "sss";
        object c = 2.2;


        // 2、我们可以定义自己的对象(自己的类),储存一系列关联的数据
        // 对象的创建需要依赖于 类
        // 对象和类的关系
        // 类:对一系列对象的描述,是一个框架   人类 鱼 鸟 
        // 对象:是一个类的具体的表现,我们也可以把对象称之为类的实例对象   张三  李四  王五  马六

        // 创建一个Wife类型的对象(实例对象)   w1是Wife类的实例对象   string s1 = "123";  s1是string的实例对象
        Wife w1 = new Wife();
        // 使用 对象.成员名  的方式  操作对象
        w1.Name = "冰冰";
        w1.Age = 18;
        w1.HairColor = "黑色";

        Console.WriteLine($"我的大老婆叫{w1.Name}, 今年{w1.Age}岁, 拥有{w1.HairColor}的头发");



        Wife w2 = new Wife();
        // 使用 对象.成员名  的方式  操作对象
        w2.Name = "诗诗";
        w2.Age = 30;
        w2.HairColor = "黄色";

        Console.WriteLine($"我的二老婆叫{w2.Name}, 今年{w2.Age}岁, 拥有{w2.HairColor}的头发");


        // dynamic 动态类型  储存任意类型的值
        // 类型的校验 在运行期间进行(编译器中不会报错的,运行之后才会报错)
        dynamic d1 = 123;
        d1 = "123";
        d1 = true;
        d1 = 'c';
        d1 = true;

        // Console.WriteLine(d1 * 100);



        // object 也可以储存任意类型    编译器(编译过程中)中就会报错,运行不了的
        object o1 = true;
        // Console.WriteLine(o1 * 100);

    }

    static void Eat() { }

}

// namespace中使用class关键字 定义一个类, 类的名称也用大驼峰命名法(所有首字母都大写Zhang  ZhangSan)
// 小驼峰命名法(zhangSanSan)
// 类  不是对象  对象的模板
class Wife
{
    // 类内部的东西,我们称之为 类的成员
    // 声明一个类成员的格式(变量)   public 成员类型 成员名称    一般也是用大驼峰命名法
    public string Name;
    public int Age;
    public string HairColor;
    }
}

示例解析

在给出的代码示例中,Wife类是一个典型的引用类型示例。每个Wife对象(如w1w2)都包含了独立的内存空间来存储各自的属性(如NameAgeHairColor),而这些对象变量实质上是存放对象地址的引用。这允许我们通过不同的变量名操作相同的对象,或者创建多个不同状态的对象实例。

object类型:万物之基

object是C#中所有类型的最终基类,意味着任何类型的实例都可以被当作object类型来处理。这种泛型特性使得object成为在不确定具体类型时存储数据的通用容器。然而,使用object类型时需谨慎,因为这样做会失去静态类型检查的优势,且频繁地进行类型转换(如使用asis关键字)可能降低代码效率和清晰度。

dynamic类型的灵活与风险

dynamic类型是C# 4.0引入的,它允许你晚绑定(运行时绑定)到实际数据类型,从而实现更灵活的编程模式。示例代码中的d1变量展示了dynamic类型的用法,它可以轻松地在不同类型间切换。但值得注意的是,过度使用dynamic可能导致难以追踪的错误,因为类型错误仅在运行时而非编译时被发现。

结语

引用类型在C#中扮演着至关重要的角色,它们支撑起面向对象编程的复杂架构,赋予了程序高度的灵活性和扩展性。理解引用类型的工作原理,合理运用类、接口、委托等高级特性,对于构建健壮、高效的应用程序至关重要。掌握它们,你将能够设计出既强大又易于维护的代码结构,推动你的C#技能达到新的高度。

 

 

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值