对于C#开发人员来说,静态方法和非静态方法应该是再熟悉不过了。那么,对于新手或者是初学者来说,C#中的静态方法和非静态方法又是什么呢,如何来区别呢?本文就将这两个问题进行总体的比较。
一、定义
在比较C#中的静态方法和非静态方法的区别之前,首先我们明确一下什么是静态方法,什么是非静态方法。 MSDN官方的定义为:若类的方法前加了static修饰符,则该方法称为静态方法,如果类的方法前没有static这个修饰符则为非静态方法。 看起来静态方法和非静态方法的区别很简单,也很明显,即看类的方法前是否有static修饰符,如下示例代码:namespace StaticMethodDemo { /// <summary> /// 定义Book类 /// </summary> public class Book { #region 成员属性 public int Id { get; set; } public static string Name { get; set; } #endregion /// <summary> /// 定义一个新增Book静态方法Create /// </summary> public static void Create() { //TODO:处理逻辑 Name = "Head First"; //出错,不能访问静态属性 Id = 1; } /// <summary> /// 定义一个删除Book的非静态方法Delete /// </summary> public void Delete() { //TODO:删除的业务逻辑 //不会出错 Name = "Head First"; //不会出错 Id = 1; } } }上例中,我们定义了一个Book类,在Book类中,分别定义了一个静态方法Create()和一个非静态方法Delete()。那么,作为静态方法,我们可以在其他可以直接使用Book的地方以Book.Create()的方式来调用Create这个静态方法,但作为非静态方法的Delete(),我们就不可以直接使用Book.Delete()这种方式来调用,如果需要调用Delete()方法,我们需要先实例化一个Book对象,如:
Book book=new Book(); book.Delete();那么,总结以上示例得出: 1.静态方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用!而非静态方法则只能通过类的实例才能调用。 2.C#静态方法属于类所有,类实例化前即可使用。 3.非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。 4.因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存。 5.静态方法中不能使用this关键字 6.静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。 另外,在C#静态方法中获取类的名称 静态方法中用:
string className = System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName;非静态方法中还可以用:
string className = this.GetType().FullName;再补充一些来自《Head First C#》对静态方法和非静态方法的问答。
问:考虑“表态”的东西时,我总认为这是一种不会改变的东西。这是不是说,非静态的方法可以改变,而静态方法不能?它们的行为是不是不一样? 答:不是这样的,静态和非静态方法的行为完全相同。唯一的区别是,静态方法不要求要实例,而非静态方法需要先有一个实例。很多人记不住这一点,因为“静态”这个词确实不太直观。 问:那么,创建一个对象实例之前是不是不能使用类? 答:可以使用类的静态方法。不过,如果有非表态方法,使用这些方法之前就必须先有一个实例。 问:那么为什么还要这种需要实例的方法呢?为什么不干脆把所有方法都设置为静态方法呢? 答:这是因为,如果由对象记录某些数据,就可以使用各个实例的方法来处理各自的这些数据。 比如本例中的Book类,如果我们同时实例化几个Book实例,那么我们在使用Delete()方法时,就可以分别操作各自的Book实例,而不会影响到各自的数据。本文对C#静态方法和非静态方法的区别比较旨在帮助你更好地理解相关理论和概念,如果有什么问题,欢迎反馈,交流。
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册