在c#中声明静态类型的成员

时间:2012-02-24 16:19:16

标签: c# java static

更新#2 - 解决了谜题

我已经弄清楚了这个问题 - 在java内部类中使用时,我对关键字 static 的误解。我认为静态意味着传统意义上的静态 - 就像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#中这样做。我收到以下错误:“无法在行上声明静态类型'Holder'的变量”:“private Holder holder;”

如何在C#中实现相同的效果(如果可以的话)。

更新#1

以下是此模式如何用于优化自定义列表适配器的示例。如您所见,我不能通过静态类名访问静态成员,但需要通过变量引用它。它需要传递给Tag。

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;
}

}

4 个答案:

答案 0 :(得分:2)

因为您无法在C#中创建静态类型的实例。

您可以直接在c#中访问静态类型的方法和属性。

访问静态类成员

Staticclass.PropetyName;
Staticclass.methodName();

静态类

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

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

因此无需创建静态类型的实例,根据C#语言语法,这是非法的。

答案 1 :(得分:0)

.NET中的静态类没有实例化,因此存储它们以供以后使用确实没有意义。你只需使用它们:

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

因此,在上面,如果我修改了txt1,那么txt1将被改变为调用它向前移动的每个对象。这就是为什么它被称为静态;它的值被设置为静态,用于调用它的所有内容。希望这会有所帮助。

如果没有,这是MSDN链接:http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

它应该更多地澄清静态:)

答案 2 :(得分:0)

因为在C#中private Holder holder;创建了一个Holder类的实例,并且您无法创建Static类的实例。只需使用该课程。

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

答案 3 :(得分:0)

你真的想要实例化Holder吗?您不需要实例来访问静态成员。

如果你真的这样做,只需从static删除static class Holder { ... }