05-C#

【Unity 05】C# 基础算法 PS:本系列笔记将会记录我此次在北京学习Unity开发的总体过程,方便后期写总结,笔记为天更。 笔记内容均为 自己理解,会有遗漏处,不保证每个都对,仅供参考 基础算法会陆续更新,遇到就会更新 Part 1 排序算法: 所采用的数组均为: int[] array_ListA = { 12, 15, 13, 0, 9, 4, 8, 11, 33, 22, 12 }; //定义一个一维数组 冒泡排序:... 阅读详情

C#.Net-Lambda与LINQ-学习笔记

一、Lambda 表达式的演变

Lambda 表达式是委托的语法糖,本质上是匿名方法的简化写法,编译器最终会将其编译为委托实例。

.NET 1.0/1.1 — 命名方法委托

public delegate void NoReturnWithPara(int x, string y);

NoReturnWithPara method = new NoReturnWithPara(Study);
method.Invoke(123, "Richard");

private void Study(int id, string name)
{
    Console.WriteLine($"{id} {name} 学习.Net高级班");
}

缺点:方法必须单独定义,代码分散,不够内聚。

.NET 2.0 — 匿名方法

引入 delegate 关键字,方法体可以直接内联,并且能访问外部局部变量(闭包):

int i = 0;
NoReturnWithPara method = new NoReturnWithPara(delegate (int x, string y)
{
    Console.WriteLine(x);
    Console.WriteLine(y);
    Console.WriteLine(i); // 可以访问外部变量
});

.NET 3.0 — Lambda 表达式

用 => 操作符(读作 "goes to")替代 delegate 关键字,语法更简洁:

// 完整形式
NoReturnWithPara method = (int x, string y) =>
{
    Console.WriteLine(x);
    Console.WriteLine(y);
};

// 省略参数类型(编译器自动推导)
NoReturnWithPara method = (x, y) =>
{
    Console.WriteLine(x);
};

Lambda 简化规则

规则从上到下依次叠加:

// 方法体只有一行,省略大括号
NoReturnWithPara method1 = (x, y) => Console.WriteLine(x);

// 只有一个参数,省略小括号
Action<string> method2 = s => Console.WriteLine(s);

// 有返回值且只有一行,省略 return
Func<string> func1 = () => "hello";
Func<int, string> func2 = i => i.ToString();

二、匿名类型与 var

匿名类型的三种接收方式

// object:无法访问属性,编译报错
object model = new { Id = 1, Name = "张三" };
// model.Id  // 编译错误

// dynamic:运行时检查,可以访问,但没有编译期类型安全
dynamic dModel = new { Id = 1, Name = "张三" };
Console.WriteLine(dModel.Id); // 运行时才检查

// var:编译器推导类型,推荐用法
var model = new { Id = 1, Name = "张三" };
Console.WriteLine(model.Id); // 编译期就能检查

var 的特点

  • 必须在声明时初始化,编译器根据右侧值推导类型
  • 不能赋值为 null(无法推导类型)
  • 不能作为方法参数或返回值类型
  • 匿名类型的属性是只读的,不能修改
var i = 13;        // 推导为 int
var s = "Richard"; // 推导为 string
// var x = null;   // 编译错误

三、扩展方法

扩展方法允许在不修改原类型源码的情况下为其添加新方法,是 LINQ 的实现基础,也是遵循开闭原则的常用手段。

三要素

  1. 定义在静态类中
  2. 方法本身是静态方法
  3. 第一个参数前加 this 关键字,表示被扩展的类型
public static class MethodExtension
{
    // 为 Student 扩展方法
    public static void StudyFramework(this Student student)
    {
        Console.WriteLine($"{student.Id} {student.Name} 学习架构课程");
    }

    // 为 int 扩展方法
    public static string IntToString(this int i)
    {
        return i.ToString();
    }

    // 为 string 扩展方法,带默认参数
    public static string FormatString(this string oldString, int length = 5)
    {
        if (string.IsNullOrWhiteSpace(oldString))
            return string.Empty;
        else if (oldString.Length <= length)
            return oldString;
        else
            return $"{oldString.Substring(0, length)}...";
    }
}

调用时像实例方法一样使用:

Student student = new Student { Id = 1, Name = "张三" };
student.StudyFramework();

int num = 100;
string s = num.IntToString();

string text = "这是一段很长的文本内容";
string result = text.FormatString(10); // "这是一段很长的文..."(取前10个字符加省略号)

