首页 > 编程语言 >C#中的隐形坑之泛型基类中的静态变量

C#中的隐形坑之泛型基类中的静态变量

时间:2023-04-28 18:34:25浏览次数:37  
标签:变量 C# class 坑之泛 Num static 基类 public

切记:泛型基类中定义的静态变量,在各子类中是不会共享数据的。

一般在进程内共享数据可选择定义全局const变量或static变量。本文的主角就是static变量。例如我们要定义一个可以跨方法使用的事务时,会想到在基类中定义一个静态变量:

[ThreadStatic]
public static IDbTransaction _tran;

  

然后在各子类中使用该共享的变量开启事务操作。本文的问题就出在了这里,基类使用了泛型,并在其中定义了静态变量,可各子类中却无法共享这个静态变量的值,而是独立拥有自己的值。

下面将通过一个测试例子来说明这点。先定义一个泛型基类,并声明一个静态变量。

protected BaseClass<T> where T:class,new()
{
     static int Num=0;
}

然后定义两个子类继承基类

public class A:BaseClass<D>
{
     public A()
    {
            Console.Write(Num.ToString());
            Num++;
     }
}

  

public class B:BaseClass<D>
{
     public B()
     {
           Console.Write(Num.ToString());
           Num++;
     }
}

  

public class D
{
}

  

static void Main()
{
        A a=new A();
        //控制台会输出0

        B b=new B();
         //控制台输出的还是0
}

发现两次输出的都是0,明明在A的构造函数里更改Num的值了。由此可见,子类中的Num是独立的,不会共享数据。

解决办法是将静态变量的声明放到泛型基类外面,例如:

public class AA
{
    public static int Num=0;
}

  

然后在泛型基类中可以改变AA.Num的值,改变之后,各子类中访问的都是最新的。
public class A:BaseClass<D>
{
     public A()
     {
            Console.Write(AA.Num.ToString());
            AA.Num++;
     }
}

public class B:BaseClass<D>
{
     public B()
     {
           Console.Write(AA.Num.ToString());
           AA.Num++;
     }
}

static void Main()
{
        A a=new A();
        //控制台输出0

        B b=new B();
         //控制台输出1
}

  


标签:变量,C#,class,坑之泛,Num,static,基类,public
From: https://www.cnblogs.com/hp-root/p/17362917.html

相关文章

  • Oracle较长number型数值的科学计数显示
    表中有id列,类型为number,在sqlplus中查询的时候,查询结果的显示方式为科学计数法:ID----------4.5572E+184.5574E+184.5585E+18这样看起来很不直观,而之所以这样显示的原因是在SQL*Plus下,小于等于10位的精度显示的是很直观的形式,大于10位精度的则显示为科学计数的形式。避免......
  • 解决报错requests.exceptions.ConnectionError: HTTPSConnectionPool(host=‘xxx’, p
    解决报错requests.exceptions.ConnectionError:HTTPSConnectionPool(host=‘xxx’,port=443):Maxretriesexceededwithurl使用requests时出错解决报错requests.exceptions.ConnectionError:HTTPSConnectionPool(host=‘xxx’,port=443):Maxretriesexceededwithurl......
  • TypeError: this.libOptions.parse is not a function
    安装完node.js运行项目后,报错:TypeError:this.libOptions.parseisnotafunctionatESLint8Plugin.<anonymous>(C:\ProgramFiles\JetBrains\GoLand2022.1.4\plugins\JavaScriptLanguage\languageService\eslint\bin\eslint8-plugin.js:139:64)atstep......
  • Maven cargo 远程自动部署war
    Mavencargo远程自动部署war     如果不使用maven构建项目,则可以直接考虑将war包直接通过cargo远程部署到远端服务器上(也就是说先创建个maven项目,打好包,再通过shell脚本,将所需要的项目打成war包,放到target目录下,对war包进行覆盖)。 打war包:cd项目目录,即WEB-INF所在目录j......
  • EHCache spring
    EHCachespring  import:importorg.springframework.cache.annotation.Cacheable;  注解(我放在service方法上,注意这个注解,如果用SPRING的Cacheable,就跟这一样;如果用GOOGLE的,这几个配置及import都得一致):@Cacheable(value="baseCache",key="'myid_'+#date")publicString......
  • maven deploy configuration
    inpom.xml,theconfigwillbebelow:<repositories> <repository> <id>com.nomura.xxx</id> <url>http://XXXXXXX:8080/archiva/repository</url> </repository> </repositories> <distributionMana......
  • java if和switch语句
    if语句:publicclassifguanjianzi{publicstaticvoidmain(String[]args){if(2<1){System.out.println("1234567");}else{System.out.println("12");}}}switch语句......
  • sb集成SECURITY、OAUTH2实现认证鉴权、资源管理
    1、Oauth2简介OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth1.0即完全废止了OAuth1.0。2、Oauth2服......
  • jeecgboot整合JdbcTemplate方便多表联合查询
    感觉jeecgboot处理复杂的多表联合查询有点费劲,就自己实现了JdbcTemplate的整合,其实也不是整合吧,因为jeecgboot已经把JdbcTemplate整合进来了。我查了下项目的依赖关系,发现jeecg-boot-base-core模块依赖了mybatis-plus-boot-starter,而mybatis-plus-boot-starter依赖了spri......
  • Fuzzing101-Exercise2 fuzz CVE-2009-3895和CVE-2012-2836
    autohr:cxingdate:2023年4月28日我们将对libexif0.6.14进行fuzz,目标是复现CVE-2009-3895和CVE-2012-2836两个漏洞。0x00准备工作我们先了解一下libexif这个库和两个CVE漏洞。关于libexif的信息如下:isalibrarywritteninpureportableC.readsandwritesEXI......