2012-02-24 47 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