2012-03-31 67 views
-1
public class Class1 
{ 
    public static string Name="foo"; 

    public void ChangeName(string _name) 
    { 
    Name=_name; 
    } 
} 

in some other class.. 

Class1 _c=new Class1(); 
_c.ChangeName("bar"); 

通過非靜態方法間接地改變的類的一個靜態成員和名稱得到改變..實例改變一個靜態成員!實例可以在c#

我以爲一個靜態成員只適用於一個類。如果一個類想要它可以改變它的靜態成員。 但是這裏的一個實例能夠間接地改變它。不應該有一個實例不能改變它嗎?當我們創建一個實例時,它在堆中佔據自己的空間,而無需訪問類的靜態成員。那麼這裏究竟發生了什麼?

+0

您如何想象所有外部組件都能夠更改靜態變量並消除類實例的可能性? – 2012-03-31 19:52:23

+0

這是一個多線程的噩夢。 ;) – Marc 2012-03-31 19:56:02

+0

是不是像一個房子(實例)決定藍圖(House Class)以及其他實例的命運。如果藍圖希望它可以改變,那麼從這個新藍圖創建的房屋會受到影響。不是決定其他房屋應該如何看的房子。這不是一個點嗎? – singsuyash 2012-03-31 20:00:04

回答

0

不,不會禁止實例訪問靜態成員。實例彼此分離,但靜態成員可用於靜態方法和實例方法。

正如你已經公開的那樣,它甚至不僅僅是類中可以訪問它的方法。你可以從任何地方發生變化:

in some other class... 

Class1.Name = "Albert"; 
+0

實例方法不應該只能「獲取」這些靜態成員而不能「設置」它們。我知道這是如何發生的,但這不是一件壞事。從我上面的評論來看,這種情況如何?難道不像House(實例)決定藍圖(House Class)以及其他實例的命運。如果藍圖希望它可以改變,那麼從這個新藍圖創建的房屋會受到影響。不是決定其他房屋看起來如何的房屋 – singsuyash 2012-03-31 20:16:43

+0

@suyash:靜態成員根本不屬於藍圖的一部分,它們就像一個社區建築,可供所有實例使用,並由所有實例共享。不要試圖將靜態成員視爲面向對象原則的一部分。它們受訪問修飾符影響,但它們根本不參與繼承。 – Guffa 2012-03-31 20:22:22

+0

這是有道理的。但我仍然不能想到一個對象如何決定其他兄弟姐妹的命運(訪問只應該得到而不是設置)。順便說一下,如果有一個類的公共靜態成員,它可以通過派生類訪問。這增加了我的問題..爲什麼一個對象和派生類能夠改變父類的靜態成員。 – singsuyash 2012-03-31 21:05:00

0

MSDN中明確指出:

「當一個類的實例包含該類的所有實例字段的單獨副本,在每個靜態字段只有一個副本「。

1

的重要組成部分,是

public static string Name="foo"; 

它創建了一個多變靜態屬性。這允許

Class1.Name="bar" 

類以及來自類 - 裏面的類可以縮短這

Name="bar" 

這正是通過ChangeName("bar")

稱爲

您可能想要考慮

public static readonly string Name="foo"; 

編輯

如果你希望能夠將值僅從靜態方法內改變,可以考慮使用一個setter /吸氣與相應的setter邏輯構造。

+0

但我想要一個類能夠多次更改其靜態成員!不能這樣做,如果它只是一個 – singsuyash 2012-03-31 20:07:35

+0

那麼,那有什麼問題?如果你可以改變你的類的靜態屬性,你也可以在類中改變它 - 比如你的OQ代碼。 – 2012-03-31 20:53:03