我有一个C#应用程序,它的逻辑与以下类似:
public ClassA {
public string myID { get; set; }
public void SetID(string jobID)
{
myID = jobID;
}
public void SomeMethod(){
ClassB b = new ClassB();
LogMessage("Execution starts here");
b.FetchData();
LogMessage("Further execution");
}
public void LogMessage (string message){
//some logic to write message into a text file with the following message :
// "Id : " + myID + " --> " + message
// next line (enter)
}
}
public class ClassB(){
public void FetchData(){
ClassA a = new ClassA();
a.LogMessage("Fetch data starts");
//some logic to fetch data
a.LogMessage("Fetch data ends");
}
}如果id值为“ABC”,则文本文件在执行后如下所示:
Id : ABC --> Execution starts here
Id : (null) --> Fetch data starts
Id : (null) --> Fetch data ends
Id : ABC --> Further execution这里我面临的问题是,id没有被打印,即使它是一个公共变量。当执行进入另一个类时,myId变量变为空。另外,由于某些原因,我不能将myId变量作为参数传递给LogMessage()。
什么是获取myId值而不使其从所有方法中为空的简单方法?上面的代码只是我在应用程序中的示例。这种类似的日志记录是在许多方法中完成的。这将在LogMessage()中完成。
发布于 2018-10-30 14:10:44
L:我看到你纠正了变量的错误,现在我看到了问题。
在ClassB中,您再次实例化ClassA,其中包含LogMessage,但不调用SetID (因此myID为null)。
LE2:我不会在这些类中的任何一个类中使用日志方法,因为实心原则状态下的S(一个类需要一个单独的责任)。您可以采取的一种方法是创建一个处理日志逻辑的静态类:
public static class Logger
{
private static string myID;
public static SetMyId(string id)
{
myID = id;
}
public static void Log(string message)
{
//print myID _+ message
}
}只要应用程序还活着,静态变量就会保留您的ID。当然,这方面也有一些模式,因此,根据您的上下文,根据您的需要(我在一个简单的google搜索中找到的示例 )和为您进行日志记录的库(一些示例这里),探索不同的其他选项可能会更好。
发布于 2018-10-30 14:33:35
类变量(也称为字段)存在于每个类实例中(这里我不是在讨论静态字段)。也就是说,每个对象都有它自己的一组字段值。
在ClassB中,使用ClassA a = new ClassA();创建一个新对象。这不是您调用的SomeMethod的同一个对象。
您可以通过构造函数注入将ClassA对象传递给ClassB。将ClassB更改为
public class ClassB()
{
private readonly ClassA _a;
// Constructor. You call it with `new ClassB(classAObject)`.
public ClassB(ClassA a)
{
_a = a;
}
public void FetchData(){
_a.LogMessage("Fetch data starts");
// Fetching data here...
_a.LogMessage("Fetch data ends");
}
}在ClassA中,将SomeMethod更改为
public void SomeMethod()
{
myID = "ABC";
// Pass a reference to the current object (this).
ClassB b = new ClassB(this);
LogMessage("Execution starts here");
b.FetchData();
LogMessage("Further execution");
}而且,没有必要创建一个方法SetID,因为myID属性已经有了一个公共设置器。
发布于 2018-10-30 14:21:58
您需要在日志消息中添加字符串,因为您将传入一个名为message的变量,该变量应该是字符串吗?
public void LogMessage (string message){
//some logic to write message into a text file with the following message :
// "Id : " + myID + " --> " + message
// next line (enter)
}在B类中,没有指向您创建的a类实例的引用指针。所以我不知道你怎么打电话给这个方法。
添加
public class ClassB(){
ClassA NewMessage = new ClassA();
public void FetchData(){
NewMessage.LogMessage("Fetch data starts");
//some logic to fetch data
NewMessage.LogMessage("Fetch data ends");
}
}https://stackoverflow.com/questions/53066140
复制相似问题