1
11
不,C不支持这一点。你可以接近:
这里唯一的区别是“re”的可见性。它不仅向方法公开,还向类M公开。
这个
|
2
5
不幸的是,没有。我真的很喜欢C的这种可能性。 我知道你能做什么。 创建一个类,该类将提供对特定于实例的值的访问,这些值将静态地保留。 像这样:
可以这样使用…
这不是一个完美的解决方案,而是一个有趣的玩具。 每个namespace.class.method作用域只能有一个此类静态变量。在属性方法中不起作用-它们都解析为相同的名称-get_instanceid。 |
3
5
为什么不创建一个
这将为您提供相同的性能优势-它只会初始化一次。 |
4
4
不在C_中,仅在Visual Basic.NET中:
vb.net有很多C_没有的好东西,这就是我选择vb.net的原因。 |
5
2
那么这个呢,因为您只希望它在使用时被初始化:
|
6
1
C不支持静态局部变量。除了上面发布的内容外,这里还有一个链接指向有关此主题的msdn博客条目:
|
7
1
按照Henk和Barretj的回答,我认为您可以避免初始化成本,通过使用一个属性更接近于此。
然后只要在代码中的任何地方使用myleg(注意myleg中的大写字母“m”)。这个解决方案的好处在于(尽管getter是一个引擎盖下的函数调用),属性的语义意味着您可以像myleg是一个变量一样编写代码。 上面是我如何设置“运行时常量”,这些常量需要在运行时进行一次性初始化。 我也使用可以为空的类型做同样的事情。例如,
然后在代码中像普通的bool一样使用boolvar。我不使用内部的boolvar(boolvar属性的后备存储),因为我不需要,记住这就像一个运行时常量,所以没有setter。但是,如果出于某种原因需要更改运行时常量的值,我将直接在可以为空的变量boolvar上进行更改。 初始化可能相当复杂。但它只执行一次,而且只在第一次访问该属性时执行。您可以选择通过将boolvar设置回空值来强制重新初始化运行时常量值。 |
8
0
当然。只需在方法外部声明私有静态变量即可。
这实际上就是您所做的,唯一的区别是“re”对整个类具有可见性,而不仅仅是方法。 |
9
0
我还没有看到一个好的通用解决方案,所以我想我会想出自己的。不过,我要注意的是,在大多数情况下(并非总是如此),需要静态局部变量可能是一种迹象,表明您应该根据许多人所说的原因重构代码;状态是对象的东西,而不是方法。但我确实喜欢限制变量范围的想法。 无需进一步说明:
当然,这不是线程安全的,但这样做不需要太多的工作。它可以这样使用:
|
10
0
在内部类中嵌套相关的成员,如您在问题中所示,这可能是最干净的。如果静态变量能够以某种方式获取调用方信息,则不需要将父方法推送到内部类中。
最后,总有
|
11
0
三年后… 您可以用捕获的局部变量来近似它。
|
12
0
我开发了一个静态类,它以相当简单的方式处理这个问题:
它可以在如下方法中实现:
在对方法的每个后续调用中,myvar.value中包含的值将是最后一个被设置为的值,因此重复调用将导致它输出一个自然数序列。init()函数仅在以前未初始化的情况下设置该值。否则,它只返回对包含该值的对象的引用。 它使用[CallerFieldPath]、[CallerMemberName]和[CallerLinEnumber]属性跟踪字典中引用的项。这样就消除了具有相同名称的方法或来自相同行号的调用之间发生冲突的可能性。 关于其使用的一些注意事项:
对于大多数希望使用静态局部变量的实例来说,这种方法可能是多余的。它使用间接方法来处理单独的文件、方法和行对于您的项目来说可能是不必要的,在这种情况下,您可以简化它以满足您的需要。 |
13
0
它是复制自 Why doesn't C# support local static variables like C does? 不过,我想你会发现我的 answer 有用。 |
J. Doe · 线程静态变量与实例化 6 年前 |
D.B · django静态文件不随虚拟环境出现 6 年前 |
157 239n · 我可以在UI线程之外使用getFilesDir吗 6 年前 |
John David · ——等待这个。方法();在静态方法中不起作用 6 年前 |
Yu.Pan · Spring boot项目找不到静态文件 6 年前 |
Yu.Pan · 无法在springboot静态内容中获取文件 6 年前 |
BaCh · C++:使用名称相同但参数不同的类成员和静态函数失败 6 年前 |