【C#Unity题】1.委托和事件在使用上的区别是什么?2.C#中 == 和 Equals 的区别是什么?
admin
2024-05-24 02:15:28
0

1.委托和事件在使用上的区别是什么?
委托和事件是C#中的重要概念,通俗来讲,委托是一个可以指向特定方法的指针,可以将委托分配给不同的脚本,使它们能够完成不同的任务。而事件则是一种使用委托实现的通知机制,它告诉委托需要执行任务了。因此,委托定义了任务,而事件则是通知委托执行任务的通知。在 Unity 中,通过使用委托和事件,可以实现诸如响应按钮点击,处理游戏碰撞等功能。

它们在使用上的不同:
定义:委托是一种类型,它可以引用方法。事件是一种基于委托的机制,允许在事件发生时通知多个对象。

用法:委托是一种低级机制,可以直接调用关联的方法。事件则是一种高级机制,它可以被订阅和取消订阅,并在事件发生时引发通知。

安全性:委托是一种不安全的机制,它允许直接访问关联的方法,这可能会导致错误。事件则是一种安全的机制,它只允许通过订阅和取消订阅来访问关联的方法,因此不存在安全风险。

总之,委托是C#中的一种低级机制,它可以直接调用关联的方法,但可能带来安全问题;事件则是一种高级机制,它是基于委托的,允许在事件发生时通知多个对象,并且更加安全。

开发过程中的使用的案例

定义了一个事件委托类型 PlayerHealthEventHandler,它用于表示事件处理方法。
Player 类定义了一个 OnPlayerHealthChanged 事件,它在玩家生命值发生改变时被触发。
GameManager 类订阅了玩家生命值变化事件,并定义了事件处理方法 PlayerHealthChanged,它在接收到事件通知时被调用。
在 Main 方法中,创建了一个 Player 和一个 GameManager 对象,并订阅了事件。随后,通过调用 player.ChangeHealth 方法,改变了玩家生命值,并通知了事件订阅者。

