静态在代码的不同部分是什么意思?

时间:2015-08-06 09:01:29

标签: c#

我已经学习了两个星期的C#,虽然这不是我的第一语言。我一直想知道静态这个词。我知道我早就应该研究过这个词了......但这是我第一次意识到这个词对我来说有多么混乱。我读过的内容:

静态类是一个不需要实例化的类( Class with single method -- best approach?)。这可能有一些优点和一些关于测试,多态等的不利因素。

但静态词也可以应用于类,字段,方法,属性,运算符,事件和构造函数! (https://msdn.microsoft.com/en-us/library/98f28cdx%28v=vs.80%29.aspx)。例如:

属性:

private static string s  = "";

方法:

public static void helperMethod() {
        Console.WriteLine("Whatever");
    }

静态这个词是否具有全局意义,或者在代码的不同部分使用,意思可以改变?

8 个答案:

答案 0 :(得分:6)

class修饰符

static应用于class时,表示有四个属性。

  • 仅包含静态成员。
  • 无法实例化。
  • 密封。
  • 不能包含实例构造函数。

属性或函数修饰符(以及事件和方法)

应用于属性和函数时,例如

public Thing
{
    static int SharedCount { get; set; }

    static string GenerateName()
    {
        // ...
    }
}

这意味着可以通过类型名称访问属性和函数,而无需实例化类。无法通过类的实例访问此属性和函数。所以,两者

var i = Thing.SharedCount;
var s = Thing.GenerateName();

有效且正确的陈述,在哪里

var i = new Thing().SharedCount;
var s = this.GenerateName();

都不正确。

使用static修饰符声明的函数和属性中的代码无法访问类的非静态成员。

成员变量

使用static修饰符声明的成员变量,例如

class Thing
{
    private static int sharedCount = 0;
    private static readonly IDictionary<string, int> ThingLookup =
            new Dictionary<string, int>
                    {
                        { "a", 1 },
                        { "b", 2 }
                    };
}
所有静态函数和属性以及类的所有实例都

共享

static构造函数

当应用于构造函数时,例如

class Thing
{
    static Thing()
    {
        \\ Do this once and first.
    }
}

static表示首次访问类型时,构造函数将按AppDomain运行一次。 There are special edge cases around this

<强>运算符

当一个操作符为一个类型重载时,它总是被声明为static,例如

public static Thing operator +(Thing left, Thing right)
{
    // Something special to do with things.
}

在实例级别声明它是不合逻辑的,因为运算符必须应用于类型。

herehereherehere解释了这些区别。

答案 1 :(得分:1)

静态成员是被认为非常普遍的项目,因此在调用成员时无需创建该类型的实例。虽然任何类都可以定义静态成员,但它们最常见于实用程序类中,例如System.Console,System.Math,System.Environment或System.GC,依此类推。

C#中的static关键字也指的是类中的某些东西,或类本身,它在类的所有实例之间共享。例如,可以通过类名从该类的所有实例访问标记为static的字段。

答案 2 :(得分:0)

Word static说明了一切。如果某些类型的每个新对象都有可能发生变化的事情 - 它是instance member,如果它对所有实例保持不变 - 它是static成员。

来自MSDN:

  

将静态成员视为属于类和   实例成员属于对象(类的实例)。

来源:static and instance members

当实例成员只能在类MyClass.MyMember的实例上访问时,可以通过类对象访问静态成员,类似(new MyClass()).MyMember

很明显,编译器需要一些时间来创建实例,然后才能访问其属性。因此实例成员的工作速度比静态成员慢。

答案 3 :(得分:0)

快速回答:没有static在任何地方都保持相同:

来自dotnetperls:

使用类型名称调用它们。不需要实例 - 这使它们稍微快一点。静态方法可以是公共的或私有的。

<强>的信息: 静态方法使用static关键字,通常作为第一个关键字或第二个关键字后公开。

警告: 静态方法无法访问non-static class级别成员。它没有this指针。

<强>实例 实例方法可以访问这些成员,但必须通过实例化对象进行调用。这增加了间接性。 使用实例和静态方法的C#程序

using System;

class Program
{
  static void MethodA()
  {
    Console.WriteLine("Static method");
  }

  void MethodB()
  {
    Console.WriteLine("Instance method");
  }

  static char MethodC()
  {
    Console.WriteLine("Static method");
    return 'C';
  }

  char MethodD()
  {
    Console.WriteLine("Instance method");
    return 'D';
  }

  static void Main()
  {
      //
      // Call the two static methods on the Program type.
      //
      Program.MethodA();
      Console.WriteLine(Program.MethodC());
      //
      // Create a new Program instance and call the two instance methods.
      //
      Program programInstance = new Program();    
      programInstance.MethodB();
      Console.WriteLine(programInstance.MethodD());
    }
 }

<强>输出

Static method
Static method
C
Instance method
Instance method
D

答案 4 :(得分:0)

在C#中,数据成员,成员函数,属性和事件可以声明为静态或非静态。

只存在静态字段和事件的一个副本,静态方法和属性只能访问静态字段和静态事件。

静态成员通常用于表示不响应对象状态而更改的数据或计算。

静态可以通过以下方式使用:

  1. 静态数据成员
  2. 静态构造函数
  3. 静态属性
  4. 静态方法
  5. 更多参考资料: MSDN

    Static

    Static in c#

    What is static ?

答案 5 :(得分:0)

static关键字表示通常相同的无处不在。如果它是类的修饰符,则该类的成员也必须标记为static。当它是成员的修饰符(字段,属性,方法,事件等)时,可以使用以下语法访问该成员:

ClassName.memberName

请注意,必须将运算符声明为static,并且扩展方法必须位于静态类中,这意味着它也必须是static

答案 6 :(得分:0)

简单来说,不会在类中更改静态属性,如果静态成员在更改其值后影响多个类,则会在受其影响的每个类中更改它。

如果您倾向于在静态上下文中使用静态方法(静态类等),静态方法必须是静态的。

静态类是无法实例化的类,例如静态类Car {}这辆车将始终具有相同的属性(颜色,大小......)

答案 7 :(得分:0)

有许多与Static关键字相关的概念。 This回答将解决您对静态的困惑。