在C#中,结构是值类型,在声明变量的时候,就会对其分配内存;类是引用类型,如果只是声明变量,得到的是一个声明都没的空对象,也不可访问其中的成员。
例1(使用结构)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace nihao
{
///
/// 结构体表示复数
///
class Program
{
static void Main(string[] args)
{
ComplexNumber c1;
//c1赋值
c1.a = 1;
c1.b = 3;
//创建c2并且赋值
ComplexNumber c2 = c1;
c2.a = c2.b;
Console.Write("c1 = ");
c1.Write();
Console.Write("c2 = ");
c2.Write();
Console.ReadKey();
}
///
/// 创建结构,同时在结构中创建一个输出复数的方法
///
struct ComplexNumber {
public float a;
public float b;
public void Write() {
Console.WriteLine("{0}+{1}i", a, b);//输出复数(可引用)
}
}
}
}
例2(使用类)
using System;
namespace ConsoleApp3
{
///
/// 把结构成类,并引用运行,
/// 结构属于值类型,类属于引用类型
/// 值类型在声明变量时就会分配内存,但引用类型不会,只会得到一个空对象,也不可访问
/// 因此new用于显示创建类的变量(为类分配内存)
///
class Program
{
static void Main(string[] args)
{
//new在C#中作用
ComplexNumber c1 = new ComplexNumber();//为ComplexNumber类分配一个内存
ComplexNumber c2 = c1;
c1.a = 1;
c1.b = 3;
c2.a= c2.b;
Console.Write("c1 = ");
c1.Write();
Console.Write("c2 = ");
c2.Write();
}
}
class ComplexNumber {
public float a;
public float b;
public void Write() {
Console.WriteLine("{0}+{1}i" ,a,b );
Console.ReadKey();
}
}
}
若要使用类,需要在声明变量时将
ComplexNumber c1;更改为ComplexNumber c1 = new ComplexNumber();
new用于显示创建类的变量,才得到在程序中真是存在的内存对象。
而且例1和例2所得结果不同
如图
例1结果
例2结果
由此可见值类型和引用类型的区别:
1、将值类型的一个变量a赋值给另一个变量b,其实就是把a的数据赋值给b,a和b两个变量是相互独立的。
2、将引用类型的一个变量a赋值给另一个变量b,其实是把a中指向所引用的类的指针赋值给b,另b也包含指向所引用的类的指针,本质上是对类进行操作(不知道这样讲是否合适)。如图
在执行c2.a=c2.b之后变为
以上就是我对于C#中引用结构和引用类的一些认识,由于刚刚起步学习C#,可能在认识上还有一些偏差,希望大家可以指正,谢谢大家。