2019.8.20
開始不定時複習C#和Unity3D
C#中this.關鍵字的應用(搜到一共有四種用法,這裡只寫最常用的用法):this代表當前類的實例對象
1 namespace Demo 2 { 3 public class Test 4 { 5 private string scope = "全局变量"; 6 public string getResult() 7 { 8 string scope = "局部变量"; 9 // this代表Test的实例对象 10 // 所以this.scope对应的是全局变量 11 // scope对应的是getResult方法内的局部变量 12 return this.scope + "-" + scope; 13 } 14 } 15 16 class Program 17 { 18 static void Main(string[] args) 19 { 20 try 21 { 22 Test test = new Test(); 23 Console.WriteLine(test.getResult()); 24 } 25 catch (Exception ex) 26 { 27 Console.WriteLine(ex); 28 } 29 finally 30 { 31 Console.ReadLine(); 32 } 33 34 } 35 } 36 }
枚舉類的定義和簡單調用:
1 //枚举-限定变量的可能性 2 enum Days 3 { 4 Monday, 5 Tuesday, 6 Wenesday, 7 Thursday, 8 Friday, 9 Saturday, 10 Sunday 11 }
1 Console.WriteLine(Days.Monday);
struct(結構體)與Class(類)的定義與區別:
1、struct 结构与class(类)的区别
1)struct是值类型,class是对象类型
2)struct不能被继承,class可以被继承
3)struct默认访问权限是public,而class默认是private
5) struct不能由程序员申明构造函数,有编辑器自动生成,用于描述轻量级对象,执行效率高,例如:Line,Point等
6)struct的new和class的new是不同的,struct的new就是执行一下构造函数创建一个实例,再对所有字段进行复制。
而class则是在堆上分配一块内存再执行构造函数,struct内存并不是在new的时候分配的,而是是定义的时候分配。
7)struct 可以不用new来实例化,而类却要,如果struct不用new来实例化,那么结构的所有字段处于未分配状态。
2、验证struct和class的区别
1)struct是否可被class继承
/// <summary> /// 定义一个结构 /// </summary> struct WinPoint { public int Left; public int Right; } /// <summary> /// 定义一个类 /// </summary> class TestClass: WinPoint { public int Left; public int Right; }
这样,TestClass类继承结构是不行的,编译时报错如下
2)struct是否可被struct继承
/// <summary> /// 定义一个结构 /// </summary> public struct WinPoint { public int Left; public int Right; } /// <summary> /// 再定义一个结构 /// </summary> public struct WinPoint1: WinPoint { }
struct不能被另一个struct继承,编译时报错如下:
3)class是否可被class继承
/// <summary> /// 定义一个父类 /// </summary> public class TestClass { public int Left; public int Right; } /// <summary> /// 定义一个子类,继承父类属性 /// </summary> public class TestClass1 : TestClass { }
在使用的时候,可以调用父类的属性
public void TestClick(){ TestClass1 test1 = new TestClass1(); test1.Left = 10; test1.Right = 20; }
4)struct在方法传递是否是副本
类和结构的创建
/// <summary> /// 定义一个结构 /// </summary> public struct TheStruct { public int Left; public int Right; } /// <summary> /// 定义一个类 /// </summary> public class TheClass { public int Left; public int Right; } public class TestClass { /// <summary> ///赋值方法(结构) /// </summary> /// <param name="thestruct"></param> public static void StructTaker(TheStruct thestruct) { thestruct.Left = 20; thestruct.Right = 30; } /// <summary> /// 赋值方法(类) /// </summary> /// <param name="theclass"></param> public static void ClassTaker(TheClass theclass) { theclass.Left = 20; theclass.Right = 30; } }
调用的方法
private void btnTest_Click(object sender, EventArgs e) { //创建一个机构实例对象 TheStruct stu = new TheStruct(); //赋初始值 stu.Left = 1; //创建一个类实例对象 TheClass cla = new TheClass(); cla.Left = 1; //重新给机构和类赋值 TestClass.StructTaker(stu); //调用方法,重新设置为20 TestClass.ClassTaker(cla); //调用方法,重新设置为20 //输出结构 MessageBox.Show("结构stu.Left:"+stu.Left+",类cla.Left:"+cla.Left); }
最后的弹出结果,如下图
刚开始都初始化为Left的值为1,重新赋值为20时,机构的Left没有改变,类的Left改变了,这就证明当一个结构传递到一个方法时,被传递的只不过是一个副本,
而一个类被传递,被传递是一个引用对象地址。
2.
Struct和Class的区别实际上是,引用类型和值类型的区别。
引用类型如:string,Object,class等总是在从托管堆上分配的,C#中new操作符返回对象的内存地址--也就是指向对象数据的内存地址;
以下是值类型与引用类型的表:
我们来看下面一段代码:
首先在类中声明一个class类,和一个struct结构,如图:
并使用在程序入口调用它们,如图:
现在我们来看一看,它们在内存当中是如何存储的?
从这张图可以看出,class(类)实例化出来的对象,指向了内存堆中分配的空间
struct(结构) 实例化出来的对象,是在内存栈中分配
接下来,我们再来在上面的程序做如下修改:
红框,代码定义一个class实例化对象s2,然后把对象s1赋值给s2
蓝框,代码定义一个结构实例化对象r2,然后把对象r1赋值给r2
那它们输出的结果是多少呢?请选择( )
A、 s1的值为:12 s2的值为222
r1的值为:16 r2的值为666
B、 s1的值为:12 s2的值为222
r1的值为:666 r2的值为666
C、 s1的值为:222 s2的值为222
r1的值为:16 r2的值为666
D、 s1的值为:222 s2的值为222
r1的值为:666 r2的值为666
点击查看答案
正确答案是:C
为什么会这样呢?所以我们来看一看,多个值类型和引用类型在内存里面是如何存储的,如图:
从图中,可以看出,两个引用类型 s1,s2都指向了同一个拖管堆上的空间,
当某一个发生改变的时候,其于的会发生变化
而结构是值类型,虽然使用r2=r1,把r1对象赋值给r2,
但是它会在线程栈中分配一个独立的空间,
当修改某一个对象的值的时候,不会影响到另一个对象
所以,值类型和引用类型的区别就是:
1、它们存储的位置不一样
2、如果是引用类型,当两个对象指向同一个地方,修改某一个的时候,其它对象的值会发生改变