2012-02-24 80 views
3

更新#2 - 神祕現象聲明靜態類型的成員在C#

我必須弄明白的問題 - 是在Java內部類使用的時候,這是我的關鍵字靜態的誤解。我認爲靜態意味着傳統意義上的靜態 - 與c#一樣。在Java的情況下,靜態內部類的含義略有不同。我個人會使用除靜態以外的其他關鍵字來達到相同的效果以消除混淆。

這裏有幾個很好的鏈接可以解釋java中靜態內部類的含義。

link1 link2

對不起發送白費力氣:)

原貼大家

在java中我可以寫:

public class UseStaticMembers { 
    private Holder holder; 

    holder.txt1 = "text"; 
    holder.txt2 = "text"; 

    CallSomeMethod(holder); 
} 


static class Holder { 
    public string txt1; 
    public string txt2; 
} 

但我不能在C#中執行此操作。我得到以下錯誤:「不能聲明一個靜態類型'持有人'的變量:」私人持有人持有人;「我如何在C#中實現相同的效果(如果可以的話)。

更新#1

下面是這種圖案是如何用於優化自定義列表適配器的示例。正如你所看到的,我不能通過靜態類名訪問靜態成員,但需要通過變量引用它。它需要傳遞給標籤。

public class WeatherAdapter extends ArrayAdapter<Weather>{ 

Context context; 
int layoutResourceId;  
Weather data[] = null; 

public WeatherAdapter(Context context, int layoutResourceId, Weather[] data) { 
    super(context, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    WeatherHolder holder = null; 

    if(row == null) 
    { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 

     holder = new WeatherHolder(); 
     holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); 
     holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle); 

     row.setTag(holder); 
    } 
    else 
    { 
     holder = (WeatherHolder)row.getTag(); 
    } 

    Weather weather = data[position]; 
    holder.txtTitle.setText(weather.title); 
    holder.imgIcon.setImageResource(weather.icon); 

    return row; 
} 

static class WeatherHolder 
{ 
    ImageView imgIcon; 
    TextView txtTitle; 
} 

}

+1

如果你想要一個'Holder'的實例,爲什麼要使它成爲'static'? – 2012-02-24 16:22:51

+0

@IUnknown你應該知道靜態和實例成員之間有什麼區別。他們是不同的。 – nawfal 2012-02-24 16:23:57

+1

你試圖實現什麼樣的效果? - 也就是說,在java中以這種方式使用靜態類屬性是做什麼的一個實例屬性不? – 2012-02-24 16:23:58

回答

2

因爲你不能創建在C#靜態類型的實例。

您可以直接訪問c#中靜態類型的方法和屬性。

訪問靜態類成員

Staticclass.PropetyName; 
Staticclass.methodName(); 

靜態類

public static Staticclass 
{ 
    public type PropetyName { get ; set; } 

    public type methodName() 
    { 
    // code 
    return typevariable; 
    } 
} 

所以沒有必要創建靜態類型,根據C#語言的語法這是違法的一個實例。

+0

這就是我的想法。我知道我可以通過你寫的靜態類名訪問成員。我需要將它傳遞給另一種方法 - 那就是要求 - 就像我可以在Java中執行的那樣:CallSomeMethod(持有者); – IUnknown 2012-02-24 16:24:26

+0

在這種情況下,您無需通過。你可以通過調用Holder.tx1等來訪問tx1和txt2。 – nawfal 2012-02-24 16:25:54

+1

如果是這樣的話,我會讓這個類變成一個Singleton;它是一種使用靜態的模式,可以確保只有一個實例存在,並且可以靜態檢索,但一旦得到它就可以像使用實例類一樣使用它。看看http://csharpindepth.com/Articles/General/Singleton.aspx – KeithS 2012-02-24 16:27:28

0

.NET中的靜態類沒有實例化,所以將它們存儲以後使用確實沒有意義。您只需使用它們:

Holder.txt1 = "text"; 
Holder.SomeMethod(); 

所以,在上面的,如果我修改txt1中,然後txt1中將會爲調用它前進的每一個對象改變。這就是爲什麼它被稱爲靜態;它的值是設置的,對於調用它的所有東西都是靜態的。希望有幫助。

如果不是,這裏是MSDN鏈接:http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

應該澄清靜態多一點:)

0

因爲在C#private Holder holder;創建Holder類的一個實例,你不能創建靜態實例類。只用班級。

Holder.txt1 = "text"; 
Holder.txt2 = "text"; 
CallSomeMethod(holder); 
+0

查看上面的更新爲什麼我不能使用類 – IUnknown 2012-02-24 16:32:13

0

你真的想實例化Holder嗎?您不需要實例來訪問靜態成員。

如果你真的這麼做,只需從static class Holder { ... }刪除static

+0

查看上面的更新爲什麼。 – IUnknown 2012-02-24 16:31:31

+0

@IUnknown你的更新中'WeatherHolder.imgIcon'和'WeatherHolder.txtTitle'不是靜態的。下定決心:你是否需要靜態成員?順便說一句,更新甚至不會編譯(在C#中),除非你從靜態類WeatherHolder {...}中移除'static'。 – 2012-02-24 16:39:01

+0

您的權利抱歉修正了上面的原始代碼 - 從測試代碼複製。問題仍然存在。我想要一個可以在代碼中引用的靜態「持有者」類。 C#將上面更新後的代碼intprets稱爲「不允許靜態類中的非靜態字段」。這似乎是Java和c#關注靜態方面的根本區別。 – IUnknown 2012-02-24 16:47:01