静态方法和访问变量的能力

rwb*_*bil 3 c# static

我正在尝试从静态方法访问变量。我了解静态方法与非静态方法的基本概念,但仍然不完全理解静态方法可以访问什么和不能访问什么。

起初,我尝试将变量放在程序类的顶部,正如您从我的一些注释掉的行中看到的那样。我无法从我的静态方法访问它们,随着我对静态的了解越来越多,这是有意义的。但后来我将变量放在静态方法中。这就是我不明白的地方。在静态方法内部,我可以fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite);在 if 语句之外设置一次, 当我在静态方法内部sw = new StreamWriter(fs)时,它会给我一个错误。FileStream fs尝试将其设为静态,正如您可以通过静态方法内的注释行看到的那样,但这也不起作用。我似乎能够访问变量的唯一方法是在 Program 类中(在静态方法之外)将它们设置为静态。

class Program {
    static FileStream fs;
    //   public bool fileopen = false;
    //  String filename = @"D:\Stock Trading\Test1.txt";
    static void Main(string[] args) {
        CreateDebugFile();
    }

    public static void CreateDebugFile() {
        StreamWriter sw;
        bool fileopen = false;
        //      static FileStream fs;
        String filename = @
        "D:\Stock Trading\Test1.txt";

        if (!fileopen) {
            fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite);
            fileopen = true;
        }

        sw = new StreamWriter(fs);
        sw.Write("Current Bar" + "\t" + "time" + "\t" + "Open" + "\t" + "Close" + "\t" + "Low" + "\t" + "High");

    }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

MSDNstatic中的关键字:

非静态类可以包含静态方法、字段、属性或事件。即使尚未创建类的实例,静态成员也可在类上调用。静态成员始终通过类名而不是实例名来访问。无论创建了多少个类的实例,静态成员都只存在一份副本。静态方法和属性无法访问其包含类型中的非静态字段和事件,并且它们无法访问任何对象的实例变量,除非在方法参数中显式传递该变量。

声明具有一些静态成员的非静态类比将整个类声明为静态更为典型。静态字段的两个常见用途是保存已实例化的对象数量的计数,或者存储必须在所有实例之间共享的值。静态方法可以重载但不能重写,因为它们属于类,而不属于类的任何实例。尽管不能将字段声明为 static const,但 const 字段的行为本质上是静态的。它属于类型,而不属于类型的实例。因此,可以使用用于静态字段的相同 ClassName.MemberName 表示法来访问 const 字段。不需要对象实例。

C# 不支持静态局部变量(在方法作用域中声明的变量)。

静态意味着可以直接针对对象访问它,而无需创建实例,即 a ,因此可以像这样访问类中定义的class静态成员:(而不是),并且当您从该类内部访问静态成员时,您可以直接使用,但编译器的处理方式与您从类外部访问它类似。NameMyClassNameMyClassName.Namenew MyClassName().NameName

虽然静态值未更改,但在应用程序中调用该静态属性的任何人都在访问同一实例,如果可以从类外部更改该值,则可能会导致并发问题。

举个例子:

public class MyClassName
{
    public static string FilePath = @"C:\Temp";
    public static FileStream fs;

    public static void CreateFileStream()
    {
        //creates a file stream
    }
}
Run Code Online (Sandbox Code Playgroud)

如果两个人同时调用同一个方法,MyClassName.CreateFileStream()那么第一个进入的人创建一个文件流并将其设置为fs,然后第二个人创建一个文件流并将其设置为fs,现在有可能有人有一个类中文件流的引用,另一个可能保留对类中不再设置的原始MyClassName文件流的引用。

因此,您需要注意如何公开静态成员(这不是您的特定示例中的问题,但要记住这一点很重要)。如果声明静态字段,则应确保将其实例化或将其保留为类的私有属性,以便确保在使用它时已将其实例化。

在您的情况下,您每次调用该方法时都会创建一个新的文件流,因为您bool fileopen位于该方法内部,方法内部的任何内容仅在该方法内部可用,无论是否静态,并且每次该方法时都会再次创建被调用,并且您需要static在要从另一个静态字段、属性或方法调用的字段或属性或方法的每个声明上使用该关键字。

class Program {
    static FileStream fs;      //needs to be static
    public static bool fileopen = false;    //needs to be static
    static  String filename = @"D:\Stock Trading\Test1.txt"; 
             //needs to be static, or this one could also be 
             //const if it will never change

    static void Main(string[] args) {
        CreateDebugFile();
    }

public static void CreateDebugFile() {
    //...
    }
}
Run Code Online (Sandbox Code Playgroud)