1)静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么,数据和函数都不会改变。当类中没有依赖于对象标识的数据或行为时,可以使用静态类。
无论对象发生什么,函数都不会改变是什么意思?功能如何改变?静态变量,是的,但函数?
“对象身份”是什么意思?那会是例如房屋对象中的特定房屋吗? (所以我们处理一个特别选择的房子)。那么静态类不适用于任何房屋对象吗?
2)如果我不使用实例状态,我应该总是使用静态类吗?使用实例状态的静态类和实例类之间有什么区别?我能想到的只是静态类只有1个实例,因此如果类使用实例状态(如果有线程同步),则1个实例意味着许多调用将排队?显然,静态状态应该只需要一个静态类。
这是对的吗?
答案 0 :(得分:3)
我倾向于将静态方法视为创建与特定类相关的辅助函数的一种方式,因此我可以全局使用它们而无需实例化任何对象。一个非常简单的例子是:
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.
}
}
因此,在上面的场景中,您可以看到我是否创建了一个人物对象,我可以使用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"));
答案 1 :(得分:2)
静态方法只是标记到特定类的全局函数。它们主要用作没有多重继承的语言的解决方法。
如果你有一个从半径计算周长的函数,你的项目中需要这个函数,你可以这样做一个类:
public static class geometry_facilities
{
public static Double circumference (Double radius)
{
return radius * 2 * Math.PI
}
}
您可以通过以下方式访问此功能:
geometry_facilities.circumference (6.730);
以面向对象的方式执行此操作将是不使用静态任何内容,而是从geometry_facilities中继承并继承功能。静态方法主要用于OO语言,只有单一继承,以便于代码重用。
答案 2 :(得分:1)
回答问题1)
想象一下,你有一个Car对象,其中包含一个名为speed的字段。如果您创建一个新的汽车对象,然后使用此函数设置速度属性
public void SetSpeed(int value)
{
this.speed = value
}
函数SetSpeed将取决于正在初始化的汽车对象,因此它可以访问速度属性。因此,如果没有初始化的汽车,SetSpeed就不会被调用。但是,如果该函数是静态的,那么它将无法访问任何特定的已初始化的汽车对象,只能访问其他静态定义的对象。
回答问题2) 静态函数无法访问任何实例声明的函数或变量,因此使用静态函数处理实例状态项是没有意义的。
答案 3 :(得分:1)
静态类没有实例。加载程序集后,所有静态类中的所有静态方法都可立即用于应用程序。另一种说法是,您不必使用new运算符创建静态类的实例,以便使用该类中的方法。
这实际上意味着你不会在静态类中处理状态,这实际上使方法不可变,因此是线程安全的。静态方法不会发生线程排队;所有电话都会立即执行。没有对象标识,因为正如您正确指出的那样,该类没有多个实例可用。
扩展方法和实用程序方法是静态类中静态方法的典型示例。它们通常接受一个对象,对其进行操作,并返回相同或不同类型的新对象或修改对象。调用之间没有状态,因为正如一张海报指出的那样,由于没有类实例,所以没有地方可以保存类变量。当方法返回时,方法中为处理目的定义的任何变量都超出范围(丢失)。
答案 4 :(得分:1)
无论对象发生什么,函数都不会改变是什么意思?功能如何改变?静态变量,是的,但函数?
我认为措辞严厉:不管“静态数据和函数如何不论对象发生什么都不会改变”,最好说“静态数据和函数不影响,不受影响,更改对象的特定实例。“
例如,给定类似......
public class Car
{
int m_speed;
public int Speed { set { m_speed = value; } }
}
......一些静态数据和静态方法可能是这样的......
public class Car
{
int m_speed;
public int Speed { set { m_speed = Math.Max(value, s_maxSpeed; } }
//static data and static method
static int s_maxSpeed;
public static void SetMaxSpeed(int maxSpeed) { s_maxSpeed = maxSpeed; }
}
...在此示例中,静态s_maxSpeed
值存在,并且可以调用静态SetMaxSpeed
方法,无论是否存在任何Car
实例。
“对象身份”是什么意思?那会是例如房屋对象中的特定房屋吗? (所以我们处理一个特别选择的房子)。那么静态类不适用于任何房屋对象吗?
我认为“对象身份”和“对象实例”意思相同:它们是同义词。 object.ReferenceEquals
方法允许您测试对象的标识,即查看两个对象引用是否指向相同(“相同”)的实例/标识。
如果我不使用实例状态,我应该总是使用静态类吗?
'是'(在某种程度上)因为一切(甚至是非实例状态)必须在某种(例如,静态)类中。
使用实例状态的静态类和实例类之间有什么区别?我能想到的只是静态类只有1个实例,因此如果类使用实例状态(如果有线程同步),则1个实例意味着许多调用将排队?
一个区别是静态数据始终存在,而实例数据在创建实例之前/之前不存在。你是对的,静态类类似于单例对象。
但是,即使需要线程同步,“同步”也不会自动发生(无论是静态还是单例),而是在任何一种情况下都必须明确实现(例如使用{{1关键字等等。)。