[100分]----->静态变量生命周期<-----[100分]

method_01 2010-09-28 01:27:00
静态变量,如果有静态构造函数,则在第一次使用时创建,直到软件结束为完整声明周期,如果没有静态构造函数,则启动软件便会初始化,对么?
很抱歉,不完全对,泛型的静态变量。声明周期就无法从最初的时候开始,即便没有写静态构造函数。例如

public static class StaticClass<T>
{
public static T Value = default(T);
}

//测试
public static void Test()
{
Console.WriteLine(StaticClass<int>.Value);
StaticClass<int>.Value = 100;
GC.Collect();
GC.WaitForFullGCComplete();
Console.WriteLine(StaticClass<int>.Value);
}

只是一时兴趣。随手写了一个。有兴趣的朋友来仔细解释一下把。精彩回复高分,其他平均分。
...全文
537 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
gomoku 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wapdos 的回复:]
类的静态成员属于类本身,在类加载的时候就会分配内存的,
……
[/Quote]
这个回答了你的问题。
类的定义包含静态成员(在MethodTable项下)。
method_01 2010-09-28
  • 打赏
  • 举报
回复
是的。我只是类比,没说c#是这样。只是说。c++是如何实现的,以类比的方式说明我希望得到什么答案。就是想知道.net如何实现静态变量的。
是不是.net下没有全局变量和静态变量(c++传统意义下的),所以实际上,用静态变量当做全局变量用,这样用是可以的,但实际上与全局变量完全不是一回事。而静态变量也并不是在一个特定内存中保存的,因为.net泛型是运行时泛型,这个泛型中的静态变量的存储位置就编译时不可知了,那保存位置也是动态分配的了,存在哪里呢?
gomoku 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 method_01 的回复:]
...
c++下,静态变量都是存放在一个固定的段中的,随程序启动加载进来的。...
[/Quote]
我们在讲C#(实际上是.NET)的行为,而不是C++,对吗?
flyerwing 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyi8808 的回复:]
如果没有静态构造函数,也不是启动软件时便会初始化。
[/Quote]
顶上几楼
wapdos 2010-09-28
  • 打赏
  • 举报
回复
说明一下!上面发的是有关静态变量,和非静态变量在访问的时候出的问题! 看了对你有帮助!
wapdos 2010-09-28
  • 打赏
  • 举报
回复
类的静态成员属于类本身,在类加载的时候就会分配内存的,非静态成员属于属于类的对象,所以只有在类的对象产生时候才会分配内存,然后通过内的对象去访问,
在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错:
你这个就是 UsersManager um = new UsersManager();
public static void a(Users entity)
{
um.SetCurrentUser(entity);
}//错误 1 非静态的字段、方法或属性“HR.Manager.UsersManager.um”要求对象引用

访问一个内存不存在的东西肯定就报错了

不管是静态局部变量,还是全局变量生命周期是整个程序,程序结束则释放内存
juenice 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wupeng7654111 的回复:]
引用 10 楼 zcfzcf001 的回复:
回复得分,惩罚自己下,好几天没有上dn了。

有道理
[/Quote]

帮顶一下
gongsun 2010-09-28
  • 打赏
  • 举报
回复
静态类在首次访问时会调用静态构造器创建类类型对象,类型对象的生存周期是整个应用程序域的生存周期,也就说被访问过的静态类,只有它所在的应用程序域被卸载时才会被卸载。
gongsun 2010-09-28
  • 打赏
  • 举报
回复
这样的讨论很好...
gavinmark 2010-09-28
  • 打赏
  • 举报
回复
标记下。学习了。
烈火蜓蜻 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 method_01 的回复:]
静态变量,如果有静态构造函数,则在第一次使用时创建,直到软件结束为完整声明周期,如果没有静态构造函数,则启动软件便会初始化,对么?
很抱歉,不完全对,泛型的静态变量。声明周期就无法从最初的时候开始,即便没有写静态构造函数。例如

C# code

public static class StaticClass<T>
{
public static T Value = defa……
[/Quote]

是在第一次使用该静态对象的时候,才进行初始化的
wupeng7654111 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fcdesk 的回复:]
实例变量要new后,才能调用
静态的就不用,可以直接调用。

就是说实例变量一开始是不存在的,要new后,系统才给它分配内存,这时才能访问

而静态变量是系统一开始就为它分配了内存,自然可以不用new,就可以访问了。
[/Quote]
学习了
wupeng7654111 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zcfzcf001 的回复:]
回复得分,惩罚自己下,好几天没有上dn了。
[/Quote]
有道理
zcfzcf001 2010-09-28
  • 打赏
  • 举报
回复
回复得分,惩罚自己下,好几天没有上dn了。
完美算法 2010-09-28
  • 打赏
  • 举报
回复
实例变量要new后,才能调用
静态的就不用,可以直接调用。

就是说实例变量一开始是不存在的,要new后,系统才给它分配内存,这时才能访问

而静态变量是系统一开始就为它分配了内存,自然可以不用new,就可以访问了。
method_01 2010-09-28
  • 打赏
  • 举报
回复
看来我没说清楚问题。这100大分,不能浪费了。我重新描述一下,希望各位在此光临。谢谢。

c++下,静态变量都是存放在一个固定的段中的,随程序启动加载进来的。依然是说这个泛型的方法,1楼给出的静态构造函数并不是我需要的,我最初就说了,静态构造函数的存在让变量会在第一次使用时构造。

StaticClass<int>.Value
StaticClass<double>.Value
这样,我的静态变量不是可以无限的增加了?意思是这块静态代码段的长度并不是固定的?还是.net下静态变量和一般变量一样,只是有个标记说明自己是静态变量?
(本来.net就隐藏了这些,讨论这些的确蛋疼,只是突发奇想而已,感谢你们的理解。)
老Key 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bloodish 的回复:]
1#说的很好了,插点其他的.
跟泛型无关,
基于Static Class的Singleton模式中,
对于Instance的一种实现就是Lazy Initialize,用的时候才去初始化


C# code
public static class StaticClass<T> where T :new()
{
private static T insta……
[/Quote]恩,同意。。。
bloodish 2010-09-28
  • 打赏
  • 举报
回复
1#说的很好了,插点其他的.
跟泛型无关,
基于Static Class的Singleton模式中,
对于Instance的一种实现就是Lazy Initialize,用的时候才去初始化

public static class StaticClass<T>  where T :new()
{
private static T instance;

public static T Instance
{
get
{
//Lazy initialize
if (instance == null)
{
instance = new T();
}
return instance;
}
}
}
kensouterry 2010-09-28
  • 打赏
  • 举报
回复
学习了,虽然我很少采用静态变量!
KnowKjava 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gomoku 的回复:]
本来.Net就采用延迟加载(用到才加载),跟泛型没有关系。
比如:

C# code

using System;
static class StaticClass
{
static StaticClass()
{
Console.WriteLine("StaticClass cctor");
}
public static ……
[/Quote]up
加载更多回复(12)

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