Day12_复杂数据类型_常量_枚举_结构

主要内容

  • 小复习
  • 常量
  • 枚举
  • 结构

小复习

  • 常见变量类型

    • int/double/string/char/bool/decimal
  • 变量使用规则:

    • 声明$\rightarrow$赋值$\rightarrow$使用
  • 命名规则

    • Camel 和 Pascal
  • 运算符

    • 赋值: =
    • 复合赋值: += -= *= /= %=
    • 算数: + - * / % ++ –
    • 关系: > < >= <= == !=
    • 逻辑: && || !
  • 语法结构

    • 分支结构: if if-else
    • 选择结构: while do-while for

常量

  • 区别于变量, 常量是恒定的值, 不能被重新赋值
  • 语法:
const 数据类型 常量名称 = 初始赋值; 
  • 特点:
    • 不能被重新赋值

枚举

  • 语法:
[public] enum 枚举名
{
    值1,
    值2,
    ...
} 
  • 语法解释

    • []中括号代表可以省略(别把中括号写出来!)
    • public访问修饰符. public是权限最高(或者也可以说是没有权限), 任何地方都可以访问(与private相对比)
    • enum是关键字, 用于声明枚举(其缩写为 Enumerate)
    • 枚举名要符合Pascal命名规范
  • 意义

例如学员管理时, 要定义性别
不同程序员命名时, 可能出现如下情况

char gender = ‘男’;
string s1 = “female”;
bool b = true;

为了统一样式, 可以将枚举声明在 命名空间内 & 类的外面
使得所有的类都是用统一的变量类型

  • 特点:

    • enum同int等变量类型一致, 都是用于存储数据
    • 区别仅在于变量的使用方式
    • 相当于自定义一种变量类型
    • 注意是点(.) 出来的
  • 实例

namespace NAME
{
    public enum Seasons
    {
        春,
        夏,
        秋,
        冬
    }

    class class1
    {
        static ... Main ...
        {
            Season thisMonth = Seasons.夏
            // 最后输出的就是"夏"
        }
    }
}

枚举类型和int/string类型之间的转换

  • 枚举类型默认可以和int类型互相转换
  • 即, 两者兼容
public enum QQstate
{
    OnLine,
    OffLine,
    Leave = 9,
    Busy,
    QMe
}
  • 枚举类型转换int类型
QQstate state = QQstate.OnLine;
int n = (int)state//隐式转换
Console.WriteLine(n);
Console.WriteLine((int)QQstate.OffLine);
Console.WriteLine((int)QQstate.Leave);
Console.WriteLine((int)QQstate.Busy);
Console.WriteLine((int)QQstate.QMe);

结果为
0 1 9 10 11

  • int转换枚举类型
int n1 = 1
QQstate state = (QQstate)n1;
Console.WriteLine(state);
Console.WriteLine((QQstate)8);

结果为
OffLine 8
注意隐式失败不报错

  • 注意: 所有类型都能转为string类型

  • 调用.toString()就可以

  • 字符串string转换为枚举类型较为麻烦

  • 因为两者不兼容

  • 此时应当调用Enum.parse(string1)

string s1 = "3";
string s2 = "夏";
string s3 = "99";
string s4 = "夏天";
Season month1 = (Season)Enum.Parse(typeof(Season), s1);
Season month2 = (Season)Enum.Parse(typeof(Season), s2);
Season month3 = (Season)Enum.Parse(typeof(Season), s3);
Season month4 = (Season)Enum.Parse(typeof(Season), s4);
Console.WriteLine(month1);
Console.WriteLine(month2);
Console.WriteLine(month3);
Console.WriteLine(month4);

结果很amazing
1: 冬
2: 夏
3: 99
4: 抛异常

  • 注意: 数字不能转换返回数字本身; 文本不对应就会抛异常

结构

大学管理系统
要求数据: 姓名 性别 年龄 年级
问题是: 需要上千个变量

  • 意义: 结构可以一次性声明多个变量
  • 语法:
[public] struct 结构名
{
  成员;//可以理解为变量
}
  • 注意: 放置的位置和枚举enum一样
  • 举例:
public struct Person
{
  public string _name;//成为字段
  public int _age;
  public char _gender;
}
Person zsPerson;
zsPerson._name = "张三";
zsPerson._age = 21;
zsPerson._gender = '男';

Person lsPerson;
lsPerson._name = "李四";
lsPerson._age = 22;
lsPerson._gender = '男';

即 面向对象 编程(现在只能说很类似)

  • 字段变量 最本质的区别
    • 变量在程序运行的过程中, 只能存放一个值
    • 字段可以存储多个值
  • 注意: 字段命名时一定记得加下划线

练习

  • 给定一个叫MyColor的结构, 包含三个int成员red, blue, green
  • 声明一个MyColor类型的变量, 为其成员赋值, 使之表示红色
public struct Mycolor
{
    public int _red;
    public int _green;
    public int _blue;
}
class Class1
{
    static void Main(string[] args) 
    {  //代码从这里走起

        Mycolor mc;
        mc._red = 255;
        mc._green = 0;
        mc._blue = 0;

    }
}

感想: 看似复杂无意义, 实际上是为了规范而发明的
当所有成员的代码组合起来的时候, 规范才有了意义
团队是合作的, 而非个人solo