济南网站建设大标网络,2022最近的新闻大事10条,php做网站的好处,建设文明网站包括序号系列文章0【C#基础】初识编程语言C#1【C#基础】C# 程序通用结构2【C#基础】C# 基础语法解析文章目录前言数据类型一. 值类型#xff08;Value types#xff09;二. 引用类型#xff08;Reference types#xff09;三. 指针类型#xff08;Pointer types#xff09;结…序号系列文章0【C#基础】初识编程语言C#1【C#基础】C# 程序通用结构2【C#基础】C# 基础语法解析文章目录前言数据类型一. 值类型Value types二. 引用类型Reference types三. 指针类型Pointer types结语前言 大家好我是writer桑前面一章已经学习了C#的基础语法那本章就开始学习C#程序的数据类型希望看完大家能够有所收获感谢支持 数据类型 C# 是一种强类型语言。 每个变量和常量都有一个类型每个求值的表达式也是如此。每个方法声明都为每个输入参数和返回值指定名称、类型和种类值、引用或输出。C# 分别以值类型和引用类型作为类型的两个主要类别。值类型的变量直接包含它们的数据。引用类型的变量存储对数据称为“对象”的引用。 一. 值类型Value types 值类型的变量包含类型的实例不同于引用类型的变量包含对类型实例的引用。默认情况下在分配中通过将实参传递给方法并返回方法结果来复制变量值。 对于值类型每个变量都具有其自己的数据副本对一个变量执行的操作不会影响另一个变量ref 和 out 参数变量除外。 代码理解
using System;public struct MutablePoint
{public int X, Y;public MutablePoint(int x, int y) (X, Y) (x, y);public override string ToString() $({X}, {Y});
}public class Program
{public static void Main(string[] args){var p1 new MutablePoint(1, 2);var p2 p1;Console.WriteLine(${nameof(p1)} after {nameof(p2)} is modified:{p1} );Console.WriteLine(${nameof(p2)}: {p2});MutateAndDisplay(p2);Console.WriteLine(${nameof(p2)} after passing to a method: {p2});}private static void MutateAndDisplay(MutablePoint p){p.X 100;Console.WriteLine($Point mutated in a method: {p});}
}/*
* 预期的输出
* p1 after p2 is modified:(1, 2)
* p2: (1, 2)
* Point mutated in a method: (100, 2)
* p2 after passing to a method: (1, 2)
*/ 从运行结果可知 MutateAndDisplay 方法对传入的参数 p 的修改并不会影响 Main 方法中的 p2 参数。MutateAndDisplay 方法对值类型变量 p 的操作只影响当前代码所处的栈内存的变量而 Main 方法的 p2 变量和 p 变量又是两个不同的变量。结论对值类型变量的操作只影响存储在变量中的值类型实例。
下表列出了 C# 11 中值类型的简单类型
类型/关键字描述范围默认值.NET类型bool布尔值True 或 FalseFalseSystem.Booleanchar16位 Unicode 字符U0000 到 UFFFF‘\0’System.Charfloat32 位单精度浮点型±1.5 x 10-45 至 ±3.4 x 10380.0FSystem.Singledouble64 位双精度浮点型±5.0 × 10 -324 至±1.7 × 103080.0DSystem.Doubledecimal128 位精确的十进制值28-29 有效位数±1.0 x 10-28 至7.9228 x 10^280.0MSystem.Decimalsbyte8 位有符号整数类型-128 到 1270System.SBytebyte无符号的 8 位整数0 到 2550System.Byteshort有符号 16 位整数-32,768 到 32,7670System.Int16ushort无符号 16 位整数0 到 65,5350System.UInt16int带符号的 32 位整数-2,147,483,648 到 2,147,483,6470System.Int32uint带符号的 32 位整数0 到 4,294,967,2950System.UInt32long64 位带符号整数-9,223,372,036,854,775,808 到 9,223,372,036,854,775,8070LSystem.Int64ulong无符号 64 位整数0 到 18,446,744,073,709,551,6150System.UInt64nint带符号的 32 位或 64位整数取决于在运行时计算的平台0System.IntPtrnuint带符号的 32 位或 64 位整数取决于在运行时计算的平台0System.UIntPtr除了上述值类型的简单类型之外C# 程序还包括以下用关键字声明的值类型种类 1枚举类型Enumeration 枚举类型是由基础整型数值类型的一组命名常量定义的值类型。 C# 程序中使用 enum 关键字定义枚举类型并指定枚举成员的名称示例代码如下
enum Season
{Spring,Summer,Autumn,Winter
}2结构类型Structure 结构类型是是一种可封装数据和相关功能的值类型C# 程序中使用 struct 关键字定义结构类型示例代码如下
public struct MutablePoint
{public int X, Y;public MutablePoint(int x, int y) (X, Y) (x, y);public override string ToString() $({X}, {Y});
}3元组类型Tuple 元组功能提供了简洁的语法来将多个数据元素分组成一个轻型数据结构。 下面的示例演示了如何声明元组变量、对它进行初始化并访问其数据成员
(double, int) t1 (4.5, 3);
Console.WriteLine($Tuple with elements {t1.Item1} and {t1.Item2}.);
// Output:
// Tuple with elements 4.5 and 3.(double Sum, int Count) t2 (4.5, 3);
Console.WriteLine($Sum of {t2.Count} elements is {t2.Sum}.);
// Output:
// Sum of 3 elements is 4.5. 4可为空的值类型Null 可为 null 值类型 T?T 表示泛型表示其基础值类型T 的所有值及额外的 null 值示例代码如下
// 值类型可隐式转换为相应的可为空的值类型
double? pi 3.14;
char? letter a;int m2 10;
int? m m2;bool? flag null;// 可空值类型的数组:
int?[] arr new int?[10];一些针对值类型的常用操作 若要在运行时获取本机大小的整数大小可以使用 sizeof()。 但是必须在不安全的上下文中编译代码。示例代码
Console.WriteLine($size of nint {sizeof(nint)});
Console.WriteLine($size of nuint {sizeof(nuint)});// 在64位进程中运行时输出
//size of nint 8
//size of nuint 8// 在32位进程中运行时输出
//size of nint 4
//size of nuint 4若要在运行时获取本机大小的整数的最小值和最大值或者取值范围请将 MinValue 和 MaxValue用作值类型关键字的静态属性示例代码
Console.WriteLine($nint.MinValue {nint.MinValue});
Console.WriteLine($nint.MaxValue {nint.MaxValue});//nint.MinValue -9223372036854775808
//nint.MaxValue 9223372036854775807如果想在运行时实现值类型数据之间的相互转换请使用隐式转换或者显式转换示例代码
// 隐式数据转换举例int 转换为 long
int a 11;
long b a; // 显示数据转换long 转换为 int
int a1 123;
long b1 a;
int c (int)b1; 如果想在运行时输出值类型的默认值可以使用 default 运算符生成默认类型值例如
Console.WriteLine(default(bool)); // False如果想在运行时输出值类型数据的 .NET 类型可以使用 GetType 方法例如
bool b false;
Console.WriteLine(b.GetType()); // System.Boolean 二. 引用类型Reference types 引用类型的变量存储对其数据对象的引用不同于值类型的变量直接包含其数据。 对于引用类型多个变量可同时引用同一对象多个变量之间互相传递的也是对这个对象的引用因此对一个变量执行的操作会影响另一个变量所引用的对象这点区别于值类型。 代码理解
using System;// 类为引用类型
public class MutablePoint
{public int X, Y;public MutablePoint(int x, int y) (X, Y) (x, y);public override string ToString() $({X}, {Y});
}public class Program
{public static void Main(string[] args){var p1 new MutablePoint(1, 2);var p2 p1;Console.WriteLine(${nameof(p1)} after {nameof(p2)} is modified:{p1} );Console.WriteLine(${nameof(p2)}: {p2});MutateAndDisplay(p2); // 显示和改变 Console.WriteLine(${nameof(p2)} after passing to a method: {p2});}private static void MutateAndDisplay(MutablePoint p){p.X 100;Console.WriteLine($Point mutated in a method: {p});}
}/*
* 预期的输出
* p1 after p2 is modified:(1, 2)
* p2: (1, 2)
* Point mutated in a method: (100, 2)
* p2 after passing to a method: (100, 2)
*/ 从输出结果可知 MutateAndDisplay 方法对参数 p 修改的同时也修改了 Main 方法中的 p2 参数。因为 p2 变量和 p 变量都是引用同一个对象 MutablePoint 类也就是指向了同一块内存地址所以 p2 变量对这内存进行修改的同时也修改了 p 变量的内存两者同时发生变化。结论当两个变量引用同一个对象时一个变量执行的操作会影响另一个变量的运行结果。
以下表格列举出了 C# 内置引用类型
类型/关键字描述.NET 类型object对象类型System.Objectstring字符串类型System.Stringdynamic动态类型System.Object除了上述内置的引用类型之外C# 程序还包括以下用关键字声明的引用类型 1记录类型Record 从 C# 9 开始可以使用 record 关键字定义一个 record 类型用来提供用于封装数据的内置功能record 类型用来构建不可变类型和和线程安全对象简单的示例
// 声明 record class 引用类型
public record Person
{public string FirstName { get; init; } default!;public string LastName { get; init; } default!;
};// 声明 record struct 值类型
public record struct Point
{public double X { get; init; }public double Y { get; init; }
}2类类型Class 类是将同类对象的共同属性和行为抽象出来形成的一个相对复杂的数据类型在 C# 程序中使用 class 关键字声明类示例如下
class TestClass
{//方法属性字段事件委托//和嵌套类到这里。
}3接口类型Interface 接口定义协定继承接口的类或结构体都必须实现接口中所定义的成员在 C# 编程中使用 interface 关键字定义接口示例如下
// 定义接口 ISampleInterface
interface ISampleInterface
{void SampleMethod();
}// 类 Program 继承接口并实现
public class Program : ISampleInterface
{public void SampleMethod(){throw new NotImplementedException();}
}4可为空的引用类型Null 引用类型 T? 的变量也可以用 null 进行初始化注意在取消引用之前必须检查变量是否为空 示例如下
string notNull Hello;
string? nullable default;
notNull nullable!; // 给定为空值 一些针对引用类型的常用操作 常见的装拆箱操作当一个值类型转换为对象类型时则被称为装箱相对的当一个对象类型转换为值类型时则被称为拆箱示例如下
//将整型变量i进行了装箱并分配给对象o。
int i 123;
object o i;// 将对象o拆箱并分配给对象i
i (int)o;Console.WriteLine(i); // 123string 字符串类型常见的相等运算、连接操作、输出指定位置的字符操作示例如下
string s1 hello, world;
string s2 hello, C#;// 定义相等运算符 和 ! 比较 string 对象之间是否相等
Console.WriteLine(s1 s2); // False // 定义 连接运算符连接两个字符串
Console.WriteLine(s1 s2); // hello, worldhello, C# // 定义 [] 运算符可访问字符串指定位置的字符
Console.WriteLine(s1[0]); // h 当希望变量不在编译期间进行类型检查时 使用 dynamic 类型的变量表示dynamic 类型变量在运行期间才进行解析示例如下
dynamic d 20; // 运行时进行类型检查三. 指针类型Pointer types C# 程序中在不安全的上下文中类型除了是值类型或引用类型外还可以是指针类型 通过指针类型可以直接操作对象的内存指针类型声明采用下列形式之一 //type* identifier;
void* identifier; // 允许但不建议 // 又例如
char* cptr;
int* iptr; 指针类型不能从对象继承并且指针类型之间不存在类型转换指针类型不支持类型装箱和拆箱的操作指针不能指向引用或包含引用的结构因为无法对对象引用进行垃圾回收MyType* 类型的指针变量的值为 MyType 类型的变量的地址
ps指针类型不在本章进行详细的讨论。 结语 ✔️ 以上就是 C# 数据类型的介绍希望能够对大家有所帮助。望大家多多支持你们的支持就是笔者创作最大的动力
文章转载自: http://www.morning.hlmkx.cn.gov.cn.hlmkx.cn http://www.morning.lqpzb.cn.gov.cn.lqpzb.cn http://www.morning.zkdbx.cn.gov.cn.zkdbx.cn http://www.morning.ydgzj.cn.gov.cn.ydgzj.cn http://www.morning.rxpp.cn.gov.cn.rxpp.cn http://www.morning.wttzp.cn.gov.cn.wttzp.cn http://www.morning.zpdjh.cn.gov.cn.zpdjh.cn http://www.morning.mqss.cn.gov.cn.mqss.cn http://www.morning.ccjhr.cn.gov.cn.ccjhr.cn http://www.morning.dtcsp.cn.gov.cn.dtcsp.cn http://www.morning.fqlxg.cn.gov.cn.fqlxg.cn http://www.morning.0small.cn.gov.cn.0small.cn http://www.morning.wrdlf.cn.gov.cn.wrdlf.cn http://www.morning.ltkms.cn.gov.cn.ltkms.cn http://www.morning.gbxxh.cn.gov.cn.gbxxh.cn http://www.morning.yrnyz.cn.gov.cn.yrnyz.cn http://www.morning.txqsm.cn.gov.cn.txqsm.cn http://www.morning.zwndt.cn.gov.cn.zwndt.cn http://www.morning.yprjy.cn.gov.cn.yprjy.cn http://www.morning.cyhlq.cn.gov.cn.cyhlq.cn http://www.morning.cpfbg.cn.gov.cn.cpfbg.cn http://www.morning.kjlia.com.gov.cn.kjlia.com http://www.morning.plzgt.cn.gov.cn.plzgt.cn http://www.morning.qbfwb.cn.gov.cn.qbfwb.cn http://www.morning.nyhtf.cn.gov.cn.nyhtf.cn http://www.morning.wbhzr.cn.gov.cn.wbhzr.cn http://www.morning.jgnjl.cn.gov.cn.jgnjl.cn http://www.morning.amonr.com.gov.cn.amonr.com http://www.morning.qhln.cn.gov.cn.qhln.cn http://www.morning.ppwdh.cn.gov.cn.ppwdh.cn http://www.morning.crrjg.cn.gov.cn.crrjg.cn http://www.morning.gbybx.cn.gov.cn.gbybx.cn http://www.morning.ljjmr.cn.gov.cn.ljjmr.cn http://www.morning.ldzss.cn.gov.cn.ldzss.cn http://www.morning.knpbr.cn.gov.cn.knpbr.cn http://www.morning.sqdjn.cn.gov.cn.sqdjn.cn http://www.morning.baohum.com.gov.cn.baohum.com http://www.morning.tpbhf.cn.gov.cn.tpbhf.cn http://www.morning.pzlcd.cn.gov.cn.pzlcd.cn http://www.morning.hphqy.cn.gov.cn.hphqy.cn http://www.morning.nhzxd.cn.gov.cn.nhzxd.cn http://www.morning.qgjxt.cn.gov.cn.qgjxt.cn http://www.morning.stfdh.cn.gov.cn.stfdh.cn http://www.morning.glrzr.cn.gov.cn.glrzr.cn http://www.morning.rcntx.cn.gov.cn.rcntx.cn http://www.morning.prmbn.cn.gov.cn.prmbn.cn http://www.morning.cmdfh.cn.gov.cn.cmdfh.cn http://www.morning.xqxrm.cn.gov.cn.xqxrm.cn http://www.morning.tdwjj.cn.gov.cn.tdwjj.cn http://www.morning.touziyou.cn.gov.cn.touziyou.cn http://www.morning.rdpps.cn.gov.cn.rdpps.cn http://www.morning.wjndl.cn.gov.cn.wjndl.cn http://www.morning.yrdkl.cn.gov.cn.yrdkl.cn http://www.morning.hmgqy.cn.gov.cn.hmgqy.cn http://www.morning.ftync.cn.gov.cn.ftync.cn http://www.morning.qbzdj.cn.gov.cn.qbzdj.cn http://www.morning.gwsll.cn.gov.cn.gwsll.cn http://www.morning.mrskk.cn.gov.cn.mrskk.cn http://www.morning.dwkfx.cn.gov.cn.dwkfx.cn http://www.morning.jwrcz.cn.gov.cn.jwrcz.cn http://www.morning.mggwr.cn.gov.cn.mggwr.cn http://www.morning.bhwll.cn.gov.cn.bhwll.cn http://www.morning.lgznc.cn.gov.cn.lgznc.cn http://www.morning.lwyqd.cn.gov.cn.lwyqd.cn http://www.morning.qpfmh.cn.gov.cn.qpfmh.cn http://www.morning.ckzjl.cn.gov.cn.ckzjl.cn http://www.morning.swkzr.cn.gov.cn.swkzr.cn http://www.morning.wjndl.cn.gov.cn.wjndl.cn http://www.morning.hnhsym.cn.gov.cn.hnhsym.cn http://www.morning.zwdrz.cn.gov.cn.zwdrz.cn http://www.morning.hrtfz.cn.gov.cn.hrtfz.cn http://www.morning.ljcf.cn.gov.cn.ljcf.cn http://www.morning.ntgjm.cn.gov.cn.ntgjm.cn http://www.morning.nspbj.cn.gov.cn.nspbj.cn http://www.morning.mczjq.cn.gov.cn.mczjq.cn http://www.morning.jksgy.cn.gov.cn.jksgy.cn http://www.morning.ctpfq.cn.gov.cn.ctpfq.cn http://www.morning.jpwmk.cn.gov.cn.jpwmk.cn http://www.morning.kpbn.cn.gov.cn.kpbn.cn http://www.morning.ljpqy.cn.gov.cn.ljpqy.cn