编辑:抱歉。看来我有点困惑。我试图在静态方法中调用非静态方法,但它无法正常工作。他们在同一个班级。这导致我(错误地)假设我不能在没有实例化的情况下调用非静态,即使它们属于同一个类。 由于我已经创建了这个问题,请允许我稍微改变一下这个问题。为什么我不能在静态方法中调用非静态方法?这是我的代码,这样你就可以告诉我,如果我只是把自己搞砸了一些傻话:
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;
}
}
答案 0 :(得分:3)
它是System.Web.UI.Page类中的内容吗?
不,这是因为你已经在实例方法中。上下文中已存在隐式实例this
,this
实例将用于调用该方法。
Page
类没有什么特别之处,在任何类中你都可以这样做,你可以在没有实例的情况下从另一个实例方法调用任何实例方法(尽管你在技术上使用它作为隐式引用)。
答案 1 :(得分:1)
您不需要实例化该类,因为它已经为您实例化了。
考虑班级
public class C
{
public void f() { g(); }
public void g() { }
}
现在,你不能简单地调用C.g();
,你需要一个实例来调用它。 new C().g();
会起作用,但
var c = new C();
c.g();
从f
到g
的来电已经有一个要调用g
的实例,即this
。在那里,g();
仅表示this.g();
。 c.f();
最终会在c.g()
内调用f
。
对于您编辑过的问题,请考虑以下课程:
public class D
{
public static void f() { g(); } // error
public void g() { }
}
现在,因为D.f
是static
,您可以将其称为D.f();
。在这种情况下,根本没有D
的任何实例,因此您没有实例可以调用g
。 (或者,如果您首先创建D
的实例,系统将不知道在g
上调用哪些实例。)
答案 2 :(得分:0)
实际上,在呈现页面时会调用Page_Load
,因此,有一个类DefaultPage
的实例化,并且此对象是调用Page_Load
的对象,到GetObjects
。