[英]Get the value of public variable of one class from another class in C#
我有一個 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 值而不從所有方法中將其設為 null 的簡單方法是什么? 上面的代碼只是我的應用程序中的示例。 這種類似的日志記錄在很多方法中完成。 這將在LogMessage()
。
LE:我看到您更正了變量錯字,現在我看到了問題所在。
在 ClassB 中,您再次實例化 ClassA,其中包含 LogMessage 但您不調用 SetID(因此 myID 為空)。
LE2:我不會在這些類中的任何一個中使用 log 方法,因為SOLID原則中的 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。 當然,這里有專門的模式,所以根據你的上下文,根據你的需要探索不同的其他選項可能是好的(我在一個簡單的谷歌搜索中找到的一個例子)以及為你做日志記錄的庫( 這里有一些例子)
類變量,也稱為字段,存在於每個類實例中(這里我不是在談論靜態字段)。 即,每個對象都有自己的一組字段值。
在ClassB
,您使用ClassA a = new ClassA();
創建一個新對象ClassA a = new ClassA();
. 這與您調用SomeMethod
對象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
屬性已經有一個公共設置器。
您需要將字符串添加到日志消息中,因為您將傳入一個名為 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");
}
}
只是先介紹一下如何解耦:“快速且非常臟”:
public class Logger {
public void LogMessage (string message, string myID){
//some logic to write message into a text file with the following message :
// "Id : " + myID + " --> " + message
// next line (enter)
}
}
public ClassA {
private Logger logger = new Logger();
public string myID { get; set; }
// SetID is actually not necessary: just use classAInstance.myID = jobID; in the client of ClassA.
// But I'd recommend making the Property Readonly and set it through CTOR if possible.
public void SomeMethod(){
ClassB b = new ClassB();
logger.LogMessage("Execution starts here", myID);
b.FetchData(logger, myID);
logger.LogMessage("Further execution", myID);
}
}
public class ClassB(){
public void FetchData( Logger logger, string myID){
logger.LogMessage("Fetch data starts", myID);
//some logic to fetch data
logger.LogMessage("Fetch data ends", myID);
}
}
可以通過以下方式進一步改進:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.