基本c#体系结构和类处理问题
好了,伙计们,我认为这是非常基本的东西 我只熟悉C#和面向对象语言 这是我正在开发的一个基本项目:基本c#体系结构和类处理问题,c#,architecture,class,C#,Architecture,Class,好了,伙计们,我认为这是非常基本的东西 我只熟悉C#和面向对象语言 这是我正在开发的一个基本项目: namespace MyProject { class MyProject { public Logger Logs = new Logger(); public WebServer Web = new WebServer(); static void Main() { //
namespace MyProject
{
class MyProject
{
public Logger Logs = new Logger();
public WebServer Web = new WebServer();
static void Main()
{
// blabla
}
}
}
记录器只是创建一个日志文件,当调用其“Add(string str)”方法时,它会在日志文件中添加一行。
Web服务器是我自己的Web服务器,正在打开套接字等。。。
我希望我的Web服务器能够使用我的日志添加方法。。。我该如何做到这一点
在我的webserver类中,使用类似“MyProject.Logs.Add(string str)”的东西似乎不起作用。
那么我如何引用它呢?
我不想在我的Web服务器中创建Logger类的新实例,因为我想在同一个文本文件中写入所有内容(我可能会运行更多的模块,而不仅仅是Web服务器)。
所以我想使用在我的主方法中创建的实例,在我的Webserver类中
我希望这是有意义的…一些建议:
日志
和网站
应该是私有的。这些是类的实现细节。他们不关别人的事public WebServer Web = new WebServer(Logs);
private Logger Logs {get;set;}
public WebServer(Logger logs)
{
Logs = logs;
}
public void DoSomething()
{
Logs.Add("I did something!");
}
有几点建议:
日志
和网站
应该是私有的。这些是类的实现细节。他们不关别人的事public WebServer Web = new WebServer(Logs);
private Logger Logs {get;set;}
public WebServer(Logger logs)
{
Logs = logs;
}
public void DoSomething()
{
Logs.Add("I did something!");
}
通过将对在
MyProject
中创建的Logger
实例的引用传递到WebServer
的实例,可以轻松完成此操作
在WebServer
类中,可以创建类型为Logger
的属性(getter/setter),以便WebServer知道要使用的记录器。另一种选择(可能更好)是向接受记录器的WebServer的构造函数添加一个参数。用于添加属性的伪代码:
public class WebServer
{
public WebServer(Logger l)
{
Log = l;
}
//relevant code....
public Logger Log { get; set; } //Short hand property declaration, see http://msdn.microsoft.com/en-us/library/bb384054.aspx
}
在WebServer
类中,您可以使用类似logger.Add(“一些文本…”)的记录器代码>
然后,在Main
方法中,可以传入Logger
的实例,如下所示:
namespace MyProject
{
class MyProject
{
public static Logger Logs = new Logger();
public static WebServer Web;
static void Main()
{
Web = new WebServer(Logs);
}
}
}
通过将对在MyProject
中创建的Logger
实例的引用传递到WebServer
的实例,可以轻松完成此操作
在WebServer
类中,可以创建类型为Logger
的属性(getter/setter),以便WebServer知道要使用的记录器。另一种选择(可能更好)是向接受记录器的WebServer的构造函数添加一个参数。用于添加属性的伪代码:
public class WebServer
{
public WebServer(Logger l)
{
Log = l;
}
//relevant code....
public Logger Log { get; set; } //Short hand property declaration, see http://msdn.microsoft.com/en-us/library/bb384054.aspx
}
在WebServer
类中,您可以使用类似logger.Add(“一些文本…”)的记录器代码>
然后,在Main
方法中,可以传入Logger
的实例,如下所示:
namespace MyProject
{
class MyProject
{
public static Logger Logs = new Logger();
public static WebServer Web;
static void Main()
{
Web = new WebServer(Logs);
}
}
}
MyProject.Logs.Add(string str)
不起作用,因为Logs
成员不是静态的,这意味着它对于类的不同实例(由操作符new
创建)可能不同。如果不指定实例,编译器将无法知道引用的是哪个实例
如果将日志
标记为静态
,则它将工作
但是,将其设置为静态会降低项目的可定制性(例如,您将无法在同一程序中使用两个不同的日志文件启动两个web服务器)。这就是为什么约翰·桑德斯(John Saunders)的建议通常被认为是更好的。MyProject.Logs.Add(string str)
不起作用,因为Logs
成员不是静态的,这意味着它对于类的不同实例(由操作符new
创建)可能是不同的。如果不指定实例,编译器将无法知道引用的是哪个实例
如果将日志
标记为静态
,则它将工作
但是,将其设置为静态会降低项目的可定制性(例如,您将无法在同一程序中使用两个不同的日志文件启动两个web服务器)。这就是为什么约翰·桑德斯的建议通常被认为更好。这不会编译。您正在从静态方法访问实例成员。很好的调用,从OP复制。这是我在编辑器中键入的结果,而不是VS。谢谢,这与John Saunders说的差不多,我感谢您的帮助tho:)这不会编译。您正在从静态方法访问实例成员。很好的呼叫,从OP复制。这是我在编辑器中键入的结果,而不是VS。谢谢,这与John Saunders说的差不多,我感谢您的帮助tho:)谢谢您的快速回答,是的,我意识到日志和Web应该是私有的,我把它们公之于众,希望能够通过这种方式访问它们,但我错了:)谢谢你的快速回答,是的,我意识到日志和网络应该是私有的,我把它们公之于众,希望能够通过这种方式访问它们,但我错了:)您可能想签出log4net作为您自己的日志代码。您可能想签出log4net作为您自己的日志代码。很有趣。就像你说的,我想我会同意John所说的,它确实提供了比使这些静态的有趣的更大的灵活性。就像你说的,我想我会同意John所说的,它确实提供了比制作这些静态文件更大的灵活性。