在C#中静态变量是否全局变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C#中静态变量是否全局变量相关的知识,希望对你有一定的参考价值。
在面向对象编程中,不存在所谓的全局变量的。也就是说,根本没有全局变量这一个词的!那些解释为有的,请问一下,什么是全局变量?它是SP编程中的一个术语,而在面向对象编程中,怎么可能用到变量呢?!
也就是说在面向对象中有所谓的变量,也只是在程序片断中的,所以不存所谓的全局变量的!因为所有的东西全部均定义在了类中,没有任何变量什么的能定义在类外的!
那么这里的静态变量与所谓的全局变量只是现从此关键词的问题了!也就是static与const的区别,估计很多人会把const看作变量,其实它只是一个字段的修饰符而已。
public class Test
private static string Version = "V1.0.0";
private const Double PI = 3.1415826;
.........
//other codes in here;
这个类来说吧,Version是什么?很多人说是静态变量,它真是静态变量么?它只是一个字段,不过是一个静态字段。如果按SP的习惯叫做静态变量,其实是不标准的。
PI又是什么?至少我还没有听说有会叫做全局变量的!它只是一个常量而已。很明显,一个常量字段被称做全局变量这种叫法无论如何都是占不住脚的。
两者是肯定有区别的,一个是字段(若理解成sp的变量还有情可原)。但const是一个常量字段,如果叫成全局变量那就没有任何理由了!
那么,也可能public声明的字段被称作全局变量?还是public static声明的字段被称为全局变量?
那么这里去套用也不合适。
public class Test
public static string Version="1.0.0";
//这个是所谓的全局变量么?
public string Author = "kusirp21";
//还是指这个是全局变量?
.......
// other code in here;
如果是比较这两个的话,那真真没法比了!一个是对象的字段,对象new之后才有,而static由是由类调用的字段。没有static的则是由对象调用的字段。至于public/private/protected/internal只是对调用的范围进行定义。至于什么样的关系,不看都知道的!
所以,变量是指程序中临时声明的,而参数是方法进和传递的变量。静态变量由于SP转行来的程序员不规则称呼,而全局变量——要命的是根本没有这词!
我想知道为什么还会有这么多人答和津津有味的到底是为什么。 参考技术A 当然不是,二者在内存中存储位置不一样追问
哦。。两个是不同意义的概念和用法对吧/
追答恩 很不一样
参考技术B 我觉得是一样的。追问哦 应该是差不多看情况区分的。
追答写了两年c#以来,我还没有遇到过必须用全局变量,不能用静态变量代替的情况。以后会不会遇到不得而知。
C++11是不是指定了静态/全局变量的构造顺序?
【中文标题】C++11是不是指定了静态/全局变量的构造顺序?【英文标题】:Does C++11 specify the construction sequence of static/global variables?C++11是否指定了静态/全局变量的构造顺序? 【发布时间】:2017-03-03 13:53:43 【问题描述】:在 C++98/03 中,静态对象(在文件中、在类中、在函数中)的构造没有指定的顺序,一个静态对象不能假定它是在另一个静态对象之后或之前构造的,似乎是由链接器。
我的问题是,C++ 11/14 是否为静态对象和全局对象的构造序列指定了任何规则?
【问题讨论】:
这并不能回答问题,但 call_once (en.cppreference.com/w/cpp/thread/call_once) 为您提供了一种具体的方法。 不,在此期间没有任何变化 【参考方案1】:规则没有改变。但是,所有全局/静态对象都是按照它们在翻译单元中出现的顺序构造的。只是多个翻译单元的初始化顺序是未指定的。
请注意,函数局部静态对象是以指定方式构造的。它们是在第一次达到声明时构建的,并且一直存在到程序结束。这种行为在 C++11 中有所改变,尽管在 C++11 之前初始化不是线程安全的,而 C++11 及更高版本指定静态初始化将是线程安全的。
【讨论】:
函数本地静态对象在第一次进入包含它们的作用域时被构造,这可能是在第一次进入函数之后——它甚至可以在函数的后续调用中(或不完全)如果该范围由例如控制if
条件在第一次调用函数时不成立。
@TonyD 已修复。你是对的,它们只有在达到初始化后才会被初始化。【参考方案2】:
是:全局对象将在编译单元内按顺序构造。 Ando No:C++11/14 没有改变。
【讨论】:
以上是关于在C#中静态变量是否全局变量的主要内容,如果未能解决你的问题,请参考以下文章