我已经学习了两个星期的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");
}
静态这个词是否具有全局意义,或者在代码的不同部分使用,意思可以改变?
答案 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.
}
在实例级别声明它是不合逻辑的,因为运算符必须应用于类型。
答案 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
在任何地方都保持相同:
使用类型名称调用它们。不需要实例 - 这使它们稍微快一点。静态方法可以是公共的或私有的。
<强>的信息:强> 静态方法使用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#中,数据成员,成员函数,属性和事件可以声明为静态或非静态。
只存在静态字段和事件的一个副本,静态方法和属性只能访问静态字段和静态事件。
静态成员通常用于表示不响应对象状态而更改的数据或计算。
静态可以通过以下方式使用:
更多参考资料: MSDN
答案 5 :(得分:0)
static
关键字表示通常相同的无处不在。如果它是类的修饰符,则该类的成员也必须标记为static
。当它是成员的修饰符(字段,属性,方法,事件等)时,可以使用以下语法访问该成员:
ClassName.memberName
请注意,必须将运算符声明为static
,并且扩展方法必须位于静态类中,这意味着它也必须是static
。
答案 6 :(得分:0)
简单来说,不会在类中更改静态属性,如果静态成员在更改其值后影响多个类,则会在受其影响的每个类中更改它。
如果您倾向于在静态上下文中使用静态方法(静态类等),静态方法必须是静态的。
静态类是无法实例化的类,例如静态类Car {}这辆车将始终具有相同的属性(颜色,大小......)
答案 7 :(得分:0)
有许多与Static关键字相关的概念。 This回答将解决您对静态的困惑。