C# 数据类型详解:掌握数据类型及操作为高效编码奠定基础
本文将带你深入了解C#中各种数据类型的特点、用途和最佳实践,让你不仅能熟练运用基本类型,还能掌握如何在实际项目中做出最合适的选择。
目录
C#基本语法
C#数据类型
C#类型转换
C#变量常量
C#基本语法
在学习C#之前我们要先知道C#的基础构建是由哪些部分组成,要知道C#文件的后缀为.cs,以下创建一个test.cs文件,文件包含了可以打印出 "Hello World" 的简单代码,而C#程序主要包括以下几个部分:
using System;
namespace HelloWorldApplication # 命名空间声明(namespace declaration)
{class HelloWorld # class类(包括方法、属性){static void Main(string[] args) # mian方法{/* 我的第一个 C# 程序 注释*/Console.WriteLine("Hello World"); # 语句与表达式Console.ReadKey();}}
}
在任何C#程序中的第一条语句都是:using System; using关键字用于在程序中包含命名空间,一个程序可以包含多个using语句。class关键字用于声明一个类,在C#中注释也和其他代码一样:/*多行注释*/、//单行注释,标识符是用来识别类、变量、函数或任何其它用户定义的项目,在C#中,类的命名必须遵循如下基本规则:
/*
标识符必须以字母、下划线或 @ 开头,后面可以跟一系列的字母、数字( 0 - 9 )、下划线( _ )、@。
标识符中的第一个字符不能是数字。
标识符必须不包含任何嵌入的空格或符号,比如 ? - +! # % ^ & * ( ) [ ] { } . ; : " ' / \。
标识符不能是 C# 关键字。除非它们有一个 @ 前缀。 例如,@if 是有效的标识符,但 if 不是,因为 if 是关键字。
标识符必须区分大小写。大写字母和小写字母被认为是不同的字母。
不能与C#的类库名称相同。
*/
顶级语句:在C#9.0版本中,引入了顶级语句(Top-Level Statements)的概念,这是一种新的编程方式,允许开发者在文件的顶层直接编写语句而不需要将它们封装在方法和类里面,和前端些js十分类似,哪需要整一些花里胡哨的东西,直接声明变量、定义方法、处理异常,如下:
using System;
using System.Linq;// 顶级语句中的变量声明
int number = 42;
string message = "The answer to life, the universe, and everything is";// 输出变量
Console.WriteLine($"{message} {number}.");// 定义和调用方法
int Add(int a, int b) => a + b;
Console.WriteLine($"Sum of 1 and 2 is {Add(1, 2)}.");// 使用 LINQ
var numbers = new[] { 1, 2, 3, 4, 5 };
var evens = numbers.Where(n => n % 2 == 0).ToArray();
Console.WriteLine("Even numbers: " + string.Join(", ", evens));// 异常处理
try
{int zero = 0;int result = number / zero;
}
catch (DivideByZeroException ex)
{Console.WriteLine("Error: " + ex.Message);
}
顶级语句在简化代码结构、降低学习难度和加快开发速度方面具有显著优势,特别适合于编写简单程序和脚本。顶级语句的特点主要包含如下几个方面:
1)无需类或方法:顶级语句允许你直接在文件的顶层编写代码,无需定义类或方法自动
2)自动Main 方法:编译器会自动生成一个Main方法,并将顶级语句作为Main方法的主体
3)文件作为入口点:包含顶级语句的文件被视为程序的入口点,类似于C#之前的Main方法
4)支持局部函数:尽管不需要定义类,但顶级语句的文件中仍然可以定义局部函数。
5)更好的可读性:对于简单的脚本或工具,顶级语句提供了更好的可读性和简洁性。
6)适用于小型项目:顶级语句非常适合小型项目或脚本,可以快速编写和运行代码。
7)与现有代码兼容:顶级语句可以与现有的C#代码库一起使用,不会影响现有代码。
注意:顶级语句只能在一个源文件中使用,如在一个项目中有多个使用顶级语句的文件会导致编译错误;如果使用顶级语句则该文件会隐式地包含Main方法,并且该文件将成为程序的入口点;顶级语句中的代码共享一个全局作用域,这意味着可以在顶级语句中定义的变量和方法可以在整个文件中访问。
切换C#版本:在C#版本中如果你是低版本是有时候无法使用C#的语法糖的,使用之后就会提示你当前的C#版本过低,需要我们提高C#的版本,如下所示:
如果想切换版本我们就需要右击我们的我们先进行卸载,如下所示:
然后再右键我们卸载的项目,点击编辑项目文件然后添加一行语言版本,这里我们设置如下10版本就可以使用我们上面的顶级语句了:
<LangVersion>10.0</LangVersion>
C#数据类型
在C#中,变量分为以下几种类型:
值类型:值类型变量可以直接分配给一个值,它是从类System.ValueType中派生的,值类型直接包含数据,比如int、char、float等,它们分别存储数字、字符、浮点数,例如声明一个int类型时系统会分配内存来存储值,以下是值类型常见的类别:
关键字 | 说明 | 字节大小 |
---|---|---|
bool | 逻辑值(真/假) | 1 |
sbyte | 有符号8位整数 | 1 |
byte | 无符号8位整数 | 1 |
short | 有符号16位整数 | 2 |
ushort | 无符号16位整数 | 2 |
int | 有符号32位整数 | 4 |
uint | 无符号32位整数 | 4 |
引用类型:引用类型不包含存储在变量中的实际数据而包含对变量的引用,使用多个变量时引用类型可以指向一个内存位置,如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化,如下所示:
/*对象类型(object):可以被分配任何其他类型,在分配值之前需要先进行类型转换。值类型转换为对象类型时,被称为“装箱”;对象类型转换为值类型时,则被称为“拆箱”。
*/
using System;object obj;
obj = 100; // 这是装箱/*字符串类型(String):允许给变量分配任何字符串值字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号字符串前面可以加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待
*/
String str1 = "runoob.com";
string str2 = @"C:\Windows"; // 等价于 string str = "C:\\Windows";
指针类型:指针类型变量存储另一种类型的内存地址,C#中的指针与C或C++中的指针有相同的功能,如下所示:
//声明指针类型的语法:
type* identifier;// 实例:
char* cptr;
int* iptr;
C#类型转换
类型转换是将一个数据类型的值转换为另一个数据类型的过程,在C#中的类型转换可以分为两种:隐式类型转换和显式类型转换(也称强类型转换),如下所示:
隐式类型转换:将一个较小范围的数据类型转换为较大范围的数据类型时,不需要编写代码来指定的转换,编译器会自动进行,如下所示:
byte b = 10;
int i = b; // 隐式转换,不需要显式转换// 将一个整数赋值给一个长整数,或者将一个浮点数赋值给一个双精度浮点数,这种转换不会导致数据丢失
int intValue = 42;
long longValue = intValue; // 隐式转换,从 int 到 long
显式类型转换:将一个较大范围的数据类型转换为较小范围的数据类型时,或者将一个对象类型转换为另一个对象类型时,需要使用强制类型转换符号进行显示转换,强制转换会造成数据丢失,如下所示:
//强制转换为整数类型:
double doubleValue = 3.14;
int intValue1 = (int)doubleValue; // 强制从 double 到 int,数据可能损失小数部分//强制转换为浮点数类型:
int intValue2 = 42;
float floatValue = (float)intValue2; // 强制从 int 到 float,数据可能损失精度
C#提供了以下内置的转换类型的方法,如下所示:
ToBoolean() // 把类型转换为布尔型
ToByte() // 把类型转换为字节型
ToChar() // 把类型转换为字符型
ToDateTime() // 把类型转换为日期时间型
ToDecimal() // 把类型转换为十进制型
ToDouble() // 把类型转换为双精度浮点型。
ToSbyte() // 把类型转换为有符号字节型
ToSingle() // 把类型转换为单精度浮点型
ToString() // 把类型转换为字符串型
ToType() // 把类型转换为指定类型
当然C#还提供了多种类型转换方法,例如使用Convert类、Parse方法和TryParse方法,这些方法可以帮助处理不同的数据类型之间的转换,如下所示:
//使用 Convert 类,可以在各种基本数据类型之间进行转换。
string str1 = "123";
int num = Convert.ToInt32(str1);//使用 Parse 方法,用于将字符串转换为对应的数值类型,如果转换失败会抛出异常。
string str2 = "123.45";
double d1 = double.Parse(str2);//使用 TryParse 方法,类似于 Parse,但它不会抛出异常,而是返回一个布尔值指示转换是否成功。
string str3 = "123.45";
double d2;
bool success = double.TryParse(str3, out d2);if (success)
{Console.WriteLine("转换成功: " + d2);
}
else
{Console.WriteLine("转换失败");
}
总结:在进行类型转换时需要注意以下几点:
1)隐式转换只能将较小范围的数据类型转换为较大范围的数据类型,不能将较大范围的数据类型转换为较小范围的数据类型
2)显式转换可能会导致数据丢失或精度降低,需要进行数据类型的兼容性检查
3)对于对象类型的转换,需要进行类型转换的兼容性检查和类型转换的安全性检查
C#变量常量
变量:在C#中变量是用于存储和表示数据的标识符,在声明变量时需要指定类型并可以有选择性的为其分配一个初始值。每个变量都有一个特定的类型,类型决定了变量内存大小和布局,范围内的值可以存储在内存中对变量进行一系列操作,C#中提供的基本的值类型大致可以分为以下几类:
类型 | 举例 |
---|---|
整数类型 | sbyte、byte、short、ushort、int、uint、long、ulong 和 char |
浮点型 | float, double |
十进制类型 | decimal |
布尔类型 | true 或 false 值,指定的值 |
空字符串 | string |
空类型 | 可为空值的数据类型 |
在C#中定义变量的格式就是:数据类型+ 变量名称,一些有效的变量定义如下所示:
// 定义变量(可以定义不同类型)
int i, j, k;
char c, ch;
float f, salary;
double d;// 定义变量并初始化值
int i = 100;// 设置动态类型,允许在运行时推断变量的类型
dynamic dynamicVariable = "This can be any type";
在C#中变量的作用域定义了变量的可见性和生命周期,变量的作用域通常由花括号 {} 定义的代码块来确定,以下是关于C#变量作用域的一些基本规则:
// 01局部变量
void MyMethod()
{int localVar = 10; // 局部变量,外部不可访问// ...
}
// 02块级作用域,在 C# 7及更高版本中,引入了块级作用域,即使用大括号 {} 创建的任何块都可以定义变量的作用域。
{int blockVar = 20; // 块级作用域,外部不可访问// ...
}
// 03方法参数作用域
void MyMethod2(int parameter)
{// parameter 在整个方法中可见// ...
}
// 04全局变量,在整个类中可见,如果在命名空间级别定义,那么它们在整个命名空间中可见。
class MyClass
{int memberVar = 30; // 成员变量,在整个类中可见
}
// 05静态变量作用域,在类级别上声明的,但它们的作用域也受限于其定义的类。
class MyClass2
{static int staticVar = 40; // 静态变量,在整个类中可见
}
// 06循环变量作用域,在循环中定义的变量,其作用域仅限于循环本身。
for (int i = 0; i < 5; i++)
{// i 在循环体内可见
}
常量:固定值(被定义后无法被修改),程序执行期间不会改变,可以是任何基本数据类型,比如整数常量、浮点常量、字符常量、字符串常量和枚举常量等,可以被当作常规的变量。常量是使用const关键字来定义的,定义一个常量的语法如下:
using System;public class ConstTest
{class SampleClass{public int x;public int y;public const int c1 = 5;public const int c2 = c1 + 5;public SampleClass(int p1, int p2) {x = p1; y = p2;}}static void Main(){SampleClass mC = new SampleClass(11, 22);Console.WriteLine("x = {0}, y = {1}", mC.x, mC.y);Console.WriteLine("c1 = {0}, c2 = {1}", SampleClass.c1, SampleClass.c2);}
}
字符常量是括在单引号里,在C#中有一些特定的字符,当它们的前面带有反斜杠时有特殊的意义,可用于表示换行符(\n)或制表符tab(\t),在这里列出一些转义序列码:
转义序列 | 含义 |
---|---|
\\ | \ 字符 |
\' | ' 字符 |
\" | " 字符 |
\? | ? 字符 |
\a | Alert 或 bell |
\b | 退格键(Backspace) |
\f | 换页符(Form feed) |
\n | 换行符(Newline) |
\r | 回车 |
\t | 水平制表符 tab |
\v | 垂直制表符 tab |
\ooo | 一到三位的八进制数 |
\xhh . . . | 一个或多个数字的十六进制数 |
相关文章:
C# 数据类型详解:掌握数据类型及操作为高效编码奠定基础
本文将带你深入了解C#中各种数据类型的特点、用途和最佳实践,让你不仅能熟练运用基本类型,还能掌握如何在实际项目中做出最合适的选择。 目录 C#基本语法 C#数据类型 C#类型转换 C#变量常量 C#基本语法 在学习C#之前我们要先知道C#的基础构建是由哪些…...
burp2
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
[ACTF2020 新生赛]BackupFile--详细解析
信息搜集 让我们寻找源文件,目录扫描: 找到了/index.php.bak文件,也就是index.php的备份文件。 后缀名是.bak的文件是备份文件,是文件格式的扩展名。 我们访问这个路径,就会直接下载该备份文件。 我们把.bak后缀删掉…...
循环神经网络(RNN)简述
RNN及其变体 1、概述 (一)、概念 RNN(Recurrent Neural Network), 中文称作循环神经网络, 它一般以序列数据为输入, 通过网络内部的结构设计有效捕捉序列之间的关系特征, 一般也是以序列形式进行输出。 RNN的循环机制使模型隐层**上一时间步产生的结果, 能够作为当下时间步…...
九、Ubuntu Linux操作系统
一、Ubuntu简介 Ubuntu Linux是由南非人马克沙特尔沃思(Mark Shutteworth)创办的基于Debian Linux的操作系统,于2004年10月公布Ubuntu是一个以桌面应用为主的Linux发行版操作系统Ubuntu拥有庞大的社区力量,用户可以方便地从社区获得帮助其官方网站:http…...
SpringBoot 新冠密接者跟踪系统:校园疫情防控的智能守护者
摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古…...
【Ubuntu】E: Unable to locate package xxx
报错描述 在 Ubuntu 上 执行 apt install xxx 出现下面的报错: 即无法定位到该 Package,一般形式如下: # apt install xxx Reading package lists... Done Building dependency tree... Done Reading state information... Done E: Unable …...
vue多页面应用集成时权限处理问题
在多页面应用(MPA)中,权限管理通常会涉及到每个页面的访问控制、身份验证、以及权限校验。以下是几种常见的权限处理方式: 1. 前端路由权限控制 原理:虽然是多页面应用,通常每个页面会独立加载和渲染&…...
Socket编程(TCP/UDP详解)
前言:之前因为做项目和找实习没得空,计算机网络模块并没有写成博客,最近得闲了,把计算机网络模块博客补上。 目录 一,UDP编程 1)创建套接字 2)绑定端口号 3)发送与接收数据 4&…...
qt QConicalGradient详解
1、概述 QConicalGradient是Qt框架中QGradient的一个子类,它用于创建锥形渐变效果。锥形渐变是从一个中心点出发,沿着360度的圆周扩散的颜色渐变。这种渐变通常用于模拟光线旋转、创建彩虹效果或实现其他复杂的颜色过渡。QConicalGradient允许你定义渐变…...
存储过程与自然语言处理逻辑的不同与结合
在现代软件开发中,存储过程与自然语言处理(NLP)逻辑都发挥着重要作用。存储过程是一种在数据库内部运行的预编译程序,通常用于处理与数据相关的任务,例如插入、更新、删除数据以及复杂的查询操作。而自然语言处理&…...
了解Linux —— 理解其中的权限
前言 在了解Linux权限之前,先来探讨我们使用的shell 命令它到底是什么? Linux 是一个操作系统,我们称其为内核(kernel) ,正常情况下,我们一般用户操作并不是去直接使用内核,而是通过kernel 的外壳程序&…...
知识图谱嵌入与因果推理的结合
知识图谱通过节点(实体)和边(关系)来表示现实世界中的信息,但如何将这些信息转化为可进行推理和决策的形式,仍然是一个挑战。 另一方面,因果推理(Causal Inference)作为…...
STM32 PWM波形详细图解
目录 前言 一 PWM介绍 1.1 PWM简介 1.2 STM32F103 PWM介绍 1.3 时钟周期与占空比 二.引脚映像关系 2.1引脚映像与寄存器 2.2 复用功能映像 三. PWM 配置步骤 3.1相关原理图 3.2配置流程 3.2.1 步骤一二: 3.2.2 步骤三: 3.2.3 步骤四五六七: …...
Python Web 开发 FastAPI 入门:从基础架构到框架比较
Python Web 开发 FastAPI 入门:从基础架构到框架比较 目录 🖥️ Web 服务器概述(如 Nginx、Apache)🔗 前后端分离架构详解🔄 HTTP 路由和请求处理机制🧰 Web 框架概述:Django、Fla…...
基于STM32的智能仓库管理系统设计
目录 引言环境准备 硬件准备软件准备智能仓库管理系统基础 控制系统架构功能描述代码实现:实现智能仓库管理系统 4.1 RFID标签读取模块4.2 库存管理模块4.3 数据显示与监控模块4.4 无线通信模块应用场景:智能仓库管理系统优化问题解决方案与优化收尾与总…...
排序算法--堆排序【图文详解】
“留在码头的船才最安全” “但亲爱的,那不是造船的目的。 堆--插入heapInsert 原来有一个大根堆,如图: 现在要新插入一个数字50,进行插入 流程:和父亲相比,如果比父亲大,和父亲交换ÿ…...
FCBP 认证考试要点摘要
理论知识 数据处理与分析:包括数据的收集、清洗、转换、存储等基础操作,以及数据分析方法,如描述性统计分析、相关性分析、数据挖掘算法等的理解和应用 。数据可视化:涉及图表类型的选择与应用,如柱状图、折线图、饼图…...
鸿蒙生态崛起的机遇有什么
鸿蒙生态系统的崛起为各个领域带来了多个机遇,主要体现在以下几个方面: 智能设备的互联互通:鸿蒙系统旨在实现不同设备之间的无缝连接,为物联网(IoT)设备的发展提供了良好的基础。这将推动智能家居、智慧城…...
基础(函数、枚举)错题汇总
枚举默认从0开始,指定后会按顺序赋值 而这个枚举变量X,如果在全局(函数外部)定义,那默认为0,如果在函数内部(局部变量),那就是随机值,必须初始化。 枚举变量…...
【Spark源码分析】规则框架- `analysis`分析阶段使用的规则
analysis分析阶段使用的规则 规则批策略规则说明SubstitutionfixedPointOptimizeUpdateFields该规则优化了 UpdateFields 表达式链,因此看起来更像优化规则。但是,在处理深嵌套模式时,UpdateFields 表达式树可能会非常复杂,导致分…...
mysql--二进制安装编译安装yum安装
二进制安装 创建用户和组 [rootlocalhost ~]# groupadd -r -g 306 mysql [rootlocalhost ~]# useradd -r -g 306 -u 306 -d /data/mysql mysql 创建文件夹并添加所属文件用户和组 [rootlocalhost ~]# mkdir -p /data/mysql [rootlocalhost ~]# chown mysql:mysql /data/mysql …...
《Django 5 By Example》阅读笔记:p339-p358
《Django 5 By Example》学习第12天,p339-p358总结,总计20页。 一、技术总结 1.项目(购物网站) django-admin startproject myshop 虽然这里只是示例,但我觉得这种命名为 myxxx 的习惯非常不好,因为在实际应用中,是…...
鸿蒙修饰符
文章目录 一、引言1.1 什么是修饰符1.2 修饰符在鸿蒙开发中的重要性1.3 修饰符的作用机制 二、UI装饰类修饰符2.1 Styles修饰符2.1.1 基本概念和使用场景2.1.2 使用示例2.1.3 最佳实践 2.2 Extend修饰符2.2.1 基本概念2.2.2 使用示例2.2.3 Extend vs Styles 对比2.2.4 使用建议…...
springboot359智慧草莓基地管理系统(论文+源码)_kaic
毕 业 设 计(论 文) 题目:智慧草莓基地管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本智慧草莓基地管理系统就…...
单片机位数对性能会产生什么影响?!
单片机的位数是指其处理器核心的位宽,通常以比特(bit)为单位。常见的位数有8位、16位、32位和64位等。 单片机位数越高,处理器能够处理的数据量越大,性能也相应提高。 以下是对单片机位数对性能影响的详细分析&#…...
stm32内部高速晶振打开作为主时钟
首先建议你别这么干,因为内部晶振特别容易受温度等外界影响,很容易卡死或堵死程序 我是因为没画外部晶振电路,所以只能开内部晶振来作为时钟 适用于stm32f103系列 把下面的代码换掉源文件里的时钟源配置 /* 开启HSI 即内部晶振时钟 */RCC…...
【分页查询】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...
【CSS in Depth 2 精译_061】9.4 CSS 中的模式库 + 9.5 本章小结
当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第九章 CSS 的模块化与作用域】 ✔️ 9.1 模块的定义 9.1.1 模块和全局样式9.1.2 一个简单的 CSS 模块9.1.3 模块的变体9.1.4 多元素模块 9.2 将模块组合为更大的结构 9.2.1 模块中多个职责的拆分…...
惠普电脑切换默认F1至F12快捷键,FN切换
发现新买的惠普电脑,按F1至F12发现是快捷功能键,而按fnF1至F12才是windows的功能键和正常我自己使用的电脑刚好相反,实在太不方便了。 解决办法需要进入biso里面去把功能键模式选中给关掉,才能恢复回来...
郑州做网站销售怎么样/seo建站教程
1.团队课程设计博客链接2.个人负责模板随即密码生成器算法3.自己的代码提交记录截图4.自己负责模块或任务详细说明负责随机密码算法设计实现通过不同种类选择下生成密码,将这个过程代码化并最后能得以实现。关键代码:import java.util.Random;public cla…...
网站制作最新技术的/百度域名注册查询
Solution: 假设现在在点1,有许多形如 (x, y, z) 的限制条件,那么对于一组限制,必须先走到 x, y 的 \(\frac{z-dis(x, y)}{2}\) 级祖先,叫这些点为限制点,那么如果要满足所有条件,必然是先走到一个最深的…...
java web 阅读网站开发/河北seo诊断培训
(1) 轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。 优点:后端程序编写比较容易。 缺点:请求中有大半是无用,浪费带宽和服务器资源。 实例:适于小型应用。 (2) 长轮询…...
手机网站生成app软件/媒介
前言:我个人觉得aptana3.2 for eclipse依然不够强大,有很多提示依然出不来,相比而言,我现在最强的应该是spket。 这里简单说下思路吧: 1、http://www.cnblogs.com/chang290/archive/2013/02/17/2913936.html 这个帖子基…...
网站建设管理系统免费网站/推广平台收费标准
上个月初的时候,华硕ROG产品线升级,推出了一款性价比非常高的游戏本,它就是华硕ROG魔霸新锐,这款笔记本很多地方延续了魔霸3的设计,同时核心配置又做了升级,升级之后不足9000元的售价堪称厚道,不…...
在线设计logo图案免费/seo网络优化教程
# SQL拼接小技巧(一) # 2018/6/21 18:54:36 ---------- **关键字: SQL , 1 1 ,1 2** ---------- 如下代码中SQL拼接使用了11和12防止请求参数中条件为空或SQL注入的方式猜测表名,字段名 public DomainPage<…...