常量

const double PI = 3.1415926;

常量名命名一般使用大写字母

枚举类型

开发一个游戏,游戏角色有法师(Mage)、射手(Archer)、刺客(Assassin)、坦克(Tank)、铺助(Support)、战士(Warrior),等不同类型。

如何存储游戏角色

  • 使用int类型 :创建一套规则,提前为各个类型角色绑定一个数字标识
  • 使用枚举类型

什么是枚举类型?

枚举类型是一种特殊的值类型,可以在枚举类型中定义一组命名的数值常量。

如何声明枚举类型?

enum <enum_name>
{
value1,
value2,
value3,
...
valuen
}

默认情况下,

  • 每个枚举成员对应的数值都是int类型的
  • 按照枚举成员的生命顺序,自动按照0、1、2 ······ 进行常量赋值。

可以指定其他的整数类型代替默认类型,也可以显示指定每一位枚举成员的对应值:

public enum BorderSide : byte { Left = 1, Right, Top = 10, Bottom }

上面的开发场景利用枚举类型就可以这样来完成:

enum RoleType { Mage, Archer, Assassin, Tank, Support, Warrior }
static void Main(string[] args)
{
RoleType Top = RoleType.Tank;
Top = RoleType.Warrior;
}

  • 枚举类型的实例可以与它对应的整数值相互显式转换

  • RoleType Top = RoleType.Tank;
    int i=(int)Top; // 3
  • 也可以显式将一个枚举类型转换为另一个

  • 由于枚举类型可以和它对应的整数类型相互转换,因此枚举的真实值可能超出枚举类型成员的数值范围,在使用过程中需要考虑类型安全问题

结构体

我们日常使用的变量,一般都是某一个单一的信息,比如一个学生的信息:

age
name
grade
studylD

对于一个学生信息的话,我们怎么对这些信息进行一个整合呢?

  • 结构体

什么是结构体?

  • 结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。
  • struct 关键字用于创建结构体。

结构体的作用就是把某一类的变量进行整合,组成一个新的数据类型,相当于一个新的信息。

如何声明结构体?

struct <struct_name>
{
访问权限 type typename
访问权限 ype typename
}

关于学生信息,就可以这样来存储:

struct Studentinfo
{
public int age;
public string name;
public int grade;
public int studylD;
} static void Main(string[] args)
{
Studentinfo xiaoming = new Studentinfo();
xiaoming.age = 10;
xiaoming.grade = 1;
xiaoming.name = "小明";
xiaoming.studylD = 107963212;
Console.ReadKey();
}

