首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C#中的另一个类获取一个类的公共变量的值

从C#中的另一个类获取一个类的公共变量的值
EN

Stack Overflow用户
提问于 2018-10-30 14:05:59
回答 4查看 184关注 0票数 0

我有一个C#应用程序,它的逻辑与以下类似:

代码语言:javascript
复制
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”,则文本文件在执行后如下所示:

代码语言:javascript
复制
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()中完成。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-10-30 14:10:44

L:我看到你纠正了变量的错误,现在我看到了问题。

在ClassB中,您再次实例化ClassA,其中包含LogMessage,但不调用SetID (因此myID为null)。

LE2:我不会在这些类中的任何一个类中使用日志方法,因为实心原则状态下的S(一个类需要一个单独的责任)。您可以采取的一种方法是创建一个处理日志逻辑的静态类:

代码语言:javascript
复制
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搜索中找到的示例 )和为您进行日志记录的库(一些示例这里),探索不同的其他选项可能会更好。

票数 2
EN

Stack Overflow用户

发布于 2018-10-30 14:33:35

类变量(也称为字段)存在于每个类实例中(这里我不是在讨论静态字段)。也就是说,每个对象都有它自己的一组字段值。

ClassB中,使用ClassA a = new ClassA();创建一个新对象。这不是您调用的SomeMethod的同一个对象。

您可以通过构造函数注入将ClassA对象传递给ClassB。将ClassB更改为

代码语言:javascript
复制
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更改为

代码语言:javascript
复制
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属性已经有了一个公共设置器。

票数 1
EN

Stack Overflow用户

发布于 2018-10-30 14:21:58

您需要在日志消息中添加字符串,因为您将传入一个名为message的变量,该变量应该是字符串吗?

代码语言:javascript
复制
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类实例的引用指针。所以我不知道你怎么打电话给这个方法。

添加

代码语言:javascript
复制
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");
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53066140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档