将 C# 对象实例组织到静态"global"类中是否愚蠢/不鼓励



我正在制作一个程序,其中对象需要相互聊天并下达命令。我对 C# 有点陌生,所以我在正确执行此操作时遇到了麻烦。我已经意识到使用静态类可以实现我想要实现的所有目标。我知道出于某些原因,这是一种糟糕的方法。我知道我应该使用依赖注入?不幸的是,我很难掌握如何实现这一点。

下面,我创建了一个静态对象的示例,其中包含我的程序将要执行的所有"方面"。如果你想帮助我理解依赖注入并且这不是太多的工作,那么你可以尝试将我的例子改为使用依赖注入(如果你这样做,我会很高兴,因为它会帮助我学习一些我遇到问题的东西(

class Program
{
static void Main(string[] args)
{
Global.worker = new Worker();
Global.employer = new Employer();
Global.reporter = new Reporter();
Global.worker.JobDone += Global.reporter.onWorkDoneR;
Global.worker.JobDone += Global.employer.onWorkDoneE;
Global.reporter.msgToUser("Initialization successful!!!");
Global.employer.startWorkDay();
Console.ReadLine();
}
}
static class Global
{
static public Worker worker;
static public Employer employer;
static public Reporter reporter;
}
class Worker
{ 
public delegate void EventHandler(object sender, ReporterArgs args);
public event EventHandler JobDone;
public void doJob(int joblength)
{
Global.reporter.msgToUser("Worker reporting that I'm starting work!!!");
System.Threading.Thread.Sleep(joblength*1000);
JobDone?.Invoke(this, new ReporterArgs("Work is done"));
}
}
class Employer
{
private int jobiteration = 1;
public void startWorkDay()
{
Global.worker.doJob(jobiteration);
}
public void onWorkDoneE(object sender, EventArgs args)
{
jobiteration++;
Global.worker.doJob(jobiteration);
}
}
class Reporter
{
public void msgToUser(string message)
{
Console.WriteLine(message);
}
public void onWorkDoneR(object sender, ReporterArgs args)
{
Console.WriteLine("{0} reporting: {1}", sender, args.Str);
}
}
public class ReporterArgs : EventArgs
{
private readonly string str;
public ReporterArgs(string str2lol)
{
this.str = str2lol;
}
public string Str
{
get { return this.str; }
}
}

首先,你绝对应该阅读更多关于 C# 类的参考资料。

查看代码,我首先看到的是雇主类接近工人的方式。

public void startWorkDay()
{
Global.worker.doJob(jobiteration);
}

您可以使用以下代码独立处理任何 Worker 对象,而不是访问静态工作线程对象:

public void startWorkDay(Worker workerObjectToPerformTheJob)
{
workerObjectToPerformTheJob.doJob(jobiteration);
}

这也不是我们用 C# 编写的方式:

static public Worker worker;
static public Employer employer;
static public Reporter reporter;

正确的方法是:public static Foo bar;


About classes and objects:

您的程序在static void Main(string[] args) {//stuff happens here}范围内运行 因此,当在 Main(( 边界中定义的对象想要从同一范围访问另一个对象时,无需定义第二个静态类。

另一方面,如果有更多的类或范围怎么办?我们如何连接它们,以便它们可以可靠地相互访问?在这里,我们有两个类,foo和bar。Foo需要将字符串变量传递给bar。

class foo{ string myString; }
class bar
{ 
void myMethod(string value) 
{ print(value); } 
}

Foo和Bar在两个不同的作用域中,所以为了将myString传递给myMethod((,我们可以在它们之间实现一个桥接。

static class Bridge 
{
public static string passThis;
}

在范围 1 中(也许这是在创建柱线对象之前引发的事件(,将创建一个 Foo 对象。这个 Foo 对象将 myString 传递给 可变Bridge.passThis.

在作用域 2 中,将创建一个 Bar 对象。Bar 无法访问 Foo 对象,因此我们无法访问objectFoo.myString。相反,我们访问 Bridge.passThis 并执行myMethod(Bridge.passThis);

相关内容

最新更新