2019.8.20 1.C#中this.關鍵字的應用 2.枚舉類的定義和簡單調用 3.struct(結構體)與Class(類)的定義與區別

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、如果是引用类型,当两个对象指向同一个地方,修改某一个的时候,其它对象的值会发生改变

posted @ 2019-08-20 23:48  自長安的李少俠  阅读(137)  评论(0编辑  收藏  举报