C# はオブジェクト指向言語です。オブジェクト指向の考え方では、オブジェクトのみが存在し、すべてはクラスで記述できます。たとえば、int、bool、char、string、double、long などはすべてクラスであり、30、2.5、「test」などはすべて対応するクラスのオブジェクトです。
static void Main(string[] args)
{
string istring = 30.ToString();
string dstring = 2.5.ToString();
string sstring = "test".ToString();
Console.WriteLine(string.Format("{0},{1},{2}", istring, dstring, sstring));
Console.ReadLine();
} ログイン後にコピー
出力:
これらは ToString() メソッドを持っているため、オブジェクトであることがわかります。 私が普段コードを書くときは、上記以外にも必ずデータ型の定義に使っています:
static void Main(string[] args)
{
Int32 i = 0;
UInt32 j = 0;
String str = "test";
Console.ReadLine();
} ログイン後にコピー
これは実際には .NET の仕組みであり、.NET というプラットフォームがあります。このプラットフォーム上の C# や VB など。したがって、.NET では、さまざまな言語にマップされる一連の型が定義されています。C# では Int32 が int です。このようなデータ型はプリミティブ型と呼ばれます。C# では、クラス オブジェクトは new を使用して生成する必要があります。クラスのこの部分は定数で直接表すことができます。プリミティブ型は、.net Framework の System 名前空間で定義されます。 C# 言語のプリミティブ型の型マッピングを見てみましょう。
.NET Frameworkのプリミティブ型 C#型
値の範囲 備考 System.Boolean
bool
true/ false / System.Byte byte 0 ~255 符号なし8ビット整数
System.Sbyte sbyte -128 ~ 12 7 記号付き 8 -bit integer System.Char char 0 ~ 65,535 符号なし16ビット整数 System.Int16 short -32,768 ~ 32 ,7 67
署名 16 -ビット整数 System.UInt16 ushort 0 ~ 65,535 符号なし16ビット整数 System.Int32 int -2,147,483 ,648 ~ 2, 147,483,647 符号付き 32 ビット整数 System .Int64 long -9,223,372,036,854,775,808 ~
9,223,372,036,854,775,807
署名付き 64 -bit integer System .UInt64 ulong 0 ~ 18,446,744,073,709,551,615
符号なし 64 ビットinteger System.Single float ±1.5 × 10-45 ~ ±3.4 × 1038
(有効数字 7 桁)
32 ビット単精度浮動小数点数 System.Double double ±5.0 × 10-324 ~ ±1.7 × 10308
(有効数字 15 ~ 16 桁)
64 ビット倍精度浮動小数点 System.Decimal 10 進数 ±1.0 × 10-28 ~ ±7.9 × 1028
(有効数字 27 ~ 28)
128 ビット浮動小数点数 .String string anystring /system.uint32 uint 0〜4,294,967,295 は、32ビット整数に固定されていません表中的除了string是引用类型(后面单独解释),其它都是值类型。 下面简单介绍下引用类型和值类型。 学习C语言的时候有个堆和栈的概念。堆区——程序员分配释放,或者程序结束有OS回收,分配方式类似于链表。 栈区——由编译器自动分配释放,存放函数的参数值,变量值等。 栈内存结构可以快速的分配内存和回收内存,但栈空间有限,过多使用会“溢出”,因此栈只分配常用的,占用空间小的数据类型;堆内存结构分配内存较慢,但是利用空间大,可以存放大型数据。 在C#中,基本上所有的数据都存储在“堆”结构中,称之为“托管堆”,受.NET垃圾回收监控。但是相对于栈堆结构中内存分配效率比较低。为了正确进行垃圾回收,每次分配的堆空间比实际所需空间稍大,小型数据使用堆是不太合适的。 可以比较看一下值类型和引用类型: C#中提供了Struct定义值类型,直接在栈上分配内存。
/// <summary>
/// 使用struct定义一个值类型,
/// 值类型的只能实现接口,不能继承类
/// </summary>
public struct StructPositiveNumber : ICloneable
{
/// <summary>
/// 值类型字段
/// </summary>
private int number;
/// <summary>
/// 静态只读字段,作为类的初始值
/// </summary>
public readonly static StructPositiveNumber InitialValue = new StructPositiveNumber();
/// <summary>
/// 属性
/// </summary>
public int Number
{
get
{
return number;
}
set
{
if (value <= 0)
{
throw new Exception();
}
this.number = value;
}
}
/// <summary>
/// 可以定义构造器,但是和类不同,这里的默认构造器依然存在
/// </summary>
public StructPositiveNumber(int value)
{
if (value <= 0)
{
throw new Exception();
}
this.number = value;
}
/// <summary>
/// 实现克隆方法,返回当前对象
/// </summary>
/// <returns></returns>
public object Clone()
{
return new StructPositiveNumber(this.number);
}
} ログイン後にコピー
调用
static void Main(string[] args)
{
//声明变量,赋值
StructPositiveNumber pNumber1 = StructPositiveNumber.InitialValue;
pNumber1.Number = 1;
//pNumber1赋给pNumber2
StructPositiveNumber pNumber2 = pNumber1;
//改变pNumber2的值
pNumber2.Number = 2;
//看打印结果,改变了pNumber2的值,但是不影响pNumber1
Console.WriteLine(pNumber1.Number);//1
Console.WriteLine(pNumber2.Number);//2
//重新初始化pNumber2,通过构造器生成改变了初始值。
pNumber2 = new StructPositiveNumber(3);
Console.WriteLine(pNumber2.Number);//3
//调用Clone将pNumber2复制给pNumber1
pNumber1 = (StructPositiveNumber)pNumber2.Clone();
Console.WriteLine(pNumber1.Number);//3
//改变pNumber1的值,但是pNumber2值不改变
pNumber1.Number = 4;
Console.WriteLine(pNumber1.Number);//4
Console.WriteLine(pNumber2.Number);//3
Console.ReadLine();
} ログイン後にコピー
结果
再看引用类型定义的:
public class ClassPositiveNumber : ICloneable
{
private int number;
public int Number
{
get
{
return this.number;
}
set
{
if (value <= 0)
{
throw new Exception();
}
this.number = value;
}
}
//引用类型自己可以初始化为null,无需定义初始值
//public readonly static ClassPositiveNumber InitialValue = new ClassPositiveNumber();
public ClassPositiveNumber(int value)
{
if (value <= 0)
{
throw new Exception();
}
this.number = value;
}
public object Clone()
{
return new ClassPositiveNumber(this.number);
}
} ログイン後にコピー
调用
static void Main(string[] args)
{
ClassPositiveNumber cNumber1;//默认值为null
cNumber1 = new ClassPositiveNumber(1);
ClassPositiveNumber cNumber2 = cNumber1;
cNumber2.Number = 2;
//可以看出,两个引用引用到了相同的对象
Console.WriteLine(cNumber1.Number);//2
Console.WriteLine(cNumber2.Number);//2
//重新初始化cNumber2,之前的对象已被丢弃
cNumber2 = new ClassPositiveNumber(3);
Console.WriteLine(cNumber2.Number);//3
//复制是复制一个对象的副本,因此,是两个不同的对象
cNumber1 = (ClassPositiveNumber)cNumber2.Clone();
Console.WriteLine(cNumber1.Number);//3
cNumber1.Number = 4;
Console.WriteLine(cNumber1.Number);//4
Console.WriteLine(cNumber2.Number);//3
Console.ReadLine();
} ログイン後にコピー
结果
通过例子,可以看出值类型的特点如下: a、使用struct声明; b、不能继承类,但是可以实现接口(当然除object类外); c、值类型使用值类型做为字段,但是字段无法有默认值; c、值类型中必须有默认构造器,而且自己定义构造器后,默认的无参数的构造器依然存在。而且在构造其中只能访问类中的字段,但是不能访问属性。符号=对于值类型来说是赋值,所以赋值是值类型变量不能为空,因为值类型没有引用的概念,肯定有值。
以上就是C#基础知识整理:基础知识(11) 值类型,引用类型的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
2023-03-15 16:54:01
2023-03-15 12:26:02
2023-03-14 18:58:01
2023-03-14 11:30:01
1970-01-01 08:00:00
2023-03-16 15:20:01
1970-01-01 08:00:00
1970-01-01 08:00:00
1970-01-01 08:00:00
1970-01-01 08:00:00