c#中的通用列表和静态变量行为

时间:2010-12-01 17:49:25

标签: c#

我在C#中有一个简单的应用程序。当我运行代码时,我没有得到预期的结果?。我得到2,2,1但我期待1,2,3

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication12
{
    class Program
    {
        static void Main(string[] args)
        {
            MyList<int> list1 = new MyList<int>();
            MyList<int> list2 = new MyList<int>();
            MyList<double> list3 = new MyList<double>();
            Console.WriteLine(list1.GetCount());
            Console.WriteLine(list2.GetCount());
            Console.WriteLine(list3.GetCount());
        }
    }
    public class MyList<T>
    {
        static int _count;
        public MyList()
        {
            _count++;
        }
        public int GetCount()
        {
            return _count;
        }
    }
}

8 个答案:

答案 0 :(得分:13)

结果如我所料

2
2
1

MSDN blog post告诉

  

泛型类声明中的静态变量在相同的闭合构造类型(第26.5.2节)的所有实例之间共享,但不在不同的闭合构造类型的实例之间共享。无论静态变量的类型是否涉及任何类型参数,这些规则都适用。

答案 1 :(得分:7)

这种方式工作的原因与为单个静态声明生成了多少个值有关。给定AppDomain中每种类型将有一个静态值。

在非一般情况下,这意味着声明和值之间存在1-1关系。毕竟,给定string中只有一个AppDomain类型。

在一般情况下,虽然它涉及更多一点。类型MyList<int>MyList<double>实际上是不同的类型。因此,它们具有彼此独立的单独静态值。

答案 2 :(得分:2)

更改了我的答案以反映您的通用问题,您可以执行类似的操作,不要认为有必要为静态计数器定义类型。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication12
{
    class Program
    {
        static void Main(string[] args)
        {
            MyList<int> list1 = new MyList<int>();
            MyList<int> list2 = new MyList<int>();
            MyList<double> list3 = new MyList<double>();
            Console.WriteLine(list1.GetCount());
            Console.WriteLine(list2.GetCount());
            Console.WriteLine(list3.GetCount());
        }
    }

    public class MyList<T>
    {
        private static int _count;
        private int _myCount;

        public MyList()
        {
            _myCount = ++MyList<object>._count;

        }
        public int GetCount()
        {
            return _myCount;
        }
    }
}

答案 3 :(得分:1)

也许你期待1,2,3?如果是这样,您需要进行修改:

public class MyList
{
    static int _count;
    private int myCount;

    public MyList()
    {
        this.myCount = ++_count;
    }
    public int GetCount()
    {
        return this.myCount;
    }
}

答案 4 :(得分:1)

我有一种感觉,你期待看到

1 2 3

但是你得到了

3 3 3 代替。

以下内容将为您提供1 2 3:

        MyList list1 = new MyList();
        Console.WriteLine(list1.GetCount());
        MyList list2 = new MyList();
        Console.WriteLine(list2.GetCount());
        MyList list3 = new MyList();
        Console.WriteLine(list3.GetCount());

答案 5 :(得分:1)

根据T的类型,每个MyList<T>对象在AppDomain内是完全独立的。因此,在您的情况下,您有2个MyList<int>个对象和1个MyList<double>个对象。由于在打字系统中这些对象之间没有实际连接,因此添加额外专用计数器的其他解决方案将不起作用。你的柜台必须是外部的。

答案 6 :(得分:1)

MyList<int>MyList<double>被编译为严格但单独的类型,这意味着当您调用构造函数时,您将静态计数增加MyList<int>两次,然后静态计数{ {1}}一次,因此2,2,1。

答案 7 :(得分:0)

结果应为

3
3
3

你在期待什么?