[C#基础知识] ReadOnly关键字修饰的变量可以修改,只是不能重新分配

开关电源EMC整改案例-辐射骚扰 2.4.1 获得原始数据。同样的分析可以应用在差模电流的情况, 唯一不同的是, 两根导线的磁场分布是相反的, 磁 场互相抵消, 由于导线中的电流大小相等, 产生的磁场 H 大小相同, 在互相靠近的情况下, 在磁 环内的两个感应磁场大小相同、方向相反, 因此合成之后的感应磁场 B 几乎为 0,对任意一根导 线而言,相当于是一段“无感导线”,对差模电流不会产生任何抑制作用。众所周知, 共模电感的匝数越多, 感量越大, 按道 理来说对共模干扰电流的抑制也会越强烈,对抗辐射 也越有利,然而事实真的如此吗? 阅读详情

MSDN 官方的解释

readonly 关键字是可以在字段上使用的修饰符。当字段声明包括 readonly 修饰符时,该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数中.

很多初学者看完书就会认为,readonly修饰的变量在以后是不能修改的,在以后的开发中从不对ReadOnly的变量进行修改操作,形成思维定势,这个观念是错误的。
首先要明确一点:更改!=重新分配(赋值)

对于简单类型(如int),更改是等于重新赋值,因为默认操作符只有=, 但于对于复杂类型,就不一定了。

例如:

对于class类型,修改其字段属性值。

对于集合类型,增加,移除,清空内容。

我们经常在微软的代码中发现readonly的如下类似的用法:

public interface IA { }
public class A1 : IA { }
public class A2 : IA { }

public static class AContainer
{
    private static readonly Dictionary<string, IA> Items = new Dictionary<string, IA>();
    public static Dictionary<string, IA> As{ get { return Items; } }
}

然后在外部可以修改AContainer

class Program
{
    static void Main()
    {
        Console.WriteLine(AContainer.As.Count);
        AContainer.As.Add("A1", new A1());
        Console.WriteLine(AContainer.As.Count);
        AContainer.As.Add("A2", new A2());
        Console.WriteLine(AContainer.As.Count);
        // we can remove all the item of the collection
        AContainer.As.Clear();
        Console.WriteLine(AContainer.As.Count);
        Console.ReadKey();
    }
}

输出:
在这里插入图片描述
结论:

可以在外部(非声明和构造函数)对readonly的变量进行修改内容操作。

微软示例和开源代码中用的一种开发扩展的方式就是使用静态的ReadOnly集合容器类,在其中包括默认的实现,然后允许用户在开发中进行添加或替换。

如MVC3中的 ModelBinderProviders,ViewEngines都是类似的实现。

当然我们还可以通过非常规手段(反射,操作内存)来改变readonly的值。

例如反射

using System;
using System.Reflection;

namespace SOVT
{
    public class Foo
    {
        private readonly int bar;
        public Foo(int num) { bar = num; }
        public int GetBar() { return bar; }
    }

    class Program
    {
        static void Main()
        {
            Foo foo = new Foo(123);
            Console.WriteLine(foo.GetBar());
            FieldInfo fieldInfo = typeof(Foo).GetField("bar", BindingFlags.Instance | BindingFlags.NonPublic);
            if (fieldInfo != null)
                fieldInfo.SetValue(foo, 567);
            Console.WriteLine(foo.GetBar());
            Console.ReadKey();
        }
    }
}

输出
在这里插入图片描述

Codex 100个真实案例 - 用AI生成Blender 3D建模脚本(建模师要失业了?) 本案例将展示如何用 Codex 生成 Blender Python API(bpy)脚本,自动创建完整的 3D 模型。我们将从基础几何体开始,逐步实现布尔运算、材质设置、光照配置,最终完成一张精美桌子的 3D 建模——包括桌面、桌腿、倒角、木纹材质。还会实现参数化批量生成不同风格的桌子、渲染输出 PNG 图片、以及 360 度旋转动画。全程用自然语言驱动 Codex,让建模从"点鼠标"变成"说人话"! 阅读详情

相关推荐

Hermes Dashboard Web 端部署完整说明

通过反向代理(nginx)使用公网域名访问时,会遇到 Host 头校验、CORS 跨域、WebSocket 连接拒绝三个核心问题。本文档记录了完整的源码修改方案和部署步骤。确保 nginx 主配置加载了 WebSocket map(宝塔默认为。路径的公开访问(无需登录),其他路径仍受 Cookie 认证保护。Hermes Dashboard 默认绑定。访问站点时会先弹出浏览器密码框,输入用户。在 nginx 反向代理配置中的。环境变量动态读取允许的域名。nginx 配置中已添加。

大白菜代码的博客 800

C# 可以利用反射给只读属性赋值吗?

结论:可以 验证demo如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; usin...

weixin_33963594的博客 549

用STM32F103C8T6和TB6612驱动模块,从零搭建一辆能避障循迹的智能小车(附完整代码)

本文详细介绍了如何使用STM32F103C8T6和TB6612驱动模块从零搭建一辆能避障循迹的智能小车。内容涵盖硬件选型、电路设计、底层驱动配置以及智能行为算法实现,并附有完整代码示例,帮助开发者快速掌握嵌入式开发的核心技术。

weixin_42641741的博客 444

readonly修饰的变量可以修改,只是不能重新分配

部分开发者会认为,readonly修饰的变量是不能修改的,在以后的开发中从不对readonly的变量进行修改,形成思维定势,这个观念是错误的。 首先要明确一点:更改!=重新分配(赋值) 对于简单类型(如int),更改是等于重新赋值,因为默认操作符只有=, 但于对于复杂类型,就不一定了。 例如:对于集合类型,可以增加、移除、清空内容。 例子如下: public interface IA { } pu...

陈云佳的专栏 2203

在 Ansys CFX Pre 中配置 RGP 表的分步指南

掌握在 Ansys CFX Pre 中设置 RGP 表的技巧,以优化仿真精度和效率。

jkh920184196的博客 1664

Qt 插件开发 plugin 超详细 有源码

Qt 插件化开发框架类似于前后端的微服务的场景,授权哪个微服务则前端可以使用哪个微服务,插件就行硬件插卡一样,可以被随时删除、插入和修改,所以结构很灵活,容易修改,方便软件的升级和维护;插件主要面向接口编程,无需访问.lib文件,热插拔、利于团队开发。即使在程序运行时.dll不存在,也可以正常启动,只是相应插件功能无法正常使用而已;动态库需要访问.lib文件,而且在程序运行时必须保证.lib存在,否则无法正常启动;

q610098308的专栏 6544

修改readonly属性的值

一般情况下,readonly属性的值是无法修改的,但可以通过特殊方式修改。定义一个student的类,其中name属性为readonly类型的变量 @interface JFStudent : NSObject @property(nonatomic,copy,readonly) NSString *hisName; @property(nonatomic,copy) NSStr...

weixin_30314813的博客 995

FFmpeg魔改指南:让RTMP协议完美兼容H265的三种方法(含SRS适配技巧)

本文详细介绍了三种让RTMP协议兼容H265编码的FFmpeg魔改方案,包括基于官方补丁的标准改造、Intel的SVT-HEVC集成方案以及金山云的自定义扩展方案。文章重点解析了各方案的实现原理与适配技巧,并提供了在SRS 6.0服务器上进行深度配置和性能调优的完整实战指南,帮助开发者解决H265推流至传统RTMP服务器的兼容性问题。

weixin_29290947的博客 194

readonly的用法

readonly是C#中的一个关键字,用于声明只读字段或只读属性。在使用readonly声明后,该字段或属性的值在编译时就必须被初始化,且在程序运行时不允许被修改。使用readonly声明只读属性时,语法上有所不同,只能在属性的get访问器内返回一个已经在声明时或在构造函数中初始化的值。总之,readonly关键字可以用于声明只读字段或属性,它们可以在程序中保证某些值的不可修改,提高程序的健壮性和安全性。使用readonly声明一个只读字段时,必须在字段定义时或在构造函数中初始化它的值。

qq_44097516的博客 3167

手把手教你用DevExpress Patch工具解决VS项目中的试用弹窗问题

本文详细指导开发者使用DevExpress Patch工具解决Visual Studio项目中恼人的试用弹窗问题。核心在于理解并分步处理:首先正确应用补丁工具以绕过运行时验证,然后重点清理或重置项目中的licenses.licx文件以消除编译时验证,从而彻底根治弹窗。

weixin_29234423的博客 588

MODBUS通讯不求人:手把手教你用三菱FX2N控制士林变频器

本文详细介绍了如何使用三菱FX2N PLC通过MODBUS协议控制士林变频器,涵盖硬件连接、参数配置、程序设计及通讯优化等关键步骤。特别针对没有内置MODBUS函数块的老款PLC,提供了CRC校验和稳定数据交换的实用解决方案,帮助工程师快速实现工业自动化设备的高效通讯。

v4w5x6的博客 224

[C#基础知识] ReadOnly关键字修饰的变量可以修改,只是不能重新分配

MSDN 官方的解释 readonly 关键字是可以在字段上使用的修饰符。当字段声明包括 readonly 修饰符时,该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数中.   很多初学者看完书就会认为,readonly修饰的变量在以后是不能修改的,在以后的开发中从不对ReadOnly的变量进行修改操作,形成思维定势,这个观念是错误的。 首先要明确一点:更改!

zunguitiancheng的专栏 973

软考「系统规划与管理师(第2版)」抱佛脚|案例分析预测

规划类(系统/数据/云)+ 服务过程找错改进 + 风险应急终止三大块各备一套成熟模板,术语统一按第2版新教材口径,案例分析 45 分线的希望就大很多。

软件行业技术文化交流。 71

C#——关键字:readonly

C#——关键字:readonly readonly 关键字是一个可在四个上下文中使用的修饰符: 在字段声明中,readonly 指示只能在声明期间或在同一个类的构造函数中向字段赋值。 可以在字段声明和构造函数中多次分配和重新分配只读字段。 构造函数退出后,不能分配 readonly 字段。 此规则对于值类型和引用类型具有不同的含义: 1.由于值类型直接包含数据,因此属于 readonly 值类型的字段不可变。 2.由于引用类型包含对其数据的引用,因此属于 readonly 引用类型的字段必须始终引用同一

weixin_43945471的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C#:readonly与const

可以看出readonly修饰的值类型,值类型的成员变量也将是readonly的,但是修饰引用类型时,其本质是一个常量指针,引用类型的成员变量是不受readonly修饰符约束的。可以在字段声明和构造函数中多次分配和重新分配只读字段,在其他时候则是无法赋值的。3)const修饰的变量不能再用static变量进行修饰,并且其只能在字段的声明中初始化。C#当中的const没有C++中那么灵活,所能修饰的变量类型很有限。1)readonly修饰的变量是在运行时才进行赋值的。2)readonly修饰值类型和引用类型。.

qq_42987967的博客 1045

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ReadOnly关键字修饰的变量可以修改,只是不能重新分配

MSDN 官方的解释 readonly关键字是可以在字段上使用的修饰符。当字段声明包括readonly修饰符时,该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数中. 很多初学者看完书就会认为,readonly修饰的变量在以后是不能修改的,在以后的开发中从不对ReadOnly的变量进行修改操作,形成思维定势,这个观念是错误的。 首先要明确一点:更改!=重...

weixin_33850890的博客 143

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C# - readonly 和 const 关键字

程序设计过程中经常会用到常量,C# 语言中有 `readonly`, `const` 定义常量,如何准确的定义常量,它们的区别又是什么?

wumingxiaoyao的博客 804

C# 关键字const和readonly之间的区别

readonly字段可以在声明或构造函数中初始化。const是静态常量,在编译时的时候对常量解析,并将常量的值替换成初始化的那个值。readonly是动态常量,在运行的时候才获得,在编译期间标识为只读常量。注意:readonly时在运行时的变量,在运行第一次被赋值后,不可再变。3.readonly是实例成员,所以不同的实例可以有不同的常量值。1.可以在字段声明和构造函数中多次分配和重新分配只读字段。2.声明时可以不设置常量值,可以在构造函数中进行设置。2.常量可以是数字,布尔值,字符串,null引用。

去追随使你安宁的东西,去做你觉得有用的事情 308

C#基础 ----- readonly关键字

readonly关键字 在字段声明中,readonly 指示只能在声明期间或在同一个类的构造函数中向字段赋值。 可以在字段声明和构造函数中多次分配和重新分配只读字段。构造函数退出后,不能分配 readonly 字段。 此规则对于值类型和引用类型具有不同的含义: 由于值类型直接包含数据,因此属于 readonly 值类型的字段不可变。 using System; namespace Study { class Program { public int x;

再学一个就睡的博客 544

C/C++/C#中static关键字的本质差异与跨语言对比解析

在编程语言中,static关键字是一个基础且核心的概念,它用于控制变量和函数的存储期、链接性以及作用域。从原理上讲,static通过改变标识符的链接属性(内部链接vs外部链接)和存储期(静态存储期vs自动存储期),实现了数据的持久化与模块化封装。这一机制的技术价值在于提升代码的模块性、减少命名冲突,并为跨文件协作提供清晰边界。在应用场景上,C语言利用static实现模块私有变量和函数,C++将其扩展为类级别的静态成员,而C#则进一步深化为静态类与类型系统的一部分。本文聚焦于C、C++和C#中static的横

weixin_30268071的博客 505

C#知识大全

1. 结构体 Struct不可以有默认的构造函数和析构函数,会把所有字段初始化为默认值。自定义的构造函数必须对所有字段赋值。Struct可以实现接口,但不能从另一个class、struct继承,而且不能作为其他class的基类。可以不使用new创建。是值类型。 适合使用structs的场景: l 实例使用起来像C#的基元类型 l 需要创建大量的、短暂实例(例如在循环体内) l 实例不需要...

lzxgy8008的博客 699

C#学习笔记

1 数据类型数据类型分两种:值类型和引用类型值类型:简单类型, 结构类型(struct), 枚举类型引用类型:类, 委托, 数组, 接口、所谓值类型就是指当一个变量给另一个变量赋值的时候做的操作是内存拷贝,a = b;时, 为a重新分配内存并将b中的内容拷贝至a所在的内存块。引用类型类似指针,C++中指针和引用是不同的称呼,C++中说指针是地址,引用是别名,而对于他们的不同则没有深究,这里的引用可

cuihao0532的博客 414

秋招笔记——汇总

今天把所有的秋招笔记汇总在这里,不然我的个人主页太杂乱了,这样也方便复习。

lastXuanGod的博客 293

练功秘籍---A

常用整理

CarryBest的博客 1647
上一篇: CAP分布式事务应用场景
下一篇: DAG在区块链应用场景
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值