C# 常量 结构体 委托

这篇具有很好参考价值的文章主要介绍了C# 常量 结构体 委托。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

常量

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;
}

C# 常量 结构体 委托

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

  • 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# 常量 结构体 委托

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

C# 常量 结构体 委托

[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,需要用同参数类型、数量以及同返回值的函数赋值给委托变量。文章来源地址https://www.toymoban.com/news/detail-431831.html

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# 常量 结构体 委托的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C#学习笔记】委托与事件 (从观察者模式看C#的委托与事件)

    转载请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/134655722 作者:CSDN@|Ringleader| 主要参考: 委托(C# 编程指南) 事件介绍 C# 中的委托和事件简介 Delegate 类 Exploring the Observer Design Pattern微软技术文章翻译 委托是一种 引用类型 ,表示对具有特定参数列表和返回类型

    2024年02月04日
    浏览(47)
  • 【c#】判断double值是否等于NaN

    运行结果: b=1.1 c=NaN b==double.NaN: False double.IsNaN(b): False c==double.NaN: False double.IsNaN( c): True

    2024年02月10日
    浏览(50)
  • c# 事件与委托

    //在C#中, 事件是一种特殊的委托 ,它允许对象通知其他对象发生了某个特定的事件。 //事件通常用于GUI应用程序中,例如当用户单击按钮时,按钮控件会引发Click事件, //然后其他对象可以订阅该事件并执行相应的操作。 //以下是一个简单的示例,演示如何在C#中使用事件和

    2024年02月06日
    浏览(39)
  • C#编程-实现委托

    委托是可以存储对方法的引用的对象。在C#中,委托允许您动态地改变类中方法的引用。 考虑咖啡售货机的示例,它配置不同口味的咖啡,例如卡布奇诺咖啡和黑咖啡。在选择所需口味的咖啡时,售货机决定混合各种成分,例如奶粉、咖啡粉、热水、卡布奇诺咖啡粉。所有的

    2024年02月02日
    浏览(36)
  • C#之委托

    目录 一、简介 (一)概述 (二)类与委托 二、声明委托 三、使用委托 (一)创建委托对象 (二)使用委托 四、简单的委托示例 五、Action[T]和Func[T]委托 六、多播委托 七、匿名方法         委托时寻址方法的.NET版本。在C++中,函数指针只不过是一个指向内存位置的指

    2024年01月18日
    浏览(35)
  • c#委托详解

    委托是一种能够将方法作为参数传递、存储方法并且调用方法的类型,它可以让我们写出更加灵活和可扩展的代码。委托通常用于回调 (Callback) 机制,比如在事件处理、异步编程、LINQ 查询等场景中常常会使用委托。它可以将方法作为参数传递给其他方法,从而在需要的时候

    2023年04月08日
    浏览(28)
  • C#基础--委托

    C#基础–委托 简单说它就是一个能把方法当参数传递的对象,而且还知道怎么调用这个方法,同时也是粒度更小的“接口”(约束了指向方法的签名) 跟方法有点类似,有参数,返回值,访问修饰符+ delegate 委托的本质是一个类,继承自一个特殊类 MulticastDelegate ,我们自己在

    2024年02月16日
    浏览(41)
  • C#的Func(委托)

    在 C# 中,Func 是一个泛型委托类型,用于表示一个具有返回值的方法或 lambda 表达式。 Func 可以接受 0~16 个输入参数,其最后一个泛型参数表示返回值类型。例如,Func 表示一个不接受参数,返回整数类型的方法。 以下是一个 Func 的简单例子: 在上面的例子中,我们创建了一

    2024年02月15日
    浏览(44)
  • C#——委托

    什么是委托        C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。 声明委托          委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。  

    2023年04月15日
    浏览(29)
  • 委托与事件(一)——C#版本

      委托是对 函数的封装 ,可以当作给方法的特征指定一个名称。而事件则是 委托的一种特殊形式 ,当发生有意义的事情时,事件对象处理通知过程。   委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有 完全相同的行为 。   用例子来说明为

    2023年04月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包