C#里面静态方法和静态变量的一点问题?
静态方法只能访问类静态成员,而非静态方法可以访问非静态和静态成员。那我想请问下,既然实例方法也可以调用静态成员的话,那直接在实例中调用不就好了?专门声明静态方法来调用静态...
静态方法只能访问类静态成员,而非静态方法可以访问非静态和静态成员。
那我想请问下,既然实例方法也可以调用静态成员的话,那直接在实例中调用不就好了?
专门声明静态方法来调用静态成员的意义是什么? 展开
那我想请问下,既然实例方法也可以调用静态成员的话,那直接在实例中调用不就好了?
专门声明静态方法来调用静态成员的意义是什么? 展开
2个回答
展开全部
对于运行以及效率是没有多大区别的,但是对于有追求的程序员是有很大区别的。
实例方法必须在实例化一个具体对象之后才能访问,为了封装性,对象的成员变量不允许外部程序访问,只允许实例方法访问,也就是做代码访问权限隔离。这种机制对于面向对象思想指导下编程是必须的也是标准。
但是我们往往有时候需要做一些数据处理,而这些处理即属于某个类但又具有通用性,而往往又具有一定代码量(需要封装在一个方法/函数内),并且其处理的数据与类中其他成员变量毫无关系。
此种情况下把方法封装在某个类时很麻烦,会存在几个问题:
1、被处理数据与该类业务逻辑完全无关却封装在类中很奇怪,对于整体架构造成破坏(会导致逻辑松散)。
2、创建对象过程过于冗长(因为外部程序很多不同地方都会经常调用,太累赘,有强迫症的人还要注意每次设置为null)
3、代码不美观可读性差(代码多了容易视觉繁杂)
举个例子,假如你在开发一个数据库系统,设计了一个类,专门处理数据库日期时间的存取以及显示转换(比如按指定格式输出),现在假设其中封装了一个检查日期有效性的公共方法,该方法一方面服务于类成员,另一方面,在很多场合,比如通过用户界面接受用户输入日期时也要校验,此时我们希望先进行校验,如果数据有效(包括其他数据)再创建数据对象把数据传递下去(因为创建对象有消耗),这时候希望不实例化的情况下调用类方法,这就是静态方法的需求场景之一。
假设这个自定义日期类为MyDate,下面是伪代码,
Date d;
d=GetUIDate();//取得界面日期数据
if (MyDate.IsValid(d)) //直接使用类名访问静态方法 ,无需事先定义对象名和new
{
//其他处理代码
}
实例方法必须在实例化一个具体对象之后才能访问,为了封装性,对象的成员变量不允许外部程序访问,只允许实例方法访问,也就是做代码访问权限隔离。这种机制对于面向对象思想指导下编程是必须的也是标准。
但是我们往往有时候需要做一些数据处理,而这些处理即属于某个类但又具有通用性,而往往又具有一定代码量(需要封装在一个方法/函数内),并且其处理的数据与类中其他成员变量毫无关系。
此种情况下把方法封装在某个类时很麻烦,会存在几个问题:
1、被处理数据与该类业务逻辑完全无关却封装在类中很奇怪,对于整体架构造成破坏(会导致逻辑松散)。
2、创建对象过程过于冗长(因为外部程序很多不同地方都会经常调用,太累赘,有强迫症的人还要注意每次设置为null)
3、代码不美观可读性差(代码多了容易视觉繁杂)
举个例子,假如你在开发一个数据库系统,设计了一个类,专门处理数据库日期时间的存取以及显示转换(比如按指定格式输出),现在假设其中封装了一个检查日期有效性的公共方法,该方法一方面服务于类成员,另一方面,在很多场合,比如通过用户界面接受用户输入日期时也要校验,此时我们希望先进行校验,如果数据有效(包括其他数据)再创建数据对象把数据传递下去(因为创建对象有消耗),这时候希望不实例化的情况下调用类方法,这就是静态方法的需求场景之一。
假设这个自定义日期类为MyDate,下面是伪代码,
Date d;
d=GetUIDate();//取得界面日期数据
if (MyDate.IsValid(d)) //直接使用类名访问静态方法 ,无需事先定义对象名和new
{
//其他处理代码
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询