结构体的构造语义如下:

  • 结构体隐式包含一个无法重写的无参数构造器。此构造函数不允许删除和重定义,并且这个无参数的构造函数会一直存在,并不会因为定义了其他带参数的构造函数就消失,这一点和类不同。

    • 构造器的作用是初始化对象,构造器也就是构造函数,通俗的讲就是你在实例化结构体也就是创建结构体对象时是new Studentinfo()还是new Studentinfo(10,1,"小明",107963212)
    • 构造函数(C# 编程指南)
  • 定义结构体的构造器时,必须显式为每一个字段赋值。

结构体构造函数(简单概述)

结构类型都有一个预定义的,没有参数的构造函数,这点与类是一样的。

看这个场景:

struct A
{
static A()
{
Console.WriteLine("I am A.");
}
public void Fun()
{ }
}
static void Main(string[] args)
{
A a = new A();
a.Fun(); //结构的实例成员被引用
Console.ReadKey();
}

输出结果为:I am A.

当你把a.Fun();注释掉以后再次运行程序你会发现程序不会输出任何东西。

那么结构体的静态构造函数何时触发呢

答案是:结构体的实例成员被引用,结构体的静态成员被引用,结构体显式声明的构造函数被调用。

就上上面说的:结构体隐式包含一个无法重写的无参数构造器。此构造函数不允许删除和重定义,并且这个无参数的构造函数会一直存在,并不会因为定义了其他带参数的构造函数就消失,这一点和类不同。

我们拿类来做比较:

struct Name
{
public string firstName;
public string lastName;
public string FullName()
{
return firstName + lastName;
}
//Name()
//{
// Console.WriteLine("无参构造函数");
//}
}
class _Name
{
public string firstName;
public string lastName;
public string FullName()
{
return firstName + lastName;
}
public _Name()
{
Console.WriteLine("无参构造函数");
}
}
static void Main(string[] args)
{
Name name = new Name();
name.firstName = "三";
name.lastName = "张";
Console.WriteLine(name.FullName());
_Name name1 = new _Name(); Console.ReadKey();
}

结构体Name中的Name()构造函数在取消注释后编译器会报错,但是当你将Name()改成带参的构造函数后编译器就不会提示错误了。这个时候,按照类的思路来讲,我们在创建结构体Name的对象时应该要完成结构体带参构造的所有字段的初始化,否则就会报错。也就是说我们在创建Name结构体对象时应该这样写:

Name name = new Name("三","张");

但是我们发现,我们写Name name = new Name();也是没问题的,之所以为问题就是因为结构体隐式包含一个无法重写的无参数构造器。

我们换到类里面,将无参的构造函数改为带参数的,此时_Name name1 = new _Name();就会报错。

此外,我们还可以发现,类的无参构造函数在初始化对象的时候就会调用,而结构体的静态默认无参构造函数则不会,只有在上述三种情况中才会被调用。

[C# 结构体](https://www.cnblogs.com/arxive/p/5799245.html)

实例构造函数(C# 编程指南)

C# 结构体(Struct)

结构体函数

struct Name
{
public string firstName;
public string lastName;
public string FullName()
{
return firstName + lastName;
}
}
static void Main(string[] args)
{
Name name = new Name();
name.firstName = "三";
name.lastName = "张";
Console.WriteLine(name.FullName());
Console.ReadKey();
}

小练习

定义一个Vector3的结构体(这个结构体可以用来表示坐标,可以表示向量),在里面定义一个Distance方法,用来取得一个向量的长度的。

冷知识:向量长度 可以百度 一个向量的长度等于他和他自己的内积的平方根

struct Vector3
{
public double x; public double y; public double z;
public double Distance()
{
return Math.Sqrt(z * z + x * x + y * y);
}
}
static void Main(string[] args)
{
Vector3 v1 = new Vector3();
v1.x = 4;
v1.y = 5;
v1.z = 6;
Console.WriteLine(v1.Distance());
Console.ReadKey();
}

委托(简单概述)

委托delegate是一种存储函数引用的类型。

委托的定义指定了一个返回类型和一个参数列表。

定义了委托之后,就可以声明该委托类型的变量,接着就可以把一个返回类型跟参数列表跟委托一样的函数赋值给这个变量。

简单来讲,委托delegate是一种存储数引用的类型。委托的定义指定了一个返回类型和一个参数列表定义了委托之后,就可以声明该委托类型的变量,接着就可以把一个返回类型跟参数列表跟委托一样的丽数赋值给这个变量。

static double Multiply(double param1, double param2)
{
return param1 * param2;
}
static double Divide(double param1, double param2)
{
return param1 / param2;
}
delegate double MyDelegate(double param1, double param2);
static void Main(string[] args)
{
MyDelegate delegate1;
delegate1 = Multiply;
Console.WriteLine(delegate1(2,4)); // 8
delegate1 = Divide;
Console.WriteLine(delegate1(4,2)); // 2
Console.ReadKey();
}

可以理解为定义声明一种特殊的函数,只有个声明,没有具体的函数体内容,函数的类型是delegate,需要用同参数类型、数量以及同返回值的函数赋值给委托变量。

internal class Program
{
delegate void OnDieDelegate();
static void PLay(OnDieDelegate onDie)
{
Console.WriteLine("做任务");
Console.WriteLine("玩家正在战斗");
Console.WriteLine("死");
if(onDie != null)
{
onDie();
}
}
static void ShowDieUI()
{
Console.WriteLine("显示游戏死亡后的UI");
Console.WriteLine("返回首页UI");
} static void Main(string[] args)
{
PLay(ShowDieUI);
PLay(null);
Console.ReadKey();
}
}

C# 常量 结构体 委托的更多相关文章

  1. swift学习笔记3——类、结构体、枚举

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  2. 初学swift笔记 结构体(八)

    import Foundation /* 和类很相似 结构体 -> 封装 属性.方法 结构体是值类型 */ //定义一个LSQ类型的结构体 关键字struct struct LSQ { var ...

  3. 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组

    一.程序 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述. 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集 ...

  4. c语言结构体&常指针和常量指针的区别

    结构体: 关系密切但数据类型不尽相同, 常指针和常量指针的区别: char * const cp : 定义一个指向字符的指针常数,即const指针,常指针. const char* p : 定义一个指 ...

  5. C语言基础知识点整理(函数/变量/常量/指针/数组/结构体)

    函数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...

  6. USRP通信的结构体和常量(上位机、下位机共用)

    fw_common.h包括了USRP固件和上位机共用的代码,寄存器地址映射.结构体定义等 #include <stdint.h> /*! * Structs and constants f ...

  7. C#中结构体与类的区别

    一.结构体和类非常相似 1,定义和使用非常相似,例子如下:public struct Student{    string Name;    int Age;}public class Questio ...

  8. C#结构体和类的区别(转)

    结构体和类的区别:    在做一个项目时,使用了较多的结构体,并且存在一些结构体的嵌套,即某结构体成员集合包含另一个结构体等,总是出现一些奇怪的错误,才终于下决心好好分析一下到底类和结构体有啥不同,虽 ...

  9. C语言中的结构体

    用户自己建立自己的结构体类型 1.  定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...

  10. swift 的枚举、结构体、类

    一.Swift的枚举 枚举是一系相关联的值定义的一个公共的组类型,同时能够让你在编程的时候在类型安全的情况下去使用这些值.Swift中的枚举比OC中的枚举强大得多, 因为Swift中的枚举是一等类型, ...

随机推荐

  1. [ABC145F] Laminate

    2023-02-25 题目 题目传送门 翻译 翻译 难度&重要性(1~10):6 题目来源 AtCoder 题目算法 dp 解题思路 引子:积木大赛 可以发现当 \(k=1\) 时,就是积木大 ...

  2. 史上最强.NET数据分页方法

    [前言] 本文讲述的.NET数据分页方法为[史上最强],已被多家大型科技公司实战采用 & 也被圈内多家知名IT培训机构转载收藏. [正文] 支持.Net Core(2.0及以上)与.Net F ...

  3. 在 Visual Studio 2022 中使用文件对比

    在最新版本的 Visual Studio 2022 中,加入了新的功能特性--"文件对比". 在开发过程中,开发人员有时会需要比对文件差异,特别是代码文件,之前很多时候是借助版本控 ...

  4. Windows 虚拟地址 到底是如何映射到 物理地址 的?

    一:背景 1. 讲故事 我发现有很多的 .NET程序员 写了很多年的代码都没弄清楚什么是 虚拟地址,更不用谈什么是 物理地址 以及Windows是如何实现地址映射的了?这一篇我们就来聊一聊这两者之间的 ...

  5. python如何提取浏览器中保存的网站登录用户名密码

    python如何提取Chrome中的保存的网站登录用户名密码? 很多浏览器都贴心地提供了保存用户密码功能,用户一旦开启,就不需要每次都输入用户名.密码,非常方便.作为python脚本,能否拿到用户提前 ...

  6. 9k+ Star 简洁好用的开源 Linux 运维管理面板

    如果你的公司需要进行服务器运维管理,那么运维管理面板就是一个不可或缺的需求.因为并非每一位运维工程师都能在命令行下游刃有余,不需要借助辅助工具就能确保服务器安全.流畅运行.尤其是对于刚刚踏入运维领域的 ...

  7. Redis漏洞总结--未授权--沙箱绕过--(CNVD-2015-07557)&&(CNVD-2019-21763)&&(CVE-2022-0543)

    Redis未授权--沙箱绕过--(CNVD-2015-07557)&&(CNVD-2019-21763)&&(CVE-2022-0543) 环境复现 采用Vulfocu ...

  8. Llama2-Chinese项目:3.1-全量参数微调

      提供LoRA微调和全量参数微调代码,训练数据为data/train_sft.csv,验证数据为data/dev_sft.csv,数据格式如下所示: "<s>Human: &q ...

  9. CentOS7 Ceph分布式集群部署

    CentOS 7 下安装Ceph-nautilus 本问主要记录在CentOS 7下如何安装Ceph-nautilus,安装过程中遇到的一些问题及解决方法. 1.Ceph实验准备 以下是本次实验所用到 ...

  10. Shader学习笔记 (一) :利用shader在一个面绘制出圆

    在各种游戏中,想必大家一定和我一样总是惊叹于游戏画面的各种炫酷的特效. 作为游戏开发中单独列出的一个职业TA(Technology Art),他们会利用GLSL或者HLSL等着色器语言绘制出一幅幅美丽 ...