在VB6中,有一些局部靜態變量在過程退出後保留其值。這就像使用公共變量,但在當地塊。例如:在C#中的VB6的私有靜態?
sub count()
static x as integer
x = x + 1
end sub
10次調用後,x將是10.我試圖在.NET(甚至Java)中搜索相同的東西,但沒有。爲什麼?它是否以某種方式破壞了OOP模型,並且有一種方法來模擬它。
在VB6中,有一些局部靜態變量在過程退出後保留其值。這就像使用公共變量,但在當地塊。例如:在C#中的VB6的私有靜態?
sub count()
static x as integer
x = x + 1
end sub
10次調用後,x將是10.我試圖在.NET(甚至Java)中搜索相同的東西,但沒有。爲什麼?它是否以某種方式破壞了OOP模型,並且有一種方法來模擬它。
你可以得到的最接近的是一個靜態字段外方法:
private static int x;
public [static] void Foo() {
x++;
}
閉合例子的要求:
using System;
class Program {
private static readonly Action incrementCount;
private static readonly Func<int> getCount;
static Program() {
int x = 0;
incrementCount =() => x++;
getCount =() => x;
}
public void Foo() {
incrementCount();
incrementCount();
Console.WriteLine(getCount());
}
static void Main() {
// show it working from an instance
new Program().Foo();
}
}
您可以隨時使用靜態變量的類爲此目的:
class C
{
static int x=0;
void count()
{
++x; // this x gets incremented as you want
}
}
我記得在visual basic中的靜態私有。他們對於某些特定的任務很酷。
.net中沒有這樣的東西。你將不得不堅持外面的靜態。
VB6確實有一些很酷的東西。 – blez 2010-05-01 00:27:43
那麼,它們在VB.NET(儘管不是C#)中是可用的...如果你在一個方法中聲明Static As As Integer,它的行爲將類似於VB6。 – 2010-05-03 07:41:21
通常這些類型的變量用於維護迭代器。 C#通過yield
關鍵字直接將這些內置到語言中。這裏有一個例子:
IEnumerable<int> TimesTable(int table)
{
for (int i=0 ; i<12 ; i++)
{
yield return i * table;
}
}
在這個例子中,我們創建n次表中的值,其中n由調用者指定。我們可以在任何地方使用這個迭代器使用,如在foreach
循環:
foreach (var value in TimesTable(3))
{
Console.Write(""+ value + " ");
}
...主要生產:
3 6 9 12 15 18 21 24 27 30 33 36
在C++中,這可能使用的都是靜態的變量,比如那些你從VB描述(我不是一個VB的傢伙,所以我不知道VB語法):
int TimesTable(int table) {
static i = 1;
if (i == 12) {
i = 1;
}
return i++ * table;
}
C#的版本是比C++更好(或VB),相當於監守迭代器可以取消耳而且在任何給定的時間可以有多個迭代器活動。如果沒有開發人員的更多工作,這些事情就不適用於C++版本。不利的一面是,這意味着C#中唯一一次類似靜態變量的事情在迭代器實現期間是有效的,並且該值不會超出該範圍。
我希望這對你有一些用處。
是的,我意識到迭代器,但這不是我需要的具體事情,無論如何,謝謝。 – blez 2010-05-01 00:29:05
使用靜態構造函數用閉包初始化委託字段在訪問變量方面可能稍微接近(與靜態字段不同,它不會通過類中的反射或其他類方法可見) – 2010-04-30 22:30:10
@Ben - 有趣的方法,但很多額外的複雜性 - 讓人們瞭解捕獲的變量在最好的時候是棘手的; -p – 2010-04-30 22:35:22
好吧,我明白了,但*爲什麼*?它是否以某種方式破壞了OOP? – blez 2010-05-01 00:30:00