我正在尝试从静态方法访问变量。我了解静态方法与非静态方法的基本概念,但仍然不完全理解静态方法可以访问什么和不能访问什么。
起初,我尝试将变量放在程序类的顶部,正如您从我的一些注释掉的行中看到的那样。我无法从我的静态方法访问它们,随着我对静态的了解越来越多,这是有意义的。但后来我将变量放在静态方法中。这就是我不明白的地方。在静态方法内部,我可以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)