C#枚举类型、object类型、值类型、引用类型、结构体

*枚举类型enum:

• 他是一个 被命名的 整形常量 的集合

• 作用:限制一个变量只能从指定的几个值里选一个,让代码更规范、语义更清晰

• 使用步骤:

  1. 申明枚举 相当于创建一个自定义的枚举类型

  2. 申明枚举变量 使用申明的自定义枚举类型 创建一个枚举变量

• 申明枚举注意:

枚举要定义在 namespace 语句块中(常用) 也可以在class语句块中 结构体struct 语句块中

枚举名字以大写字母开头

• 语法:

enum E_自定义枚举名字

{

枚举成员1, //枚举中包裹的 整型常数 第一个默认值是0(也可以自己设置) 下面的会依次累增

枚举成员2 ,... ,

枚举成员n

}

• 定义枚举类型的变量格式:

枚举的名字 变量名 = 枚举的名字.枚举成员; //写在函数里

枚举和switch是天生一对

枚举可以和 int (括号强转) string (.Tostring()) 可以相互转换 Enum就是枚举类型 qqType = ( 想要转成的枚举名字)Enum.Parse(typeof( 想要转成的枚举名字)," 用于转换的 枚举成员");

转换完毕后 是一个同一类型 我们需要用括号强转成我们想要的目标枚举类型

internal class Program
{
    /// <summary>
    /// QQ状态枚举
    /// </summary>
    enum E_QQType
    {
        /// <summary>
        /// 在线
        /// </summary>
        OnLine,
        /// <summary>
        /// 离开
        /// </summary>
        Leave,
        /// <summary>
        /// 忙
        /// </summary>
        Busy,
        /// <summary>
        /// 隐身
        /// </summary>
        Invisible
    }
    enum E_xbk
    { 
        chaodabei,
        dabei,
        zhongbei,  
    }
    static void Main(string[] args)
    {
        //1.
        try
        {
            Console.WriteLine("请输入QQ状态(0是在线,1是离开,2忙,3隐身)");
            int type = int.Parse(Console.ReadLine());
            E_QQType qqType = (E_QQType)type;
            Console.WriteLine(qqType);
        }
        catch
        { Console.WriteLine("请输入数字"); }
        //2.
        try
        {
            Console.WriteLine("请输入购买类型,中杯0大杯1超大杯3");
            int lx = int.Parse(Console.ReadLine());
            E_xbk xbk = (E_xbk)lx;
            switch (xbk)
            {
                case E_xbk.chaodabei:
                    Console.WriteLine("你购买了超大杯,花费43元");
                    break;
                case E_xbk.dabei:
                    Console.WriteLine("你购买了大杯,花费40元");
                    break; 
                case E_xbk.zhongbei:
                    Console.WriteLine("你购买了中杯,花费35元");
                    break;
                default:
                    Console.WriteLine("请输入正确类型");
                    break;
            }
        }
        catch
        { Console.WriteLine("请输入数字"); }
    }
}

*object类型 对象类型:

1.object类型是所有类型的父类型,也就是说,object类型可以存储任意的数据类型,对象是C#中所有数据类型的终极基类(父类),可以理解为:object为任意类型

2.我们可以定义自己的对象(自己的类),存储一系列相关的数据

*值类型 和引用类型:

之前学过的变量类型: 无符号(byte ushort uint ulong) 有符号(sbyte short int long) 浮点数(float double decimal) 特殊类型(bool char string) 复杂数据类型: enum枚举 数组(一维,二维,交错)

把以上 学过的 变量类型 分成 值类型 和引用类型

引用类型: string 数组 类 null interface(接口类型)

值类型: 其他的 结构体 枚举

值类型和引用类型的区别
//1.使用上的区别
//值类型
int a = 10;
//引用类型
int[] arr = new int[] { 1, 2, 3, 4 };
//申明了一个b让其等于之前的a
int b = a;
//申明了一个arr2让其等于之前的arr
int[] arr2 = arr;
Console.WriteLine("a={0},b={1}",a,b);//a=10,b=10
Console.WriteLine("arr[0]={0},arr2[0]={1}", arr[0], arr2[0]);//arr[0]=1, arr2[0]=1 
b = 20;
arr2[0] = 5;
Console.WriteLine("修改了b和arr2[0]之后");
Console.WriteLine("a={0},b={1}", a, b);//a=10,b=20
Console.WriteLine("arr[0]={0},arr2[0]={1}", arr[0], arr2[0]);//arr[0]=5, arr2[0]=5
//区别
//值类型在相互赋值时 把内容拷贝给了对方 它变我不变
//引用类型的相互赋值 是 让两者指向同一个值 它变我也变
//2.为什么有以上区别
//值类型 和 引用类型 存储在的内存区域 是不同的 存储方式不同的,所以就造成了 他们在使用上的区别
//值类型的变量存储的就是值本身(存储在栈中)
//引用类型的变量存储的是数据的内存地址(存储在堆中,变量保存的是内存地址)
//值类型 存储在 栈空间---系统分配,自动回收,小而快
//引用类型 存储在 堆空间---手动申请和释放,大而慢
​
//new 了 就是开了新房间 和之前的 没有什么关系了 所以arr不会改变  
ar2 = new int[] { 99, 3, 2, 1 };
Console.WriteLine("arr[0]={0},arr2[0]={1}", arr[0], arr2[0]);//arr[0]=5, arr2[0]=99
​
//string  它变我不变
//因为string 是引用类型 按理说应该是它变我也变 但string非常的特殊 vs对他进行了一些特殊处理 它具备 值类型的特征 它变我不变
 string stri = "123";
 string stri2 = stri;
 stri2 = "321";
 Console.WriteLine(stri);//123
 internal class Program
    {
        static void Main(string[] args)
        {
            int a = 10;
            int b = a;
            a = 2;
            Console.WriteLine(a);//2
            Console.WriteLine(b);//10
            //先去定义一个类
            //定义变量
            Book b1 = new Book();
            b1.BookName = "西游记";
            Console.WriteLine(b1.BookName);//西游记
            //b1 赋给b2之后,再次给b1.Bookname赋值,输出的是再次赋值后的结果,因为存储的是内存地址,不是值,同理改变b2也是
            Book b2 = b1;
            b1.BookName = "红楼梦";
            Console.WriteLine(b2.BookName);//红
            Console.WriteLine(b1.BookName);//红
            b2.BookName = "三国演义";
            Console.WriteLine(b2.BookName);//三国演义
            Console.WriteLine(b1.BookName);//三国演义
            //string 引用类型  他是一个特殊的引用类型  vs对他进行了一些特殊处理
            //和值类型相同
            string s1 = "吴亦";
            string s2 = s1;
            s1 = "罗志";
            Console.WriteLine(s1);//罗
            Console.WriteLine(s2); //吴
        }
    }//定义一个类
    class Book
    { public string BookName; }

