类/页面中的静态修饰符要求

时间:2014-02-10 08:12:09

标签: c# asp.net

编辑:抱歉。看来我有点困惑。我试图在静态方法中调用非静态方法,但它无法正常工作。他们在同一个班级。这导致我(错误地)假设我不能在没有实例化的情况下调用非静态,即使它们属于同一个类。 由于我已经创建了这个问题,请允许我稍微改变一下这个问题。为什么我不能在静态方法中调用非静态方法?这是我的代码,这样你就可以告诉我,如果我只是把自己搞砸了一些傻话:

public class DataAccessObjectClass
{
    public static IList<Records> GetAllRecords(Dictionary<string,string> searchDic)
    {
        string query = BuildSearchQuery(searchDic); //error: object ref. required
    }

    public string BuildSearchQuery(Dictionary<string,string> searchDic)
    {
        string query = "";
        //build the query
        return string;
    }
}

3 个答案:

答案 0 :(得分:3)

  

它是System.Web.UI.Page类中的内容吗?

不,这是因为你已经在实例方法中。上下文中已存在隐式实例thisthis实例将用于调用该方法。

Page类没有什么特别之处,在任何类中你都可以这样做,你可以在没有实例的情况下从另一个实例方法调用任何实例方法(尽管你在技术上使用它作为隐式引用)。

答案 1 :(得分:1)

您不需要实例化该类,因为它已经为您实例化了。

考虑班级

public class C
{
    public void f() { g(); }
    public void g() { }
}

现在,你不能简单地调用C.g();,你需要一个实例来调用它。 new C().g();会起作用,但

也会如此
var c = new C();
c.g();

fg的来电已经有一个要调用g的实例,即this。在那里,g();仅表示this.g();c.f();最终会在c.g()内调用f

对于您编辑过的问题,请考虑以下课程:

public class D
{
    public static void f() { g(); } // error
    public void g() { }
}

现在,因为D.fstatic,您可以将其称为D.f();。在这种情况下,根本没有D的任何实例,因此您没有实例可以调用g。 (或者,如果您首先创建D的实例,系统将不知道在g上调用哪些实例。)

答案 2 :(得分:0)

实际上,在呈现页面时会调用Page_Load,因此,有一个类DefaultPage的实例化,并且此对象是调用Page_Load的对象,到GetObjects