C# 学习教程七
2014-01-12 18:25
453 查看
结构可以实现接口,但它们无法继承另一个结构。因此,结构成员无法声明为 protected。
结构还可以包含构造函数、常量、字段、方法、属性、索引器、运算符、事件和嵌套类型,但如果同时需要上述几种成员,则应当考虑改为使用类作为类型。
struct myBook
{
public int price;
}
myBook mybook;
mybook.price=10;
1,结构是值类型,类是引用类型
注:a,值类型在堆栈上分配地址,引用类型在堆上分配地址(堆栈的执行效率比堆高,但是堆栈的资源有限,适用于简单的逻辑 处理,如:基本类型中int 对应的 system.Int32等都是结构)
b,值类型的赋值可以创造新的值类型,而引用类型之间的赋值是复制引用的地址
c,结构和类的基类都是object,c#所有的类型的基类都是object
d,虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用new,那么在初始化所有 字段之前,字段将保持未赋值状态,且对象不可用
2, 结构(struct)不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed
类(class)完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
注:结构可以使用和类相同的办法继承接口(有点奇怪)
3,和类相比,结构没有默认的构造函数,但可以添加构造函数,没有析构函数,因为不能继承,所以没有abstruct和sealed 不能用proteced修饰, 并且可以不用new初始化,结构中不能初始化字段。
实例代码:
效果截图
1.struct 是值类型,class 是对象类型
2.struct 不能被继承,class 可以被继承
3.struct 默认的访问权限是public,而class 默认的访问权限是private.
4.struct总是有默认的构造函数,即使是重载默认构造函数仍然会保留。这是因为Struct的构造函数是由编译器自动生成的,但是如果重载构造函数,必需对struct中的变量全部初始化。并且Struct的用途是那些描述轻量级的对象,例如Line,Point等,并且效率比较高。class在没有重载构造函数时有默认的无参数构造函数,但是一被重载些默认构造函数将被覆盖。
5.struct的new和class的new是不同的。struct的new就是执行一下构造函数创建一个新实例再对所有的字段进行Copy。而class则是在堆上分配一块内存然后再执行构造函数,struct的内存并不是在new的时候分配的,而是在定义的时候分配
结构可以实现接口,但它们无法继承另一个结构。因此,结构成员无法声明为 protected。
结构还可以包含构造函数、常量、字段、方法、属性、索引器、运算符、事件和嵌套类型,但如果同时需要上述几种成员,则应当考虑改为使用类作为类型。
struct myBook
{
public int price;
}
myBook mybook;
mybook.price=10;
1,结构是值类型,类是引用类型
注:a,值类型在堆栈上分配地址,引用类型在堆上分配地址(堆栈的执行效率比堆高,但是堆栈的资源有限,适用于简单的逻辑 处理,如:基本类型中int 对应的 system.Int32等都是结构)
b,值类型的赋值可以创造新的值类型,而引用类型之间的赋值是复制引用的地址
c,结构和类的基类都是object,c#所有的类型的基类都是object
d,虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用new,那么在初始化所有 字段之前,字段将保持未赋值状态,且对象不可用
2, 结构(struct)不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed
类(class)完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
注:结构可以使用和类相同的办法继承接口(有点奇怪)
3,和类相比,结构没有默认的构造函数,但可以添加构造函数,没有析构函数,因为不能继承,所以没有abstruct和sealed 不能用proteced修饰, 并且可以不用new初始化,结构中不能初始化字段。
实例代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Hello_World { public class Conversion { public static void Main(string[] args) { CPerson cp1 = new CPerson("Zhang San", 23); SPerson sp1 = new SPerson("Zhang San", 23); Console.WriteLine("First Class:cp1:" + cp1.ToString()); //输出:First Class:cp1:Name:Zhang San,Age:23 Console.WriteLine("First Struct: sp1:" + sp1.ToString()); //输出:First Struct: sp1:Name:Zhang San,Age:23 CPerson cp2 = cp1;//cp2引用cp1 SPerson sp2 = sp1;//cp2的值为cp1内的值 Console.WriteLine("Second Class:cp2:" + cp2.ToString()); //输出:Second Class:cp2:Name:Zhang San,Age:23 Console.WriteLine("Second Struct: sp2:" + sp2.ToString()); //输出:Second Struct: sp2:Name:Zhang San,Age:23 Console.ReadKey(); Console.WriteLine("Change First Class And Struct:"); //改变值: cp1.Name = "Wang Wu"; cp1.Age = 100; sp1.Name = "Wang Wu"; sp1.Age = 100; Console.WriteLine("Afte Change first Class cp1:" + cp1.ToString()); //输出:Afte Change first Class cp1: cp1:Name:Wang Wu,Age:100 Console.WriteLine("Afte Change first Struct sp1:" + sp1.ToString()); //输出:Afte Change first Struct sp1:Name:Wang Wu,Age:100 Console.WriteLine("Afte Change First Class, Second Class cp2:" + cp2.ToString()); //输出:Afte Change First Class, Second Class cp2:Name:Wang Wu,Age:100 //------------------------------------------------------------------------------------------------------------ //值类型: Console.WriteLine("Afte Change First Struct, Second Struct sp2:" + sp2.ToString()); //输出:AAfte Change First Struct, Second Struct sp2:Name:Zhang San,Age:23 //------------------------------------------------------------------------------------------------------------- Console.ReadKey(); } struct SPerson { //public SPerson(){}//Error:结构不能包含显式的无参数构造函数 public SPerson(string name, int age) { this.name = name; this.age = age; } //public int =2; //Error:类、结构或接口成员声明中的标记“=”无效 private string name; private int age; public string Name { get { return name; } set { name = value; } } public int Age { get { return age; } set { this.age = value; } } public override string ToString() { return string.Format("Struct:Name:{0},Age:{1}", this.name, this.age); } } class CPerson { public CPerson() { } public CPerson(string name, int age) { this.name = name; this.age = age; } private string name; private int age; public string Name { get { return name; } set { name = value; } } public int Age { get { return age; } set { age = value; } } public override string ToString() { return string.Format("Class:Name:{0},Age:{1}", this.name, this.age); } } } }
效果截图
1.struct 是值类型,class 是对象类型
2.struct 不能被继承,class 可以被继承
3.struct 默认的访问权限是public,而class 默认的访问权限是private.
4.struct总是有默认的构造函数,即使是重载默认构造函数仍然会保留。这是因为Struct的构造函数是由编译器自动生成的,但是如果重载构造函数,必需对struct中的变量全部初始化。并且Struct的用途是那些描述轻量级的对象,例如Line,Point等,并且效率比较高。class在没有重载构造函数时有默认的无参数构造函数,但是一被重载些默认构造函数将被覆盖。
5.struct的new和class的new是不同的。struct的new就是执行一下构造函数创建一个新实例再对所有的字段进行Copy。而class则是在堆上分配一块内存然后再执行构造函数,struct的内存并不是在new的时候分配的,而是在定义的时候分配
相关文章推荐
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 读书笔记:W3CSchool学习教程-C#教程(上)
- C#学习教程之四
- C#学习笔记(4)_C#教程
- C#教程第7讲委托1(学习笔记)
- C#学习-图解教程(1):格式化数字字符串
- c#2.0泛型学习(一) _C#教程
- 读书笔记:W3CSchool学习教程-C#教程(下)
- C#入门教程(一)–.Net平台技术介绍、C#语言及开发工具介绍-打造C#学习教程
- C#学习笔记(4)_C#教程
- C# 多线程教程(C#学习日记 2017-10-16)
- Java C# C\C++ 数据库等等计算机精品学习资料以及视频教程
- C# 学习黑马.Net视频教程,大文件拷贝
- 第十讲 : 面向对象编程简介 【天轰穿.Net4趣味编程系列视频教程-vs2010轻松学习C#】
- C#教程第5讲方法1(学习笔记)
- 《C#高级教程》学习笔记7
- 第十一讲 : 类和对象的使用【天轰穿.Net4趣味编程系列视频教程-vs2010轻松学习C#】
- 第十二讲 : 封装&类成员【天轰穿.Net4趣味编程系列视频教程-vs2010轻松学习C#】
- 第三讲:C#前置知识-【天轰穿.Net4趣味编程系列视频教程-vs2010轻松学习C#】
- C# 学习教程之一