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

Wri*_*Man 2 c#

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

静态类是一个不需要实例化的( 使用单一方法的类 - 最佳方法?).这可能有一些优点和一些关于测试,多态性等的不利因素.

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

属性:

private static string s  = "";
Run Code Online (Sandbox Code Playgroud)

方法:

public static void helperMethod() {
        Console.WriteLine("Whatever");
    }
Run Code Online (Sandbox Code Playgroud)

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

Jod*_*ell 6

class 修改

何时static应用于class它表示四个属性.

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

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

当应用于属性和功能时,例如

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

    static string GenerateName()
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

var i = Thing.SharedCount;
var s = Thing.GenerateName();
Run Code Online (Sandbox Code Playgroud)

是有效和正确的陈述,在哪里

var i = new Thing().SharedCount;
var s = this.GenerateName();
Run Code Online (Sandbox Code Playgroud)

都不正确.

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


成员变量

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

class Thing
{
    private static int sharedCount = 0;
    private static readonly IDictionary<string, int> ThingLookup =
            new Dictionary<string, int>
                    {
                        { "a", 1 },
                        { "b", 2 }
                    };
}
Run Code Online (Sandbox Code Playgroud)

共享由所有的静态功能和性能并且由该类的所有实例.


static 建设者

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

class Thing
{
    static Thing()
    {
        \\ Do this once and first.
    }
}
Run Code Online (Sandbox Code Playgroud)

static表示构造函数将在AppDomain首次访问类型时运行一次.围绕这个有特殊的边缘情况.


运营商

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

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

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

这里,这里,这里这里解释这些区别.