*枚举类型enum:
• 他是一个 被命名的 整形常量 的集合
• 作用:限制一个变量只能从指定的几个值里选一个,让代码更规范、语义更清晰
• 使用步骤:
-
申明枚举 相当于创建一个自定义的枚举类型
-
申明枚举变量 使用申明的自定义枚举类型 创建一个枚举变量
• 申明枚举注意:
枚举要定义在 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.从值类型和引用类型赋值时的区别上去考虑,比如经常被赋值传递的对象,并且改变赋值对象,原对象不想跟着变化时,就用结构体。比如坐标、向量、旋转等等

738

被折叠的 条评论
为什么被折叠?



