C#知识学习-021(文字关键字)

目录

1.null关键字

1.1核心概念

1.2举例

1.2.1空引用异常

1.2.2正常赋值

[1.2.3空字符串 vs 空引用](#1.2.3空字符串 vs 空引用)

1.2.4值类型设置空

2.default关键字

2.1switch语句中的"默认分支"​

2.2default运算符/文本

2.3泛型方法/接口中的"默认类型值"(default(T))


1.null关键字

1.1核心概念

  • 简单说:null就是"什么都没有"、"空"、"没有指向任何东西"

    在程序里,null是一个特殊的字面值(就像数字 5或文字 "你好"一样),但它不代表任何实际存在的对象或数据

  • 它主要用在引用类型的变量上(比如你创建的一个类的实例,或者字符串 string

用个比喻:

  • 想象你有一个遥控器 (这个遥控器代表一个变量

  • 这个遥控器可以控制一台电视 (这台电视代表一个对象 ,比如MyClass的一个实例,或一个字符串)

  • null就相当于这个遥控器没有对准任何一台电视

    它存在(你有遥控器),但它现在控制不了任何东西

  • 如果你对着一个 null遥控器(变量)按按钮(调用方法 .MyMethod()),什么也不会发生或者程序会报错(就像你对着空气按按钮)

1.2举例

1.2.1空引用异常

复制代码
class Program
{
    class MyClass
    {
        public void MyMethod() 
        {
            Console.WriteLine("MyMethod is ok");
        }
    }
    static void Main()
    {
        MyClass mc;     // 声明了一个遥控器,但还没对准任何电视(未赋值)
        mc = null;      // 把遥控器设置为"空频道"(指向 null)

        mc.MyMethod();  // 报错:NullReferenceException (空引用异常)
    }
}

1.2.2正常赋值

复制代码
static void Main()
{
    MyClass mc;         // 声明了一个遥控器,但还没对准任何电视(未赋值)
    mc = new MyClass(); // 创建了一台新的 MyClass "电视",并把遥控器 mc 对准它
    mc.MyMethod();
}

1.2.3空字符串 vs 空引用

复制代码
class Program
{
    static void Main()
    {
        //空字符串 vs 空引用 (null)
        string s = null;
        string t = string.Empty; // 字符串 t 指向一个真正的"空字符串"对象 (一台显示空白屏幕的电视)
        // 重要区别:s 是"没有电视",t 是"有一台电视,但屏幕是黑的(里面没字符)"

        //比较空字符串和 null
        Console.WriteLine($"t.Equals(s) is {t.Equals(s)}"); // 值为 False
        Console.WriteLine($"Empty string {(s == t ? "equals" : "does not equal")} null string"); // 值为 False
        Console.WriteLine($"null == null is {null == null}"); // 值为 True
    }
}

1.2.4值类型设置空

复制代码
int i = null; // 错误!编译器不允许

若需要值类型也能表示"没有值"(比如数据库里一个"年龄"字段,用户可能没填,这时候年龄就是"未知",不是 0)。但普通值类型(如 int)不能设为 null(因为 null是"没有引用对象",而值类型本身就有值)。就可以使用**"可空值类型"**(Nullable Value Types)

使用:int? i = null;

  • 普通 int像一个"只能装整数的盒子"(必须装一个数,默认装 0);
  • int?像一个"升级版盒子",既可装整数(比如 5),也可什么都不装(用 null表示"空盒")

|--------------|---------------------------|------------------------------------------|
| 特性 | 普通 int(不可空值类型) | int?(可空值类型,即 Nullable<int>) |
| 能否存储 null? | ❌ 不能 (int i = null编译报错) | ✅ 能(int? i = null合法) |
| 默认值 | 0(自动初始化为 0) | null(自动初始化为"没有值") |
| 本质 | 直接存整数 | 内部包含两个成员: HasValue(是否有值)和 Value(值本身) |

2.default关键字

2.1switch语句中的"默认分支"

作用 :当 switch的所有 case都不匹配时,执行 default分支(相当于"其他情况")。

比喻:设计一个"天气活动选择器":

  • 晴天 → 去公园

  • 雨天 → 在家看书

  • 其他天气(阴天、雪天等)→ 用 default分支处理(比如"待定")

复制代码
class Program
{
    static void Main()
    {
        int weather = 3; // 假设 1=晴,2=雨,3=阴(其他情况)

        switch (weather)
        {
            case 1:
                Console.WriteLine("去公园玩");
                break;
            case 2:
                Console.WriteLine("在家看书");
                break;
            default: // 所有 case 都不匹配时(这里 weather=3),执行这里
                Console.WriteLine("天气待定,先宅家");
                break;
        }
        // 输出:天气待定,先宅家
    }
}

关键点

  • defaultswitch的"保底选项",可以放在任何位置(但通常放最后)。

  • 如果所有 case都匹配不到,且没有 default,则什么都不执行。

2.2default运算符/文本

作用获取任意类型的"默认值"(就像给变量"归零"或"清空")。

先理解"类型的默认值":

  • 值类型:默认值是"零值"(比如 int是 0,boolfalseDateTime0001-01-01

  • 引用类型:默认值是 null(空引用,不指向任何对象)

两种写法:

  • default 运算符(显式指定类型):default(类型名)
    例:default(int)→ 0,default(string)→ null

  • default 文本(C# 7.1+ 简化写法):直接写 default
    例:default等价于 default(类型名)(编译器会根据上下文推断类型)

    // 用 default 运算符获取不同类型默认值
    int numDefault = default(int); // 0(int 的默认值)
    bool boolDefault = default(bool); // false(bool 的默认值)
    string strDefault = default(string); // null(string 是引用类型,默认值 null)
    MyClass objDefault = default(MyClass); // null(自定义类的默认值)

    // 用 default 文本(更简洁,编译器自动推断类型)
    int num = default; // 0(推断为 int)
    string s = default; // null(推断为 string)
    int? nullableInt = default; // null(可空值类型 int? 的默认值也是 null)

    // 对比:不赋值 vs 用 default(效果一样,但 default 更明确)
    int a; // 未赋值,编译器可能警告"未初始化"
    int b = default; // 显式赋值为 0(安全,无警告)

关键点

  • default是"类型安全的归零":不管什么类型,它都能给出正确的默认值(值类型给零值,引用类型给 null)。

  • 常用于初始化变量、泛型中获取默认值

2.3泛型方法/接口中的"默认类型值"(default(T))

作用 :在泛型中,当不确定类型 T是值类型还是引用类型时,用 default(T)获取它的默认值(避免硬编码)。

背景 :泛型(如 List<T>)可以存任何类型,但你不知道 Tint(值类型)还是 string(引用类型),直接写 0null可能出错。这时用 default(T)就安全了------它会自动根据 T的类型返回对应默认值

复制代码
// 定义一个泛型方法,返回 T 的默认值
public static T GetDefaultValue<T>()
{
    return default(T); // 用 default(T) 获取 T 的默认值
}

// 测试:不同类型调用这个方法
int intVal = GetDefaultValue<int>();       // 0(int 的默认值)
MyClass objVal = GetDefaultValue<MyClass>(); // null(自定义类的默认值)
int? nullableVal = GetDefaultValue<int?>();  // null(可空值类型的默认值)

总结:

|-----------------------|-----------------------------|
| 用法场景 | 作用 |
| switch 语句的 default 分支 | 处理"所有 case 都不匹配"的其他情况 |
| default 运算符/文本 | 获取任意类型的默认值(值类型零值,引用类型 null) |
| 泛型中的 default(T) | 在泛型中安全获取类型 T 的默认值 |

学到了这里,咱俩真棒,记得按时吃饭(麻瓜打工,近期真的好忙碌~)

【本篇结束,新的知识会不定时补充】

感谢你的阅读!如果内容有帮助,欢迎 ​​点赞❤️ + 收藏⭐ + 关注​​ 支持! 😊

相关推荐
minji...2 小时前
Linux 线程同步与互斥(二) 线程同步,条件变量,pthread_cond_init/wait/signal/broadcast
linux·运维·开发语言·jvm·数据结构·c++
zhangzeyuaaa2 小时前
Python 中的 Map 和 Reduce 详解
开发语言·python
chase。2 小时前
【学习笔记】让机器人“边想边动”——实时动作分块流策略的执行方法
笔记·学习·机器人
游乐码2 小时前
c#HashTable
开发语言·c#
炽烈小老头2 小时前
【每天学习一点算法 2026/04/08】阶乘后的零
学习·算法
小白学大数据2 小时前
Scrapy 分布式爬虫:大规模采集汽车之家电车评论
开发语言·分布式·爬虫·scrapy
HSunR2 小时前
java springboot3 后端 基础框架
java·开发语言
Mr_Xuhhh2 小时前
算法刷题笔记:从滑动窗口到哈夫曼编码,我的算法进阶之路
开发语言·算法
七夜zippoe2 小时前
Java技术未来展望:GraalVM、Quarkus、Helidon等新趋势探讨
java·开发语言·python·quarkus·graaivm·helidon