未命名的命名空间如何优于static关键字?
我在C#中搜索过静态变量,但我仍然没有得到它的用途.另外,如果我尝试在方法中声明变量,它将不会授予我执行此操作的权限.为什么?
我看过一些关于静态变量的例子.我已经看到我们不需要创建类的实例来访问变量,但这还不足以理解它的用途以及何时使用它.
第二件事
class Book
{
public static int myInt = 0;
}
public class Exercise
{
static void Main()
{
Book book = new Book();
Console.WriteLine(book.myInt); // Shows error. Why does it show me error?
// Can't I access the static variable
// by making the instance of a class?
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud) 在接口的实现中定义时,我不太了解静态变量.在方法中,我确实理解它们与局部变量的区别,但不是直接在实现中定义的.
看看这些例子.这两者实际上有什么区别?
#include "MyClass.h"
@implementation MyClass
int myInt;
...
@end
Run Code Online (Sandbox Code Playgroud)
和:
#include "MyClass.h"
@implementation MyClass
static int myInt;
...
@end
Run Code Online (Sandbox Code Playgroud)
myInt在两种情况下,所有方法都可以看到,如果我解释了一个正确运行的测试,那么myInt在这两种情况下,对于不同类的实例,它们都是相同的变量.
当我在C++中使用静态变量时,我常常想要初始化一个变量,将另一个变量传递给它的构造函数.换句话说,我想创建彼此依赖的静态实例.
在单个.cpp或.h文件中,这不是问题:将按照声明的顺序创建实例.但是,如果要使用另一个编译单元中的实例初始化静态实例,则无法指定顺序.结果是,根据天气,可能会发生构建依赖于另一个实例的实例,并且之后才构建另一个实例.结果是第一个实例初始化不正确.
有谁知道如何确保以正确的顺序创建静态对象?我已经搜索了很长时间寻找解决方案,尝试了所有这些解决方案(包括Schwarz Counter解决方案),但我开始怀疑有一个确实有效.
一种可能性是使用静态函数成员的技巧:
Type& globalObject()
{
static Type theOneAndOnlyInstance;
return theOneAndOnlyInstance;
}
Run Code Online (Sandbox Code Playgroud)
实际上,这确实有效.遗憾的是,您必须编写globalObject().MemberFunction()而不是globalObject.MemberFunction(),从而导致一些令人困惑和不雅的客户端代码.
更新:感谢您的反应.遗憾的是,我确实似乎回答了自己的问题.我想我必须学会忍受它......
c++ static-variables initialization-order static-order-fiasco
我有静态变量的概念,但静态方法在类中有什么好处.我曾经参与过一些项目,但我并没有将方法设为静态.每当我需要调用类的方法时,我创建该类的对象并调用所需的方法.
问:方法中的静态变量即使在执行方法时仍保持其值,但只能在其包含的方法中访问,但静态方法的最佳定义是什么?
问:调用静态方法而不创建该类的对象是静态方法的唯一好处吗?
问:静态方法的可访问范围是多少?
谢谢
对于C++类中的静态成员变量 - 初始化在类外部完成.我想知道为什么?对此有任何逻辑推理/约束吗?或者它是纯粹的遗留实现 - 标准不想纠正?
我认为在类中初始化更"直观"而且不那么混乱.它还给出了变量的静态和全局性.例如,如果您看到静态const成员.
我注意到如果在代码中初始化C++中的静态变量,初始化仅在您第一次运行该函数时运行.
这很酷,但是如何实现?它是否转化为某种扭曲的if语句?(如果给出一个值,那么..)
void go( int x )
{
static int j = x ;
cout << ++j << endl ; // see 6, 7, 8
}
int main()
{
go( 5 ) ;
go( 5 ) ;
go( 5 ) ;
}
Run Code Online (Sandbox Code Playgroud) 当我y通过使用Checks.y(Checks作为子类)调用静态变量时,不执行静态块,y并且不会更新值.
class Par {
static int y = 4;
}
class Checks extends Par {
static {
y = 5;
}
}
public class Check {
public static void main(String args[]) {
System.out.println(Checks.y); // here printing 4
}
}
Run Code Online (Sandbox Code Playgroud)
由于静态在所有子类之间共享,因此应该更新该值.
它背后的原因是什么?
我知道.OBJ是编译一个编译单元的结果,而.LIB是一个静态库,可以从几个.OBJ创建,但这种差异似乎只是在编译单元的数量.还有其他区别吗?是相同还是不同的文件格式?
当想知道在链接到最终可执行文件期间是否合并了两个(或更多).LIB中定义的相同静态变量时,我遇到了这个问题.对于.OBJ,变量是合并的.但是在.LIBs中它是一样的吗?
目前我正在使用ASP.net上的C#3.5开发项目管理应用程序.为了减少对数据库的命中,我使用静态变量缓存了大量信息.例如,用户列表在静态类中保存在内存中.该类在启动时从数据库中读取所有信息,并在更改时更新数据库,但它永远不需要从数据库中读取.
该类在写入数据库的同时将更新的信息与其他Web服务器(如果存在)绑定.pinging机制是一个Windows服务,缓存对象使用随机可用端口进行注册.它也用于其他事情.
数据量并不是那么好.目前我正在使用它来缓存用户(密码哈希,权限,名称,电子邮件等).它只是保存了一堆对数据库的调用.
我想知道这种方法是否有任何陷阱和/或是否有更好的方法来缓存数据?
static-variables ×10
c++ ×5
static ×4
c# ×2
variables ×2
asp.net ×1
caching ×1
inheritance ×1
java ×1
jvm ×1
linker ×1
namespaces ×1
object-files ×1
objective-c ×1
oop ×1
static-block ×1