.net知识和学习方法系列(二十四)struct中的全局变量

简介:
C# , 数据类型有两种:值类型和引用类型([url]http://www.cnblogs.com/axzxs2001/archive/2008/09/15/1291090.html[/url] )。在值类型中,struct 是非常重要的一个类型,可以说struct 是一个真正的值类型,因为struct 是从System.ValueType 继承的,并且System.ValueType 还是一个抽象类,不属于值类型,同时简单类型,枚举等本质上都是一个struct
现在就说说struct struct 既然是个值类型,自然应该在线程堆栈上。对于struct ,在一定程度上与class 非常相像,接下来,我们来分析一下。
    class program
    {
        static void Main(string[] args)
        {
            STR str1;
            str1.Method("str1");// 第一种方法,直接定义
 
            STR str2 = new STR();
            str2.Method("str2"); // 第二种方法,通过new 关键字
        } 
    }
    struct STR
    {
        public void Method(string Par)
        {
            Console.WriteLine(" 参数是:"+Par);
        }
}
我们看到,结构中,我们可能有两种方法来调用结构内部的成员,一个是直接定义来调用,也可以通过new 关键字来定义调用,这是与类不同的,类必需经过实例化(new )来定义调用(静态成员是通过类名调用,没有定义)。
接下来再看一个例子。
 class program
    {
        static void Main(string[] args)
        {
            STR str1;// 第一种
            str1.count = 100;// 赋值
            Console.WriteLine(str1.count);
 
            STR str2 = new STR();// 第二种
            Console.WriteLine(str2.count);
                  
        } 
    }
    struct STR
    {
      public int count;
}
当结构体中定义一个全局变量时(类中叫字段),这个count 是没有值的,这是与类不同的,在类中,所有的字段都有默认值,结构中是没有的。既然没有默认值,那在第二种实例化直接调用时,str2.count 输出的为什么是0 ,这个0 是没有事前赋值的。如果是类,我们知道,类是有构造函数的,如果我们不显式写上构造函数,CLR 会自动给我们加上一个没有参数的构造函数的,并且这个构造函数是可以被显式的写出来的。同样,结构也是有一个构造函数,但这个构造函数是不能够写出来的,并且这个构造函数很特别,我们从第二种就能看出,只要用new 关键字来实例化结构,就会把count 给初始化成0 ,也就是那个不能写出来的无参构造函数会初始化所有的结构中的全局变量。对于第一种,因为没有调用无参的构造函数,所以必需去显式的给结构中的全局变量去赋值。
如果结构里有有参构造函数,代码如下:
    class program
    {
        static void Main(string[] args)
        {
            STR str = new STR("");// 实例化
            Console.WriteLine(str.count);
        } 
    }
    struct STR
    {
      public int count;
      public STR(string str)
      {
          count = 1;
      }
 }
会发现,如果是个有参构造函数,在构造中必需去初始化结构中的全局变量,因为如果用有参构造函数的话,无参的就不会得到调用,结构中的全局变量就得不到初始化,所以必需在有参构造函数中去初始化它。如果有多个全局变量,都得在这个有参构造函数中去实例化它们。
综合上面,可以看出,结构可以用 new 来实例化,也可以不用 new 来实例化,如果用 new ,就必需,必需初始化结构里的全部局部变量,在这里,无参的构造构函是不需要写出来的,自动实现全局变量的初始化。
 

















本文转自桂素伟51CTO博客,原文链接:http://blog.51cto.com/axzxs/149946  ,如需转载请自行联系原作者


相关文章
|
1月前
|
SQL 缓存 开发框架
分享一个 .NET EF6 应用二级缓存提高性能的方法
分享一个 .NET EF6 应用二级缓存提高性能的方法
学习计算机组成原理(王道考研)------第十一天https://zhengyz.blog.csdn.net/article/details/121706379?spm=1001.2014.3001.5502
这篇文章是关于计算机组成原理的王道考研学习笔记,主要介绍了半导体存储器RAM和ROM的相关知识。
学习计算机组成原理(王道考研)------第十一天https://zhengyz.blog.csdn.net/article/details/121706379?spm=1001.2014.3001.5502
|
1月前
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
51 7
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【文献学习】Phase-Aware Speech Enhancement with Deep Complex U-Net
文章介绍了Deep Complex U-Net模型,用于复数值的语音增强,提出了新的极坐标掩码方法和wSDR损失函数,并通过多种评估指标验证了其性能。
30 1
|
1月前
|
程序员 数据库
分享 2 个 .NET EF 6 只更新某些字段的方法
分享 2 个 .NET EF 6 只更新某些字段的方法
|
1月前
|
数据库
分享一个 .NET EF 6 扩展 Where 的方法
分享一个 .NET EF 6 扩展 Where 的方法
|
1月前
|
开发框架 前端开发 算法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
|
1月前
|
开发框架 中间件 .NET
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
|
1月前
|
存储 Web App开发 开发框架
由一个业务需求引发的对 ASP.NET 全局变量的调研及结果
由一个业务需求引发的对 ASP.NET 全局变量的调研及结果
|
1月前
|
开发框架 .NET API
如何在 ASP.NET Core Web API 方法执行前后 “偷偷“ 作一些 “坏“ 事?初识 ActionFilterAttribute
如何在 ASP.NET Core Web API 方法执行前后 “偷偷“ 作一些 “坏“ 事?初识 ActionFilterAttribute