sing System;// 定义事件委托类型
public delegate void PlayerHealthEventHandler(int health);public class Player
{// 定义事件public event PlayerHealthEventHandler OnPlayerHealthChanged;private int health;// 当玩家生命值发生改变时,发布事件public void ChangeHealth(int value){health += value;if (OnPlayerHealthChanged != null){OnPlayerHealthChanged(health);}}
}public class GameManager
{// 订阅事件public void SubscribeEvent(Player player){player.OnPlayerHealthChanged += PlayerHealthChanged;}// 当接收到玩家生命值变化的通知时,触发事件处理方法private void PlayerHealthChanged(int health){Console.WriteLine("Player health changed to " + health);}
}class Program
{static void Main(string[] args){Player player = new Player();GameManager gameManager = new GameManager();// 订阅事件gameManager.SubscribeEvent(player);// 改变玩家生命值,并通知事件订阅者player.ChangeHealth(10);}
}

2.请说说你认为C#中 == 和 Equals 的区别是什么?

C# 中的 == 和 Equals 在比较两个对象的值时有着不同的行为。

== 运算符比较的是两个对象的内存地址是否相同,即是否是同一个对象的引用。如果两个对象的引用相同,那么它们的内存地址也相同,此时 == 运算符的结果为 true。如果两个对象的引用不同,即使它们的值相同,== 运算符的结果仍然为 false。

Equals 方法是比较两个对象的值是否相等,它会比较对象的内容,而不是内存地址。默认情况下,Equals 方法是比较对象的引用是否相等,即是否是同一个对象。但是,许多 .NET 类都重写了 Equals 方法,使其在比较两个对象的内容时得到正确的结果。

因此,如果要比较两个对象的值是否相等,通常应该使用 Equals 方法,而不是 == 运算符。

开发过程中的使用的案例

Equals 方法常常被用于比较游戏对象。

if (object1.Equals(object2))// The two objects are the same
else// The two objects are different

另一个使用场景是在对游戏对象进行分组,比如将相同类型的游戏对象分为一组。

List groupA = new List();
List groupB = new List();foreach (var gameObject in allGameObjects)
{if (gameObject.GetType().Equals(typeof(TypeA))){groupA.Add(gameObject);}else if (gameObject.GetType().Equals(typeof(TypeB))){groupB.Add(gameObject);}
}

注意: == 运算符比较的是两个引用的内存地址,所以当两个对象实例是在不同的内存地址上创建的,即使它们的内容完全相同,它们也不相等。因此,在比较两个引用类型的对象时,通常使用 Equals 方法,因为它比较的是对象的内容,而不是内存地址。

class Person
{public string Name { get; set; }public int Age { get; set; }public override bool Equals(object obj){if (obj == null) return false;if (!(obj is Person)) return false;Person person = (Person)obj;return Name == person.Name && Age == person.Age;}
}void Example()
{Person person1 = new Person { Name = "ZhangSan", Age = 20 };Person person2 = new Person { Name = "ZhangSan", Age = 20 };Debug.Log(person1 == person2); // 输出"False"Debug.Log(person1.Equals(person2)); // 输出"True"
}

它们的内容完全相同,但是由于它们是在不同的内存地址上创建的,所以使用 == 运算符比较它们的结果为 False。但使用 Equals 方法比较它们时,结果为 True,因为我们在 Person 类的 Equals 方法中重写了对象的内容比较方式,比较了对象的姓名和年龄是否相同。

另外,使用 Equals 方法还有另一个优点是,如果没有重写 Equals 方法,则它会使用默认的对象内容比较方式,该方式与使用 == 运算符的比较方式相同。因此,即使没有重写 Equals 方法,也可以使用 Equals 方法进行对象内容比较。

总的来说,使用 Equals 方法比较对象的内容更灵活,更具灵活性,因此在 Unity 游戏开发中,使用 Equals 方法比较对象是非常常见的。

相关内容

热门资讯

师傅教徒弟的成语? 师傅教徒弟的成语?谆谆教导成语释义:谆谆:恳切、耐心的样子。恳切、耐心地教导。诲人不倦成语释义:诲:...
批评孩子孩子总是记不住,这是怎... 批评孩子孩子总是记不住,这是怎么回事我批评孩子好几遍,可他为啥就记不住呢?”相信许多家长都有过类似这...
后稷教稼的故事明白了什么 后稷教稼的故事明白了什么 农耕文明耀千古。农业始祖后稷教民稼穑,开创了光辉灿烂的农耕文化。后稷教...
可爱的近义词是什么 可爱的近义词是什么要九个以上近义词心爱、喜欢 可人 可心 乖巧 淘气 天真 ...
电影,刘德华和王祖贤演的,王祖... 电影,刘德华和王祖贤演的,王祖贤从古代穿越到现代的,请问叫什么名字啊摩登如来神掌因该是 摩登如来神...
小猪的爱好是 小猪的爱好是小猪罗志祥哒爱好昰收集物品:香水,帽子,手机休闲嗜好:打蓝球、游泳   特别专长:打鼓、...
政校联合推广活动——建德豆腐包... 2025年7月16日,建德市文广旅体局副局长王素平带领建德豆腐包协会走进了新东方烹饪学校杭州校区,2...
笼子里的老虎 笼子里的老虎如果笼子里的老虎跟野地里的老虎互换位置,结果会怎样结果,两只老虎会都死掉. 笼子里的老虎...
我的世界编辑器在哪下 我的世界编辑器在哪下可以在乐商店下,也可以在豌豆荚里下
风华月貌是什么意思? 风华月貌是什么意思?如果非要单字拆讲,那么:风,风度,举止端庄,风采(不必用丰采)。华,华贵,雍容华...
火影586集二代目火影抬手指是... 火影586集二代目火影抬手指是什么忍术水比术 我是小尾巴,来拿经验的...
红楼梦第七十五回贾珍听到的叹息... 红楼梦第七十五回贾珍听到的叹息声是谁发出的“况且那边又紧靠着祠堂”,所以那叹息声可认为是宁、荣二公显...
西安电子科技大学校园内有哪些地... 西安电子科技大学校园内有哪些地标性建筑?地标建筑在校生公认的是钟塔,在一群六层以下的建筑中高高耸起一...
太阳系为什么现在为八大行星 太阳系为什么现在为八大行星他们说得如此复杂.简单一点.一句话精简掉.冥王星过小.过远.轨道异于他者....
《姐姐的爱乐之程》翻车,《浪姐... 《姐姐的爱乐之程》翻车,《浪姐》的红利还能吃多久?《浪姐》的红利吃不了多久。因为《浪姐》的后期节目频...
荀子说“蓬生麻中,不扶而直;白... 荀子说“蓬生麻中,不扶而直;白沙在涅(黑泥),之俱黑”,而周敦颐则说莲“出淤泥而不染”。围绕“环境与...
求下《越人纹身》故事梗概及寓意 求下《越人纹身》故事梗概及寓意谢谢越人纹身庄子他们宋国人特别擅长制作衣帽,用现在的话说,名牌服饰不少...
《哪吒之魔童降世》票房突破20... 《哪吒之魔童降世》票房突破20亿!它靠什么取得这么辉煌的成绩?靠着比较精良的制作以及独特的剧情吧。因...
非常有名的言情小说作者和她们作... 非常有名的言情小说作者和她们作品的风格 形式如下: 浪漫主义唯美作者-顾漫 浪漫主义幻想作者 -虫小...
军队文职会计师专业课和助理会计... 军队文职会计师专业课和助理会计师考试内容一样吗?不一样,军队文职会计师专业课有宏微观经济学,财务管理...