1)静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么变化,数据和函数都不会更改。当类中没有依赖于对象标识的数据或行为时,可以使用静态类。
无论对象发生什么情况,函数都不会改变,这意味着什么?函数是如何改变的?静态变量,是的,但是函数呢?
“对象标识”是什么意思?例如,会不会是一个房子对象中的一个特定房子?(因此,我们处理的是一个特定的房子)。所以静态类不会在任何房屋对象上工作?
2)如果我不使用实例状态,我应该总是使用静态类吗?使用实例状态的静态类和实例类有什么不同?我所能想到的是静态类将只有一个实例,因此一个实例意味着如果类使用实例状态工作(如果有线程同步),那么许多调用将被排队。显然,静态应该只需要一个静态类。
这是正确的吗?
发布于 2009-07-04 00:31:13
对问题1的回答)
假设您有一个Car对象,其中包含一个名为speed的字段。如果您创建了一个新的car对象,然后使用此函数设置速度属性
public void SetSpeed(int value)
{
this.speed = value
}函数SetSpeed将依赖于正在初始化的car对象,因此它可以访问速度属性。因此,如果没有初始化的car,SetSpeed将是不可调用的。但是,如果该函数是静态的,那么它将无法访问任何特定的初始化汽车对象,只能访问其他静态定义的对象。
对问题2的回答)静态函数不能访问任何实例声明的函数或变量,因此让静态函数处理实例状态项没有意义。
发布于 2009-07-04 00:43:43
我倾向于将静态方法视为创建与特定类相关的帮助器函数的一种方式,这样我就可以全局地使用它们,而不必实例化任何对象。一个非常简单的例子是:
public class Person
{
private string name;
private DateTime dob;
public Person(string name, DateTime dob)
{
this.name = name;
this.dob = dob;
}
public int Age { get { return CalculateAge(this.dob); } }
public string Name { get { return this.name; } }
public static int CalculateAge(DateTime dob)
{
// use dob to work out age.
}
}因此,在上面的场景中,您可以看到如果我创建了一个person对象,我可以使用readonly属性封装年龄的计算。但是,如果我需要根据日期计算出某人的年龄,我可以使用静态方法,即
// object usage
var p = new Person("Joe Bloggs", DateTime.Parse("10/11/1981"));
Console.WriteLine(p.Age);
// static usage
Console.WriteLine(Person.CalculateAge(DateTime.Parse("10/11/1981"));发布于 2009-07-04 00:45:45
静态方法只不过是标记到特定类的全局函数。它们主要用作没有多重继承的语言中的一种变通方法。
如果你有一个从半径计算圆周的函数,并且在你的项目中到处都需要这个函数,你可以这样做一个类:
public static class geometry_facilities
{
public static Double circumference (Double radius)
{
return radius * 2 * Math.PI
}
}您可以在任何地方使用以下命令访问此函数:
geometry_facilities.circumference (6.730);面向对象的方法是不使用静态的任何东西,而是使用从geometry_facilities继承的乘法来引入功能。静态方法主要用于只有一个继承的OO语言中,以促进代码重用。
https://stackoverflow.com/questions/1081191
复制相似问题