*结构体:struct

namespace _结构体
{
     知识点一 基本概念
    //结构体 是一种自定义变量类型 类似枚举需要自己定义
    //它是 数据和函数 的集合 可以声明各种变量和方法
    //结构体 可以让单一的变量存储多个数据(值类型)
    //用法和形式和 类基本相同,可以存储字段,属性,方法,可以理解为:结构体 是值类型的 对象
    //作用:用来表现存在关系的数据集合 比如用结构体表现学生 动物 人等
     知识点二 基本语法
    //结构体的使用分为两步:1.结构体声明  2.结构体的创建
    //1.结构体的声明(类似于类的声明)     
    //结构体一般写在namespace 语句中  关键字struct
    /*
     * 格式: struct 结构体的名字(帕斯卡命名法)
     * {
     *    结构体成员(
     *    第二部分:构造函数(可选) 
     *    第三部分:函数(也可选) )
     * }
     */
     知识点三 实例
    struct Student
    {
       //第一部分:变量
       //结构体声明的变量 不能直接初始化 只能在外部或者函数中初始化
       //变量类型 可以写任意类型 包括结构体 但是不能写自己的结构体
       //Student s;不能是自己的结构体
       //年龄
       public int age;
       //性别
       public bool sex;
       //学号
       public int number;
       //姓名
       public string name;
​
       //第二部分:构造函数(可选)
       知识点六 结构体的构造函数
        //基本概念
        //1.没有返回值 可以重载
        //2.函数名必须和结构体名相同
        //3.必须有参数
        //4.如果申明了构造函数 那么必须在其中对所有变量数据初始化
        //作用:帮助我们快速初始化结构对象的
        //构造函数 一般是用于在外部方便初始化的
        public Student(int age, bool sex, int number, string name) 
        { 
            //新的关键字 this
            //代表自己
            this.age=age;
            this.sex =sex;
            this.number = number;
            this.name = name;
        }
        
        //第三部分:函数(也可选)
        //表现这个数据结构的行为
        //注意 在结构体中的方法 目前不需要加static关键字
        public void Speak()
        {
            //函数中可以直接使用结构体内部申明的变量
            Console.WriteLine("我的名字{0},我今年{1}岁", name, age);
        }
        //可以根据需求 写无数个函数的
    }
​
     知识点五 访问修饰符
    //修饰结构体中变量和方法 是否能够被外部使用
    //public 公共的 可以被外部访问
    //private  私有的  只能在内容使用
    //默认不写 为private
​
    internal class Program
    {
        static void Main(string[] args)
        {
            知识点四 结构体的使用
            //2.结构体的创建   变量类型 变量名;
            Student s1;
            s1.age = 10; 
            s1.sex = true;
            s1.name = "张";
            s1.number = 1;
            s1.Speak();
            Student s2 = new Student(18, true, 2, "小红");
            s2.Speak();
        }
    }
// 类和结构体的区别:
//1.结构体是值类型,类是引用类型
//2.结构体存在栈中,类存在堆中
//3.结构体成员不能使用protected访问修饰符,而类可以
//4.结构体成员变量申明不能指定初始值,而类可以
//5.结构体不能申明无参的构造函数,而类可以
//6.结构体申明有参构造函数后,无参构造不会被顶掉
//7.结构体不能申明析构函数,而类可以
//8.结构体不能被继承,而类可以
//9.结构体需要在构造函数中初始化所有成员变量,而类随意
//10.结构体不能被静态static修饰(不存在静态结构体),而类可以
//11.结构体不能在自己内部申明和自已一样的结构体变量,而类可以
// 如何选择结构体和类
//1.想要用继承和多态时,直接淘汰结构体,比如玩家、怪物等等
//2.对象是数据集合时,优先考虑结构体,比如位置、坐标等等
//3.从值类型和引用类型赋值时的区别上去考虑,比如经常被赋值传递的对象,并且改变赋值对象,原对象不想跟着变化时,就用结构体。比如坐标、向量、旋转等等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MM_MS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值