面向对象:是否可以使用像变量这样的静态实例?

时间:2011-07-08 14:25:40

标签: c#

我想我不能做这件事,但我试着问(也许:))。

假设我有这个Main类:

public class UiUtils
{   
    public static MyObject myObject;
    public UiUtils()
    {
       myObject=new MyObject();
    }
}

现在,如果我想尝试从另一个Context Class(Web应用程序)调用此实例,我会这样做:

public partial class context_eventi_CustomClass : System.Web.UI.UserControl
{   
    protected void Page_Load(object sender, EventArgs e)
    {
       Console.Write(UiUtils.myObject.Title());
    }
}   

但我想做的是:

public partial class context_eventi_CustomClass : System.Web.UI.UserControl
{   
    protected void Page_Load(object sender, EventArgs e)
    {
       Console.Write(myObject.Title());
    }
}

所以,直接使用myObject而不是UiUtils.myObject:)

我认为这是不可能的,但也许我错了,有任何策略:)谢谢

**编辑**

我的解决方案:

public class UiUtils
{   
    public static MyObject myObject;
    public UiUtils()
    {
       myObject=new MyObject();
       iContext.myObject = myObject;
    }
}

public class iContext : System.Web.UI.UserControl
{
    public static MyObject myObject;

    public iContext()
    {

    }    

    public iContext(MyObject myObject)
    {
        myObject = myObject;
    }
}

public partial class context_eventi_CustomClass : iContext
{   
    protected void Page_Load(object sender, EventArgs e)
    {
       Console.Write(myObject.Title());
    }
}

似乎有效!你怎么看?

2 个答案:

答案 0 :(得分:2)

MSDN

  

静态方法,字段,属性或   event甚至可以在类上调用   没有班级的实例   创建。 如果该类的任何实例   是创造的,他们不能习惯   访问静态成员。只有一个   静态字段和事件的副本   存在,静态方法和   属性只能访问静态   字段和静态事件。静态的   成员经常被用来代表   没有的数据或计算   改变对象状态。

“要访问静态类成员,请使用类的名称而不是变量名来指定成员的位置。”

  

始终访问静态成员   通过类名,而不是   实例名称

@Daniel Earwicker在他的answer on SO here中说:

  

......静态成员无法集成   很好的继承。它没有   感觉让他们可以遗传。所以我   将静态内容保存在单独的静态中   类...

所以我不清楚你的设计为什么MyObject需要是静态的。你想要保存的只是一点点打字,但继承对你来说也无济于事。

编辑:

我尝试在简单的控制台应用程序中复制您的代码。输出不是您所期望的:

namespace ConsoleApplication1
{
    public class UiUtils
    {
        public static int myObject = 1;
        public UiUtils()
        {
            myObject = new int();
            iContext.myObject = myObject;
            Console.WriteLine("This is UiUtils\n");
        }
    }

    public class iContext
    {
        public static int myObject = 2;

        public iContext()
        {
            Console.WriteLine("This is iContext\n");
        }

        public iContext(int myObject)
        {
            myObject = myObject;
        }
    }

    public class iContext2 : iContext
    {
        public static int myObject = 3;

        public iContext2()
        {

            Console.WriteLine(myObject.ToString() + "\nThis is iContext2\n");
            Console.WriteLine(iContext.myObject.ToString());
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            iContext2 icontext = new iContext2();
            Console.In.ReadLine();
        }
    }
}

输出最终是这样的:

This is iContext

3 
This is iContext2

如果添加对iContext.myObject的调用,则输出它的编号:

This is iContext

3
This is iContext2
2

答案 1 :(得分:1)

要在不键入类的情况下访问对象,可以使用继承。

public class CustomClass : UiUtils

这将与CustomClass

共享UiUtils属性