注意事项

  • 可以扩展任何类型,包括密封类和值类型
  • 如果类型本身有同名方法,优先调用类型自身的方法,扩展方法不会覆盖它
  • 扩展泛型类型(如 this T t)会影响所有类型,侵入性强,慎用
  • 扩展 object 会影响所有类型,不推荐
  • 调用方需要引入扩展方法所在的命名空间

四、LINQ 基础用法

LINQ 有两种等价语法,可以混用:

// 扩展方法语法(Lambda 风格)
var list1 = studentList.Where(s => s.Age < 30);

// 查询表达式语法(类 SQL 风格)
var list2 = from s in studentList
            where s.Age < 30
            select s;

Where — 条件过滤

var result = studentList.Where(s => s.Age < 30);

Select — 投影

将数据转换为新的形状,可以组合字段、计算属性:

var result = studentList
    .Where(s => s.Age < 30)
    .Select(s => new
    {
        IdName = s.Id + s.Name,
        ClassName = s.ClassId == 2 ? "高级班" : "其他班"
    });

OrderBy / ThenBy / OrderByDescending — 排序

var result = studentList
    .OrderBy(s => s.Id)              // 升序
    .ThenBy(s => s.Name)             // 多字段排序(第二优先级)
    .OrderByDescending(s => s.Age);  // 降序

Skip / Take — 分页

必须先排序再分页,否则结果不稳定:

var result = studentList
    .OrderBy(s => s.Id)
    .Skip(10)   // 跳过前 10 条
    .Take(5);   // 取 5 条

GroupBy — 分组

// 查询表达式
var result = from s in studentList
             where s.Age < 30
             group s by s.ClassId into sg
             select new
             {
                 Key = sg.Key,
                 MaxAge = sg.Max(t => t.Age)
             };

// 扩展方法等价写法
var result = studentList
    .Where(s => s.Age < 30)
    .GroupBy(s => s.ClassId)
    .Select(sg => new
    {
        Key = sg.Key,
        MaxAge = sg.Max(t => t.Age)
    });

GroupBy 也支持多字段分组:group s by new { s.ClassId, s.Age }

Join — 连接查询

内连接(只返回两边都匹配的数据):

// 查询表达式,连接条件必须用 equals,不能用 ==
var result = from s in studentList
             join c in classList on s.ClassId equals c.Id
             select new { s.Name, c.ClassName };

// 扩展方法等价写法
var result = studentList.Join(
    classList,
    s => s.ClassId,
    c => c.Id,
    (s, c) => new { s.Name, c.ClassName }
);

左连接(左边全部保留,右边没有匹配时为 null):

var result = from s in studentList
             join c in classList on s.ClassId equals c.Id
             into scList
             from sc in scList.DefaultIfEmpty()  // 关键:DefaultIfEmpty 保留左边无匹配的行
             select new
             {
                 s.Name,
                 ClassName = sc == null ? "无班级" : sc.ClassName
             };

右连接只需把左右两个数据源交换位置即可。


五、LINQ 实现原理

从重复代码到 LINQ 的演变思路

假设要对集合做多种条件过滤,最原始的写法是每种条件写一个方法:

// 过滤年龄 < 30
public static List<Student> FilterByAge(List<Student> list)
{
    var result = new List<Student>();
    foreach (var item in list)
        if (item.Age < 30) result.Add(item);
    return result;
}

// 过滤名称长度 > 2
public static List<Student> FilterByName(List<Student> list)
{
    var result = new List<Student>();
    foreach (var item in list)
        if (item.Name.Length > 2) result.Add(item);
    return result;
}

这两个方法的结构完全一样,唯一不同的是判断条件。把"不变的逻辑"(循环、添加)留在方法里,把"可变的逻辑"(判断条件)通过委托传入,就得到了 LINQ 的雏形:

public static List<T> CustomWhere<T>(this List<T> source, Func<T, bool> predicate)
{
    var result = new List<T>();
    foreach (var item in source)
    {
        if (predicate.Invoke(item))
            result.Add(item);
    }
    return result;
}

// 使用
var result = studentList.CustomWhere(s => s.Age < 30);

这就是 LINQ 的设计本质:不变的逻辑封装在方法内,可变的逻辑通过委托传递,再用扩展方法提供链式调用,用泛型支持任意类型。

yield 与延迟执行

上面的 CustomWhere 返回 List<T>,意味着调用时就立即执行了所有判断,并把结果全部存入内存。

改用 yield return 配合 IEnumerable<T> 返回值,可以实现延迟执行:

public static IEnumerable<T> CustomWhereIEnumerable<T>(
    this IEnumerable<T> source,
    Func<T, bool> predicate)
{
    foreach (var item in source)
    {
        if (predicate.Invoke(item))
            yield return item; // 符合条件就立即返回,不符合继续往后判断
    }
}

