结构是值类型,类是引用类型
结构struct(对应类class):
结构是值类型,类是引用类型
结构中可以定义字段、属性和方法
不能为结构中的字段赋初始值
结构的构造方法中必须为所有字段赋值
不能为结构显式定义无参数的构造方法(public void struct不允许)
结构类型的对象可以不实例化
结构struct
结构的特点
结构struct
1111
9).类(class)与结构(struct)的区别:
a(最根本的):类是引用类型,而结构是值类型。
b:结构的对象中是不能有初始值的,而类可以。
c:结构类型的对像可以不用实例化,直接访问它的属性和方法。
d:在类里面是可以定义构造函数的;结构也可以,但是不能定义显示的无参构造函数。
e:在结构的有参构造函数里,必须对所有字段进行赋值。
f:在结构和类中,皆可以定义字段、属性和方法。
eg:
struct Dog//结构
{
string _name;//结构中可以定义字段,但不能赋初始值
public string Name//结构中可以定义属性
{
get{return _name;}
set{_name=value;}
}
public void Sing()//结构中可以定义方法
{
Console.WriteLine(“汪汪”);
}
public Dog(string name)//结构中只能显式定义有参构造方法,且要把所有字段赋值
{
_name=name;
}
}
……Main方法中
Dog dog=new Dog();//结构也可以不用实例化对象,即可将=new Dog()去除,定义在Main方法之外
Dog.Name=”小白”;
Console.WriteLine(“名字”+dog.Name);
dog.Sing();
结构
结构struck
1、结构是值类型(类是引用类型)
2、结构中可以定义字段、属性和方法
3、不能为结构中的字段赋初始值
4、结构的构造方法中必须为所有字段赋值
5、不能为结构显示无参数的定义方法
6、结构类型的对象可以不实例化
Dog dog = new Dog();//实例化
static Dog dog;//不实例化
struct结构关键字
结构是值类型,类是引用类型
结构中不能给字段赋初始值,类可以
结构中有默认的无参构造方法,不能自己定义无参构造方法,只能定义有参数的构造方法
结构的构造方法必须要给所有字段赋值
结构的对象可以不实例化
类与结构体
值类型有没有字段属性方法呢?
像int,float,double,bool这些值类型,都是属于结构
结构中和类一样,可以定义字段,属性,方法
结构和类的区别:
1,结构是值类型,类是引用类型
2,结构中不能给字段赋初始值
3,结构中编码者不能自己手动的创建无参构造,只能自己手动创建有参构造(因为结构中默认就有一个无参构造)
4,结构的带参构造中需要给所有的字段赋值
5,结构类型的对象可以不用实例化,可以定义static 结构名 结构对象名;
使用 结构对象名.方法 进行调用。
struct:
s
简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上。class是引用类型,创建一个class类型实例被分配在托管堆上。但struct和class的区别远不止这么简单。 概括来讲,struct和class的不同体现在: ● 类是引用类型,struct是值类型 ● 在托管堆上创建类的实例,在栈上创建struct实例 ● 类实例的赋值,赋的是引用地址,struct实例的赋值,赋的是值 ● 类作为参数类型传递,传递的是引用地址,struct作为参数类型传递,传递的是值 ● 类没有默认无参构造函数,struct有默认无参构造函数 ● 类支持继承,struct不支持继承 ● 类偏向于"面向对象",用于复杂、大型数据,struct偏向于"简单值",比如小于16字节,结构简单 ● 类的成员很容易赋初值,很难给struct类型成员赋初值 ● 类的实例只能通过new someclass()来创建,struct类型的实例既可以通过new somestruct()来创建,也可以通过somestruct mystruct;来创建 一、从赋值的角度体验struct和class的不同 引用类型赋值,是把地址赋值给了变量 class program { static void main(string[] args) { sizeclass sizeclass = new sizeclass(){width = 10, length = 10}; console.writeline("赋值前:width={0},length={1}", sizeclass.width, sizeclass.length); var copyofsizeclass = sizeclass; copyofsizeclass.length = 5; copyofsizeclass.width = 5; console.writeline("赋值后:width={0},length={1}",sizeclass.width, sizeclass.length); console.readkey(); } } public class sizeclass { public int width { get; set; } public int length { get; set; } } public struct sizestruct { public int width { get; set; } public int length { get; set; } } 运行结果如下图所示:以上,当把sizeclass赋值给copyofsize变量的时候,是把sizeclass所指向的地址赋值给了copyofsize变量,2个变量同时指向同一个地址。所以,当改变copyofsizeclass变量的值,也相当于改变了sizeclass的值。 struct类型赋值,是完全拷贝,在栈上多了一个完全一样的变量 class program { static void main(string[] args) { sizestruct sizestruct = new sizestruct(){length = 10, width = 10}; console.writeline("赋值前:width={0},length={1}", sizestruct.width, sizestruct.length); var copyofsizestruct = sizestruct; copyofsizestruct.length = 5; copyofsizestruct.width = 5; console.writeline("赋值后:width={0},length={1}", sizestruct.width, sizestruct.length); console.readkey(); } } 程序运行结果如下图所示:以上,当把sizestruct赋值给copyofsizestruct变量的时候,是完全拷贝,改变copyofsizestruct的值不会影响到sizestruct。 二、从参数传值角度体验struct和class的不同 引用类型参数传递的是地址 class program { static void main(string[] args) { listtemp = new list(){"my","god"}; temp.foreach(t => console.write(t + " ")); console.readkey(); } public static void changereferencetype(listlist) { list = new list(){"hello", "world"}; } } 运行结果:my god 为什么不是hello world? →栈上的temp指向托管堆上的一个集合实例 →当temp放到changereferencetype(temp)方法中,本质是把temp指向的地址赋值给了变量list →在changereferencetype(listlist)方法内部,又把变量list的指向了另外一个集合实例地址 →但temp的指向地址一直没有改变 我们再来改变changereferencetype(listlist)内部实现方式,其它不变。 class program { static void main(string[] args) { listtemp = new list(){"my","god"}; changereferencetype(temp); temp.foreach(t => console.write(t + " ")); console.readkey(); } public static void changereferencetype(listlist) { list.clear(); list.add("hello"); list.add("world"); } } 运行结果:hello world 为什么不是my god? →栈上的temp指向托管堆上的一个集合实例 →当temp放到changereferencetype(temp)方法中,本质是把temp指向的地址赋值给了变量list →在changereferencetype(listlist)方法内部,把temp和list共同指向的实例清空,又添加"hello"和"world"2个元素 →由于list和temp指向的实例是一样的,所以改变list指向的实例就等同于改变temp指向的实例 以上,很好地说明了:引用类型参数传递的是地址。 值类型struct参数传递的是值 class program { static void main(string[] args) { size s = new size(){length = 10, width = 10}; changestructtype(s); console.write("length={0},width={1}", s.length,s.width); console.readkey(); } public static void changestructtype(size size) { size.length = 0; size.width = 0; } } public struct size { public int length { get; set; } public int width { get; set; } }
不能为结构定义显示的无参数的构造方法
结构 struct
结构是值类型,(类似引用类型)
结构struct
1、结构是值类型(类是引用类型)
2、结构中可以定义字段、属性和方法
3、不能为结构中的字段赋初始值
4、结构的构造方法必须为所有字段赋值
5、不能为结构显示定义无参数的构造方法
6、结构类型的对象可以不实例化
结构是值类型(类是引用类型)
结构中不能为字段赋初始值
结构中的存在无参构造方法,但不能自己创建无参构造方法
结构的有参构造方法中必须为所有字段赋值
结构类型的对象可以不实例化
结构体注意点
结构不能初始化
结构不能显示定义无参构造函数
结构对象可以不必实例化
结构是值类型,类是引用类型
结构中字段不能有初始值
结构中不能包含显示的无参构造方法
结构的构造方法中必须为所有的字段赋值
结构类型的对象可以不用实例化,就可以访问其属性和方法
结构是值类型,类是引用类型
结构中可以定义字段、属性、方法
不能为结构中的字段赋初始值
结构中的构造方法中必须为所有字段赋值
不能为结构显式定义无参数的构造方法
结构类型的对象可以不实例化
结构是值类型,类是引用类型
结构中字段不能有初始值
结构中不能包含显示的无参构造方法
结构的构造方法中必须为所有的字段赋值
结构类型的对象可以不用实例化,就可以访问其属性和方法
结构struct
结构是值类型(类是引用类型)
结构中可以定义字段、属性、方法
不能为结构中的字段赋初始值
结构的构造方法中必须为所有字段赋值
不能为结构显示定义无参的构造方法
结构类型的对象可以不实例化