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个建议》陆敏技

  • 相关阅读:
    又到黄金季节,该跳槽吗?怎么跳?
    分布式事务 6 个技术方案
    15 个 MyBatis 技巧,赶紧收藏吧!
    你的工资被倒挂了吗
    终于知道 Java agent 怎么重写字节码了
    每天的工作,你腻了吗?
    10 分钟轻松学会 Jackson 反序列化自动适配子类
    SpringMVC异步处理的 5 种方式
    Linux Cron 定时任务
    人类简史、软件架构和中台
  • 原文地址:https://www.cnblogs.com/xuyouyou/p/13181243.html
Copyright © 2011-2022 走看看