yield return 的效果:

  • 调用方法时不会立即执行方法体
  • 只有在外部遍历(foreach)时,才会一条一条地执行
  • 每次 yield return 后,方法暂停,等待下一次迭代再继续
  • 这种机制叫做状态机,由编译器自动生成
IEnumerable<Student> query = studentList.CustomWhereIEnumerable(s => s.Age < 30);
// 此时方法体尚未执行

foreach (var item in query)
{
    Console.WriteLine(item.Name); // 遍历时才真正执行
}

延迟执行的实际影响

var query = numbers.Where(n => n > 2); // 未执行

numbers.Add(10); // 修改原始数据

foreach (var item in query) // 此时执行,会包含新加的 10
{
    Console.WriteLine(item);
}

立即执行的方法(调用后查询立刻完成,结果固化):

  • ToList(), ToArray(), ToDictionary()
  • Count(), Sum(), Average(), Min(), Max()
  • First(), FirstOrDefault(), Single(), Any()

六、IEnumerable vs IQueryable

对比项IEnumerable<T>IQueryable<T>
命名空间System.Collections.GenericSystem.Linq
执行位置内存(客户端)数据源端(如数据库)
条件参数类型Func<T, bool>Expression<Func<T, bool>>
典型场景LINQ to ObjectsLINQ to SQL / EF
性能特点先把数据全部加载到内存再过滤把条件翻译成 SQL,在数据库端过滤
// IEnumerable:全表加载到内存,再在内存中过滤
IEnumerable<Student> q1 = dbContext.Students
    .AsEnumerable()
    .Where(s => s.Age > 20);

// IQueryable:生成 SQL "WHERE Age > 20",数据库端过滤
IQueryable<Student> q2 = dbContext.Students
    .Where(s => s.Age > 20);

七、LINQ to Everything

LINQ 的设计思想不局限于内存集合,可以扩展到任何数据源:

  • LINQ to Objects:查询内存中的对象集合(IEnumerable<T>)
  • LINQ to SQL:查询数据库,条件被翻译为 SQL 语句
  • LINQ to XML:查询和操作 XML 文档
  • LINQ to Entities:Entity Framework 的查询接口
  • LINQ to Redis / Cache:查询缓存数据源

核心思想都一样:把固定的处理逻辑封装在内部,把可变的查询条件通过委托(或表达式树)传入,整合成统一的查询接口。

C# Modbus通信从入门到精通(26)——Modbus TCP(0x05功能码与C#代码实现) 本文详细介绍了ModbusTCP协议中0x05写单个线圈功能码的原理、发送报文、返回报文,由高级工程师多年经验总结而成,绝对干货! 阅读详情

相关推荐

C# Modbus通信从入门到精通(7)——Modbus RTU(0x05功能码与C#代码实现)

本文详细介绍了ModbusRTU协议中0x05写单个线圈功能码的原理、发送报文、返回报文,由高级工程师多年经验总结而成,绝对干货!

qq_34059233的博客 2555

.net高级技术——lambda表达式

自C#3.0开始,就可以使用一种新语法把实现代码赋予委托:lambda表达式。只要有委托参数类型的部分,就可以使用Lambda表达式。 下面先来看几个例子 static void Main(string[] args) { Action<int> a1 = delegate (int n) { n = n + 1; };//最原始的写法 ...

qq_33407246的博客 2657

C# Modbus通信从入门到精通(17)——Modbus ASCII(0x05功能码与C#代码实现)

本文详细介绍了ModbusASCII协议中0x05写的单个输出线圈功能码的原理、发送报文、返回报文、C#代码实现,由高级工程师多年经验总结而成,绝对干货!

qq_34059233的博客 1029

