【问题标题】:Non-static object from a static method来自静态方法的非静态对象
【发布时间】:2014-11-30 11:37:03
【问题描述】:

我有一个简单的 C# 类。

在这个类中,我有一个对象,它在类本身的构造函数中初始化。

我对这个类的属性做了一些修改/更新(我已经逐步调试了)。

从另一个类,我想更新这个对象,所以我做了一个静态方法,它返回这个对象。

但是当我调用这个方法时,我得到的对象是初始值,而不是新值。为什么?这是错的吗?我怎样才能得到它?

这是我的代码的简化版本:

public class class1 
{
    private static MyObject p_var;
    public  MyObject MyVar
    {
        get { return p_var; }
        set { p_var= value; }
    }

    public static MyVar getVar(){
        MyVar w = p_var;
        return w;
    }

    public class1() {
        Debug.WriteLine("kjkjkj");

        MyVar= new MyObject ();
        MyVar.attr1 = "test init";

   }
}

示例:如果我从另一个类调用 getVar,我会得到带有 attr1 值的 MyVar 对象,例如“test init”,而不是新的修改后的 valuel。

【问题讨论】:

  • 编写示例代码时出错..现在正确了,谢谢!
  • 你没有初始化p_var,这个代码示例中没有描述attr1
  • @PieroAlberto 无法专注于这个问题,因为这个问题是错误的并且没有意义...p_var 永远不会设置...你在哪里设置p_var?跨度>
  • @PieroAlberto 感谢更新伙伴...我想知道w 是什么
  • 如果我猜对了,OP 正在尝试创建 Class1 的新实例,该实例再次调用构造函数并重新初始化私有静态对象的初始值

标签: c# class static return non-static


【解决方案1】:

在我看来,您在这里缺少一些statics。您应该在 MyVarclass1 构造函数上获得一个。在这种情况下,第二次调用new class1() 时不会重置该值:

public class MyObject { public string attr1 { get; set; } }

public class class1
{
    public static MyObject MyVar // <-- here
    {
        get;
        private set; // <-- made private to prevent changes from the outside
    }

    // public static MyObject getVar() // use MyVar instead
    //{
    //    return MyVar;
    //}

    public static class1() // <-- here
    {
        Debug.WriteLine("kjkjkj");

        MyVar = new MyObject();
        MyVar.attr1 = "test init";
    }
}

您可以使用简单的单例实现来简化此操作:

public class class1
{
    private static MyObject p_var;
    public static MyObject MyVar
    {
        get
        {
            if (p_var == null)
            {
                p_var = new MyObject();
                p_var.attr1 = "test init";
            }

            return p_var;
        }
    }
}

【讨论】:

  • @PatrickHofman...是的,我认为他有一个设计问题,从外观上看,他最好将这个类变成一个单例,以防止单例对象的双重初始化。但是,就目前而言,如果他没有显式调用实例构造函数或属性设置器,它仍然无法解释为什么静态对象会被重置。我相信他一定是在其他地方调用实例 ctor
  • @Leo:我认为你的意思是:如果他没有明确调用实例构造函数...他是。他无法从另一个班级获得MyVar,因为它不是static。他必须初始化一个新的class1
  • @Leo 我用 MyNamespace.MyClass.getVar()...
  • @PatrickHofman 单例实现......它似乎有效,非常感谢!!!! :)
  • +1 @PatrickHofman 绝对是,我想我想说的是“这并不一定意味着这个 ctors 被另一个类调用”......这可能是一个应用程序组件生命周期问题,等等,等等......没有提供细节......总的来说,你已经指出了最重要的事情......设计问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多