Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用函数和/或委托的函数_C#_Delegates - Fatal编程技术网

C# 调用函数和/或委托的函数

C# 调用函数和/或委托的函数,c#,delegates,C#,Delegates,假设我有一个敌方类,它有两个属性和一个方法AddPoints,可以向敌方对象添加经验点。在一定的经验点之后,敌人对象的等级属性将增加 最初我想‘当我不知道什么时候才能达到正确的经验点时,如何让程序更新级别属性?’?。这让我想到了事件(必须侦听事件的发生,在本例中是LevelUp()方法的结果),因此我决定执行以下操作 private void LevelUp() { if (ExperiencePoints > (5 * Lev

假设我有一个
敌方
类,它有两个属性和一个方法
AddPoints
,可以向
敌方
对象添加经验点。在一定的经验点之后,
敌人
对象的
等级
属性将增加

最初我想‘当我不知道什么时候才能达到正确的经验点时,如何让程序更新
级别
属性?’?。这让我想到了事件(必须侦听事件的发生,在本例中是
LevelUp()
方法的结果),因此我决定执行以下操作

   private void LevelUp()
            {
                if (ExperiencePoints > (5 * Level))
                {
                    Level++;
                }
            }
            public void AddPoints(int points)
            {

                this.ExperiencePoints += points;
                LevelUp();
            }
这样,每当有点添加到
敌方
对象时,该方法将检查级别属性是否需要增加。让一个方法调用另一个方法可以考虑包含/委派(一个方法“嵌套”在另一个方法中)。这样,我的
AddPoints
函数就有点像一个函数指针(至少在我看来是这样)

有语言设计知识或良好的C++/C历史知识的人是否认为这是一种有助于思考代表的方式?对于下面的代码,是否有任何方法可以让委托改进程序,或者是太简单了

全敌级

class Enemy
    {

        public int ExperiencePoints { get; set; }
        public string Name { get; set; }


        private int level;
        public int Level
        {
            get { return level; }
            private set { level = value; }
        }

        private void LevelUp()
        {
            if (ExperiencePoints > (5 * Level))
            {
                Level++;
            }
        }
        public void AddPoints(int points)
        {

            this.ExperiencePoints += points;
            LevelUp();
        }

        public Enemy()
        {
            ExperiencePoints = 1;
            Level = 1;
        }
    }
测试

delegate void myDelegate(int x);
    class Program
    {
        static void Main(string[] args)
        {


            Enemy e = new Enemy();
            myDelegate del = e.AddPoints;
            e.AddPoints(10); //Level =1 at runtime, after this call Level=2
            del(20);//now Level=3
            Console.WriteLine(e.Level);//output = 3


        }
    }

您的问题与学员有关,还是如何处理升级功能?很难确定你的确切问题是什么。“还是太简单了?”简单是美丽的,也是最好的。不要仅仅为了增加复杂性而增加复杂性。除非你知道为什么、如何以及被迫使用委托,否则不要使用委托。更好的表达方式是:一个函数调用另一个函数的内部方式是否与使用委托类似让你了解委托。委派的任务不仅仅是一个函数调用另一个函数。您给出的第一个解决方案是最好的解决方案。但是将体验设置为
{get;private set;}
,这样就可以只使用
添加点来添加体验