在静态方法(static method)中访问非静态(non-static)的数据(data)

如果你新建了一个窗体,上面加了一个Lable,id=lbl,如果想使用方法(method)更改lbl的显示的值,可以这样做:
public void ChangeText()
{
  lbl.Text
="Changed";
}
调用ChangeText(),lbl就会显示为“Changed”。
如果需要把ChangeText()改为静态方法,
public static void ChangeText()
{
  lbl.Text
="Changed";
}
肯定通不过编译,因为静态方法、数据只同类有关,与类实例无关,在类实例化以前就存在了,静态方法只可以访问类中的静态数据或者其他静态方法,不可以访问其他非静态的数据和方法,原因很简单,静态方法不知道实例成员的内存地址,所以无法访问。
那么,静态方法有没有办法访问实例成员呢?比如上面的方法,用静态方法访问实例的Lable?
答案是肯定的。
不能使用静态方法访问实例成员的原因是因为不知道实例成员的内存地址,如果知道了,就可以访问了。
如:
public class Form1: System.Windows.Forms.Form
{
  
private System.Windows.Forms.Label label1;
  
private System.Windows.Forms.Button button;
  
private static void MyChange(Form1 fm)
  
{
    fm.label1.Text
="Changed";
  }

   
private void button_Click(object sender, System.EventArgs e)
  
{
     MyChange(
this);
  }

  
}

调用MyChange方法,传递给它窗体的引用,就可以达到目的。

记得Csdn有人问过一个问题,建立一个子类,在主类中声明这个类为static,如 private static Someclass someclass=new SomeClass();
然后使用SomeClass的内置的方法更改主类中的StatusBar.Text,用上面的方法应该可以。
public class SomeClass
{
  
private Form1 fm;
  
public Form1 Fm
{
  
set{fm=value;}
}

public void Change()
{
   fm.StatusBar.Text
="Changed";
}

}


主类中:
 
public class Form1 : System.Windows.Forms.Form
{
private static SomeClass someClass=new SomeClass();
private void button_Click(object sender, System.EventArgs e)
  
{
someClass.Fm
=this;
someClass.Change();

       }


}

如果把StatusBar.Text的值指向一个静态String,
public static string sText=null;
bar.Text=sText;
通过更新sText的值也可以更改bar.Text,不过需要时时刷新bar.Text=sText才可以,不如上面的办法好。

关于这种方法的使用价值,可以用在以下情况:
用Vs建立了一个Form,Form中有一个ListBox,用来显示信息,对于主类,可以建立以下方法:
private ListBox lb;
//.
private void ShowMessage(string message)
{
  lb.Items.Add(message);
  lb.SelectedIndex
=lb.Items.Count-1;
}
对于其他类,如果单独建立,那么使用
throw new Exception(something);
比较合适。
如果是在Form项目中建立,把错误信息显示在ListBox中,是不是更加人性化点;要在非Form1类中显示错误信息到ListBox中,可以把用属性把ListBox的引用传递过来,然后建立ShowMessage(),这样可行,只是相同的ShowMessage()要建立2次,不符合编程的原则,不要使用重复代码,那么可以在Form1 中建立静态方法:
    /// <summary>
        
/// 显示信息,静态方法,方便其他类使用
        
/// </summary>
        
/// <param name="fm"></param>
        
/// <param name="Message"></param>

        public static void ShowMessage(Form1 fm,string Message)
        
{
            fm.lb.Items.Add(Message);
            fm.lb.SelectedIndex
=fm.lb.Items.Count-1;
        }
方便其他类使用,这样如果要更改ListBox相关的信息,可以只在Form1种修改Showmessage()就可以了。

仁者见仁,智者见智,请大家发表意见。

posted on 2005-06-14 11:29  Pierce  阅读(3539)  评论(5编辑  收藏  举报

导航