在证明静态类时,这意味着什么?

时间:2009-07-04 00:22:45

标签: c#

1)静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么,数据和函数都不会改变。当类中没有依赖于对象标识的数据或行为时,可以使用静态类。

无论对象发生什么,函数都不会改变是什么意思?功能如何改变?静态变量,是的,但函数?

“对象身份”是什么意思?那会是例如房屋对象中的特定房屋吗? (所以我们处理一个特别选择的房子)。那么静态类不适用于任何房屋对象吗?

2)如果我不使用实例状态,我应该总是使用静态类吗?使用实例状态的静态类和实例类之间有什么区别?我能想到的只是静态类只有1个实例,因此如果类使用实例状态(如果有线程同步),则1个实例意味着许多调用将排队?显然,静态状态应该只需要一个静态类。

这是对的吗?

5 个答案:

答案 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关键字等等。)。