C# 中的 TwitchLib 在返回值后崩溃

TwitchLib in C# crashes after return values

提问人:Netroshin 提问时间:11/4/2023 更新时间:11/4/2023 访问量:33

问:

我用许多全局变量编写了我的程序,并且只用了公共 void 方法。 所以我想将我的方法更改为具有返回值的私有静态方法。这就是我所做的。

现在我的程序只会通过 TwitchLib 的“globalChatMessageReceived”一次,然后它什么都不做。不会显示任何问题或错误,程序运行正常并保存数据,但它只会这样做一次。

我正在使用

FindPokemonName(MessageSplitForPokemonName[1]);

没有返回值和

(string[] PokedexName, Boolean ChosenPokemonIsAvailable, Boolean ChosenPokemonIsNoStarter, string NameOfChosenPokemon) = FindPokemonName(MessageSplitForPokemonName[1]);

替换为返回值。

下面是具有全局变量且没有返回值的代码:

        public void FindTrainerID(string TrainerID, string ChatDisplayName)
        {
            TrainerVorhanden = false;
            if (File.Exists(@"C:\txt\trainer\" + TrainerID + ".txt"))
            {
                string FoundTrainer = File.ReadAllText(@"C:\txt\trainer\" + TrainerID + ".txt");
                Trainer = FoundTrainer.Split('\\');
                TrainerVorhanden = true;
            }

        }

这就是我现在对返回值所做的:

        private static (string[] Trainer, bool TrainerAvailable) FindTrainerID(string TrainerID)
        {
            string[] Trainer = new string[5];
            Boolean TrainerAvailable = false;
            if (File.Exists(@"C:\txt\trainer\" + TrainerID + ".txt"))
            {
                string FoundTrainer = File.ReadAllText(@"C:\txt\trainer\" + TrainerID + ".txt");
                Trainer = FoundTrainer.Split('\\');
                TrainerAvailable = true;
            }
            return (Trainer, TrainerAvailable);
        }

我尝试了该程序,但没有使用带有返回值的方法。该程序使用 TwitchLib 方法“globalChatMessageReceived”持续运行。

如果我使用返回值,那么它之后什么都不做。

c# 全局变量 返回值 twitch-api

评论


答:

0赞 Mike Bruno 11/4/2023 #1

您可能会发现使用类比返回这样的元组更容易。

例如,声明以下数据类:

class TrainerInfo {
    public string[] Trainer { get; set;}
    public bool TrainerAvailable { get; set;}
}

然后试一试:

static TrainerInfo FindTrainerID(string TrainerID) {
    var result = new TrainerInfo();

    string trainerPath = $@"D:\junk\trainer\{TrainerID}.txt";
    if (File.Exists(trainerPath)) {
        string FoundTrainer = File.ReadAllText(trainerPath);
        result.Trainer = FoundTrainer.Split('\\').ToArray();
        result.TrainerAvailable = true;
    }
    return result;
}

同样值得深思的是:是否绝对必须是一个数组,或者您可以使用更动态的集合类型(例如)?TrainerList<string>

评论

0赞 Netroshin 11/4/2023
现在我学会了如何使用,谢谢!直到现在我才明白这一点。但是,这比使用全局变量和公共无效方法更好吗?好吧,如果我正在编写一个包含 21 个公共变量的类,这是否比一个类中的 21 个公共变量和公共无效方法具有更高的性能或更好的编码?对不起,如果我问你,我想我只是用公共空隙编码,因为它在高中更容易。训练器阵列中总是有 6 根弦,所以 imo 没关系。但是,如果我要为运动鞋编写包代码,那么使用 .{ get; set;}List<string>
0赞 Mike Bruno 11/4/2023
从长远来看,尽可能地本地化变量将使您的代码更易于阅读、理解和调试。在某些情况下,使变量不必要地成为全局变量可能会对内存产生影响,因为您缓存的数据在应用程序的整个生命周期中不一定需要。
0赞 Netroshin 11/5/2023
谢谢!我唯一的问题是,执行该方法后我无法使用数组。我以为我会知道的,但它不起作用。如何让数组在另一种方法中使用它?Trainer
0赞 Mike Bruno 11/5/2023
好吧,将需要访问数组的方法提取到一个类中并使其成为该类的属性可能是有意义的。您可能想观看一些有关面向对象编程的入门级视频。一开始有点迟钝,但一旦你掌握了它的窍门,它就会使编程中的一切都变得更容易。特别是学习S.O.L.I.D原理,真的帮助我成为一个更好的程序员。
0赞 Netroshin 11/6/2023
知道了!当我使用类进行编码时,我看到一些方法有一个全局变量 () 的主类的实例,我的方法是私有的,我不想多次写下路径。通过更多的测试,我发现这个实例破坏了我的程序。但是我不再需要那个实例了,因为我使用你的编码想法!非常感谢!PokeTrainerBot Paths = new PokeTrainerBot();