[.NET/C#] 委托与 Lambda 表达式, 语句详解

在 C# 中, 委托与 Lambda 是最常用的功能之一, 诸如多线程, 可迭代类型的 LINQ 操作, 回调, 都是借助委托完成的. 它在 C 语言对应的是函数指针, 在 C++ 中对应的是 `std::function`

诺尔的博客 1358

普通开普勒式望远镜光学设计1-初始结构设计选型与物镜像差校正

普通开普勒式望远镜光学设计1: 完成了望远镜的总体结构设计,确定其物镜与目镜的初始结构选型,使用Zemax软件完成望远镜的双胶合物镜的像差校正。

faust_cao的博客 1万+

基于Stigmergy的团队LLM wiki协作机制与FastAPI工程实践

大语言模型驱动的知识管理正在改变个人笔记与团队文档的维护方式,但当多人共同维护一个维基时,如何避免版本覆盖、上下文丢失和幻觉污染成为核心挑战。Stigmergy这一源自生物学的协作机制提供了新思路:通过共享环境中的痕迹(如评论、标记、修订历史)实现异步协作,无需实时沟通或中心协调者。本文将原理落地为可工程化的系统,设计Page、Revision、Trace三大实体,并结合向量索引与LLM审查流程,最终用FastAPI与SQLite搭建一个最小可运行原型。从白蚁筑巢到团队知识库,Stigmergy让每个参与者

weixin_34174322的博客 364

(十).netLambda和Linq表达式

Lambda和Linq表达式

lwy 865

深入了解神经网络:构建人工智能的基石

这篇博客将为您解释神经网络的构造,让您能够理解这个令人着迷的领域的基本工作原理。神经网络是人工智能领域的关键技术,它们的构造基于神经元的灵感,并结合了数学、统计和机器学习的原理。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。较好的方法就是预先设定几个可选值,通过切换这几个值来看整个模型的预测效果,选择效果最好的值作为最终选择。:这是神经网络的核心部分,包含多个层次的神经元。、神经网络结构图中的拓扑与箭头代表着预测过程时数据的流向,跟训练时的数据流有一定的区别;

AI_dataloads的博客 2万+

.NET笔记系列:LAMBDA表达式常用写…

这里主要是将数据库中的常用操作用LAMBDA表达式重新表示了下,用法不多,但相对较常用,等有时间了还会扩展,并将查询语句及LINQ到时也一并重新整理下: 1.select语句:books.Select(p=>new { p.Title, p.UnitPrice, p.Author});//需用匿名方式 2.where语句:books.Where(p=>p.UnitPrice==100&&p.Tit

Mr.Vincent with .NET 954

解决vLLM安装卡在vllm-nccl-cu12依赖项的实战指南

本文提供了解决vLLM安装过程中卡在vllm-nccl-cu12依赖项的详细指南。通过分析CUDA版本兼容性问题,介绍了三种实用解决方案:安装指定版本vLLM、手动安装nccl-cu12依赖以及升级CUDA到12.x版本,并特别针对离线环境提供了安装建议,帮助开发者顺利完成vLLM的安装部署。

weixin_29098367的博客 513

基于boot + 双app升级方案

基于boot+双app的升级方案

weixin_44654285的博客 4514

.NET学习笔记(五)----Lambda、Linq、匿名类(var)、扩展方法

一、Lambda前世今生 Lambda的表达式:()=>{} Lambda的本质:一个匿名函数,在底层,会在一个尖括号(<>)类中,生成带有名称的方法。 二、匿名类

qq_37739112的博客 761

Unity 热更 之 【HybirdCLR】+【YooAsset】 [安卓 Android端] [代码 + 资源热更] 功能的 简单实现演示

Unity热更有很多方案,各种lua热更,ILRuntime等,这里介绍的是YooAsset+HybridCLR的热更方案,HybridCLR负责更新c#代码,YooAsset负责更新资源。HybridCLR是一种创新的解决方案,专为 Unity 游戏开发中的热更新需求设计。它通过结合解释执行和 Ahead-of-Time (AOT) 编译技术,为跨平台的游戏开发提供了一种高效的热更新机制。原生C#热更新体验,开发工作流与传统Unity C#开发几乎相同,零学习和使用成本。

仙魁XAN 3866

C#之HC-05蓝牙配对助手

#为了快速便捷地配置HC-05蓝牙模块,笔者是用哪个C#写了一个蓝牙配置助手上位机。本上位机本质是十分简单的,就是通过串口发送AT指令给蓝牙模块来配置。 HC-05蓝牙配置助手界面 HC-05蓝牙配置助手使用方法 首先选择蓝牙模块所在的端口,再点击打开串口,依次填入蓝牙名称、波特率、密码、主从,再点击测试指令,若收到OK,则可以点击开始配置,若没有收到OK,请检查蓝牙是否进入AT模式。在点击开始配置后,若收到5个OK回复,即说明此次配置成功。进行第二个蓝牙模块配置时,只需更改主从即可。点击帮助,可进入帮

学无止境 3219

【示波器专题】无源探头的常用附件

使用探头进行测试,我们不仅要知道探头的原理,还需要了解探头的常用附件及其使用方式,这样才能在尽可能在测试中提高效率且减少出错的概率

一点硬件 692

微信小程序 - 实现身份证OCR识别人像面与国徽面并提取字段信息,详解从手机相册选取或打开摄像头拍照上传身份证正反面图片ocr文字识别数据填充表单(提供免费纯前端ocr识别插件+百度OCR识别API)

微信小程序身份证识别,微信小程序身份证拍照、上传并OCR识别,微信小程序实现OCR扫描识别,微信小程序识别身份证免费插件,微信小程序实现身份证识别功能。ocr识别插件。微信身份证拍照后进行ocr识别,微信小程序OCR扫描识别身份证,OCR身份证实名认证+图片上传+拍照上传图片,微信小程序之身份证照片正反上传,小程序OCR身份证识别,微信小程序实现文字识别-ocr插件,微信小程序利用百度AI实现扫描身份证获取信息功能,基于微信小程序OCR插件实现身份证拍照、上传并OCR识别的示例demo,将上传的照片传到服务

🏆 前端领域优质创作者 8133

c# 蓝牙虚拟串口_两个HC-05蓝牙模块互相绑定构成无线串口模块

关于HC-05蓝牙模块蓝牙模块BT-HC05模块是一款高性能的蓝牙串口模块。可用于各种带蓝牙功能的电脑、蓝牙主机、手机、PDA、PSP等智能终端配对。宽波特率范围4800~1382400,并且模块兼容单片机系统。当主从模式两个蓝牙模块配对成功后,可以简单的,更改为无线的蓝牙,让您设备或者产品更高级,更时尚。 可以很容易的使用提供的蓝牙手机软件工作模式HC-05嵌入式蓝牙串口通讯模块具有两种工作模式...

weixin_36383467的博客 777

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

c# 05版本的文件上传

在05版本的c#中,组件丰富,例如:fileupload,只需要在webform中添加该组件和一个button,则在button中可以加入代码 if (FileUpload1.PostedFile.ContentLength == 0)//判断选取对话框选取的文件长度是否为0 { Label1.Text = "你还没有选择文件! :)"; ...

weixin_30883271的博客 84

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C#基础05

C#基础05 Stream(流) 之前学过的File类一般只能用于处理较小的文件(它读取的文件时要全部读取完并且是存储在内存中之后再处理数据,这会造成数据处理非常慢),而Stream类在处理文件时则时读取一些就处理一些,这样占用 的内存资源等会小很多处理数据也会快很多,所以适合处理文件数据较大的文件。 Stream类的具体的简单使用: 创建继承自Stream类的FileStream类的对象,这种方法不是特别推荐,(Stream fs = new FileStream();更好) 其中对于上面的这种构造

Echo_Wish 210

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C#学习Day05

Console.WriteLine("文件名:"+fileName+",扩展名:"+fileExtension);Console.WriteLine("后缀:" + posnames[i] + "数量为:" + count[i]);"女" : "男";//true为女,false为男。Console.WriteLine(string.Format("{0}级{1}班",Grade,Class));string path = "E:\\学习\\dj\\C#课程\\day05\\课堂笔记.docx";

ycb1746147428的博客 1775

C#入门记录05

这一部分 主要记录 C#中字符 和 字符串的相关操作 直接看代码吧,代码比较清晰 /* 2020-3-5 09:39:13 C# 中的字符类型 Char在C#中表示一个Unicode字符 关于字符类型判断的函数 IsLetter 判断是否为字母 IsDigit 判断是否为数字 IsLetterOrDigit 判断是否为数字或字母 IsLow...

JamesWu9527的博客 309

C#语言基础速成Day05

C#(发音为“C Sharp”)是一种现代的、面向对象的编程语言,由微软开发,作为其 .NET 框架的一部分。面向对象编程(OOP)是一种编程范式,基于“对象”和“类”的概念,旨在提高代码的可重用性、可扩展性和可维护性。C#的面向对象是及其重要的部分,只有掌握了面向对象的思想才算掌握了精髓部分。同时,C#提供了丰富的特性和功能,使开发者能够编写高效、可维护的代码。通过理解和应用这些特性,我们可以大大提高自己的编程能力和项目的质量。

2301_79175212的博客 1094

五、C# 05运算符

赋值运算符 = 将其右操作数的值赋给变量、或由其左操作数给出的元素。赋值表达式的结果是分配给左操作数的值。右操作数类型必须与左操作数类型相同,或可隐式转换为左操作数的类型。简单的赋值运算符,把右边操作数的值赋给左边操作数C = A + B 将把 A + B 的值赋给 C+=加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数C += A 相当于 C = C + A-=减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数C -= A 相当于 C = C - A*=

m0_60981950的博客 1509

c#05数组

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _05 { class Program { static void Main(string[] args) { #r...

lxq5211314的博客 456

C#作业05 线程

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Thread...

qq_44495672的博客 358
上一篇: 03-C#
下一篇: 01-C#.Net-泛型-学习笔记
似水明俊德
博客等级 码龄8年 247粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值