在C#中使用静态variables是什么? 何时使用它? 为什么我不能在方法中声明静态variables?
我已经在C#中search静态variables,但我仍然没有得到它的用途。 另外,如果我尝试在方法内部声明variables,它将不会授予我执行此操作的权限。 为什么?
我见过一些关于静态variables的例子。 我已经看到,我们不需要创build类的实例来访问variables,但是这不足以理解它的用途以及何时使用它。
第二件事
class Book { public static int myInt = 0; } public class Exercise { static void Main() { Book book = new Book(); Console.WriteLine(book.myInt);//shows error why its shows me error?cant i access the static variable by making the instance of a class? Console.ReadKey(); } }
static
variables在类的所有实例之间共享它的值。
没有声明的例子static:
public class Variable { public int i = 5; public void test() { i = i + 5; Console.WriteLine(i); } } public class Exercise { static void Main() { Variable var = new Variable(); var.test(); Variable var1 = new Variable(); var1.test(); Console.ReadKey(); } }
说明:如果你看上面的例子,我只是声明int
variables。 当我运行这个代码时,输出将是10
和10
。 这很简单。
现在让我们看看这里的静态variables。 我声明variables是static
。
带有静态variables的示例:
public class Variable { public static int i = 5; public void test() { i = i + 5; Console.WriteLine(i); } } public class Exercise { static void Main() { Variable var = new Variable(); var.test(); Variable var1 = new Variable(); var1.test(); Console.ReadKey(); } }
现在当我运行上面的代码时,输出将是10
和15
。 所以静态variables值是在该类的所有实例之间共享的。
C#根本没有静态variables 。 您可以通过C#在特定types定义中声明静态字段 。 静态字段是一个状态,与特定types的所有实例共享。 因此,静态字段的范围是整个types。 这就是为什么你不能在一个方法中声明静态字段 – 方法本身是一个作用域,并且在方法的边界上必须无法访问在方法中声明的项目。
当只需要一个variables副本时使用静态variables。 所以如果你在方法中声明了variables,那么就没有这个variables的使用,所以它变成本地函数。
静态的例子是
class myclass { public static int a = 0; }
声明为静态的variables通常在类的所有实例中共享。
声明为静态的variables通常在类的所有实例中共享。 当您创buildVariableTest类的多个实例时,这个variables永久性是在所有这些实例之间共享的。 因此,在任何给定的时间点,永久variables中只会包含一个string值。
由于只有一个variables可用于所有实例,代码this.permament将导致编译错误,因为可以回想起this.variablename引用实例variables名称。 因此,静态variables将被直接访问,如代码所示。
静态variables的一些“真实世界”例子:
build立一个类,你可以达到你的应用程序的硬编码值。 类似于枚举,但在数据types上更具灵活性。
public static class Enemies { public readonly static Guid Orc = new Guid("{937C145C-D432-4DE2-A08D-6AC6E7F2732C}"); }
众所周知的单身人士,这允许控制有一个类的一个实例。 如果你想在你的整个应用程序中访问它,这是非常有用的,但是不要把它传递给每个类,只是为了让这个类可以使用它。
public sealed class TextureManager { private TextureManager() {} public string LoadTexture(string aPath); private static TextureManager sInstance = new TextureManager(); public static TextureManager Instance { get { return sInstance; } } }
这就是你如何调用纹理pipe理器
TextureManager.Instance.LoadTexture("myImage.png");
关于你的最后一个问题:你指的是编译器错误CS0176 。 我试图find更多的信息,但只能find什么msdn不得不说:
即使没有创build类的实例,也可以在类上调用静态方法,字段,属性或事件。 如果创build了类的任何实例,则不能使用它们来访问静态成员。 静态字段和事件只存在一个副本,静态方法和属性只能访问静态字段和静态事件。
操作types实例的数据成员和函数成员称为实例成员。 int的ToString方法(例如)是实例成员的示例。 默认情况下,成员是实例成员。 不在types实例上操作的数据成员和函数成员,而是types本身,必须标记为静态。 Test.Main和Console.WriteLine方法是静态方法。 Console类实际上是一个静态类,这意味着它的所有成员都是静态的。 你从来没有真正创build一个控制台的实例 – 一个控制台在整个应用程序中共享。
静态类不要求你创build这个类的一个对象/实例化它们,你可以在C#关键字的前面添加静态类名,使其成为静态的。
记住:我们没有实例化Console类,String类,Array类。
class Book { public static int myInt = 0; } public class Exercise { static void Main() { Book book = new Book(); //Use the class name directly to call the property myInt, //don't use the object to access the value of property myInt Console.WriteLine(Book.myInt); Console.ReadKey(); } }
回应“何时使用它?” 题:
我经常使用静态(类)variables来为每个类的实例分配一个唯一的实例ID。 我在每个class级都使用相同的代码,这很简单:
//Instance ID ---------------------------------------- // Class variable holding the last assigned IID private static int xID = 0; // Lock to make threadsafe (can omit if single-threaded) private static object xIDLock = new object(); // Private class method to return the next unique IID // - accessible only to instances of the class private static int NextIID() { lock (xIDLock) { return ++xID; } } // Public class method to report the last IID used // (ie the number of instances created) public static int LastIID() { return xID; } // Instance readonly property containing the unique instance ID public readonly int IID = NextIID(); //-----------------------------------------------------
这说明了有关静态variables和方法的几点意见:
- 静态variables和方法与类关联,而不是任何特定的类实例。
- 可以在实例的构造函数中调用一个静态方法 – 在这种情况下,使用静态方法NextIID来初始化只读属性IID,它是此实例的唯一标识。
我觉得这很有用,因为我开发的应用程序中使用了对象群,并且能够跟踪已创build的数量以及跟踪/查询单个实例是很好的。
我还使用类variables来跟踪可以实时报告的实例的总和和属性的平均值。 我认为这个class级是保存有关class级所有实例的汇总信息的好地方。
尝试直接使用类名称Book.myInt
调用它
在程序退出之前,静态variables会保留之前的值。 通过直接调用class_Name.Method()或class_Name.Property来使用静态。 不需要对象引用。 静态最stream行的用法是C#的math课。 Math.Sin(),Math.Cos(),Math.Sqrt()。