2010-11-15 82 views
0

我有困惑與下面的代碼:在這個程序的靜態上下文中如何訪問非靜態的?

class A 
    { 
    int x; 
    static void F(B b) { 
     b.x = 1; /* Ok, 
I want to know how is this ok, in a static block how a non static 
instance variables are called because as I know that static block 
gets memory at compile time before execution of a single command 
while non static at run time and static method accessing a non static 
variable which is not created yet please elaborate me on this 
*/  
    } 
    } 
    class B: A 
    { 
    static void F(B b) { 
     b.x = 1; // Error, x not accessible 
    } 
    } 
+0

您的意思是public int x? – 2010-11-15 07:48:41

+0

沒有公共int x。 – NoviceToDotNet 2010-11-15 09:12:06

回答

2

沒有在編譯時得到的內存。當類型被初始化時,靜態字段確實被放置在靜態內存塊中。靜態方法的調用棧在運行時分配,就像實例方法一樣。

現在,爲什麼靜態方法無法訪問實例字段。考慮到這一點:

class A { 
    public int Value; 

    static int GetValue() { 
     return Value; 
    } 
} 

在那裏你有一個實例字段和靜態方法的類。現在,在其他地方你試試這個:

var a1 = new A(); 
a1.Value = 5; 

var a2 = new A(); 
a2.Value = 10; 

int result = A.GetValue(); 

現在,如果編譯器允許這個,結果會得到什麼值? 5或10還是別的?這只是沒有意義,因爲靜態方法是作爲一個整體聲明的,並且不知道這個類的實例。所以在靜態方法的代碼中,你不知道這個類有多少(如果有)實例存在,並且不能訪問它們的實例字段。

希望這有點道理。

+0

當我運行程序有一個實例變量詮釋我和我在公共靜態無效主要方法訪問它,然後它會拋出一個錯誤,非靜態變量不能被訪問詮釋他靜態上下文是什麼原因,也讓我知道上述是如何正確 – NoviceToDotNet 2010-11-15 07:42:33

+0

我修改我的答案有點試圖回答你的問題 – Dyppl 2010-11-15 08:41:57

+0

這就是我在上面的代碼中要求....如何在類A bx = 1;/*好的,是正確的。請解釋我這個 – NoviceToDotNet 2010-11-15 09:10:47

1

要麼你改變了有問題的代碼,要麼我沒有仔細閱讀。似乎現在完全不同的問題。因爲它的保護級別,變量x實際上對於類B是不可訪問的(C#中的默認是私有的)。類A可以修改X,因爲它在類A中聲明並且對其方法可見。 B類不能做到這一點(你必須爲此保護或公開X)。

+0

這就是我想了解一個私人是如何訪問子類..我發現這個代碼在網.. – NoviceToDotNet 2010-11-15 10:00:30

+0

這不是,B類不能訪問AX – Dyppl 2010-11-15 10:08:26

+0

它無法訪問,因爲X是私人我想? – NoviceToDotNet 2010-11-15 10:21:38

相關問題