zoukankan      html  css  js  c++  java
  • C# 避免在泛型类型中的声明静态成员

    在非泛型类型中,各个实例共享静态成员:

     1 class Program
     2 {
     3     static void Main(string[] args)
     4     {
     5         MyClass m1 = new MyClass();
     6         MyClass m2 = new MyClass();
     7         Console.WriteLine(MyClass.Count);
     8         Console.Read();
     9     }
    10 }
    11 class MyClass
    12 {
    13     public static int Count { get; set; }
    14     public MyClass()
    15     {
    16         Count++;
    17     }
    18 }

    运行结果:

    2                                                        

    现在将MyClass声明为泛型类型:

     1 class Program
     2 {
     3     static void Main(string[] args)
     4     {
     5         MyClass<int> m1 = new MyClass<int>();
     6         MyClass<int> m2 = new MyClass<int>();
     7         MyClass<string> m3 = new MyClass<string>();
     8         Console.WriteLine(MyClass<int>.Count);
     9         Console.WriteLine(MyClass<string>.Count);
    10         Console.Read();
    11     }
    12 }
    13 class MyClass<T>
    14 {
    15     public static int Count { get; set; }
    16     public MyClass()
    17     {
    18         Count++;
    19     }
    20 }

    运行结果:

    2
    1

    在代码里,创建实例时为T指定了不同的数据类型,MyClass<T>相应地也变成了不同的数据类型,不同类型之间不共享静态成员;但是若T所指定的数据类型时一致的,那相同类型的实例是可以共享静态成员。

    为了避免混淆,建议尽量避免在泛型类型中的声明静态成员。


    非泛型类型中的泛型方法并不会在运行时的本地代码中生成不同的类型。

     1 class Program
     2 {
     3     static void Main(string[] args)
     4     {
     5         Console.WriteLine(MyClass.Func<int>());
     6         Console.WriteLine(MyClass.Func<int>());
     7         Console.WriteLine(MyClass.Func<string>());
     8         Console.Read();
     9     }
    10 }
    11 class MyClass
    12 {
    13     static int Count;
    14     public static int Func<T>()
    15     {
    16         return Count++;
    17     }
    18 }

    运行结果:

    0
    1
    2

    参考:《编写高质量代码改善C#程序的157个建议》陆敏技

  • 相关阅读:
    知名网站的技术发展历程
    自己的代码仓库源码
    重构着讲解设计原则与模式——从DIP中“倒置”的含义说接口的正确使用
    jQuery Colorbox插件
    测试是否支持DOMAttrModified
    python(贪吃蛇)
    界面简洁,无广告,无插件,无网络却功能强播放器
    Asp.Net MVC 4 Web API
    理解MVC底层运行机制
    BS单点登陆(SSO)实现代码展示
  • 原文地址:https://www.cnblogs.com/xuyouyou/p/13181243.html
Copyright © 2011-2022 走看看