首页 > 代码库 > 二、对象和类型(第四部分)

二、对象和类型(第四部分)

二、对象和类型(第四部分)

四、匿名类型

  var关键字,它用于表示隐式类型化的变量。var与new关键字一起使用时,可以创建匿名类型。匿名类型只是继承自Object且没有名称的类。该类的定义从初始化器中推断,类似于隐式类型化的变量。

五、结构

  结构是值类型,而不是引用类型。它们存储在栈中或存储为内联(inline)(如果它们是存储在堆中的另一个对象的一部分),其生存周期的限制与简单的数据类性一样。

  *.结构不支持继承。

  *.对于结构,构造函数的工作有一些区别。尤其是在编译器总是提供了一个无参数的默认构造函数,它是不允许替换的。

  *.使用结构,可以指定字段如何在内存中布局。因为结构实际上是把数据项组合在一起,有时大多数或者全部字段都声明为public。严格来说,这与编写.Net代码的规则相反------根据Mircrosoft,字段(除了const字段之外)应总是私有的,并由公有属性封装。但是,对于简单的结构,许多开发人员都认为共有字段是可接受的编程方式。

1.结构是值类

  虽然结构是值类型,但是在语法上常常可以把它们当作类来处理。

  注意,因为结构是值类型,所以new运算符与类和其他引用类型的工作方式不同。new运算符并不分配堆中的内存,而是指调用相应的构造函数,根据传送给它的参数,初始化所有的字段。

 

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

namespace _003
{
    public class MyClass
    {
        const int a = 123456;
        readonly int b;
        int c = 0;

        private MyClass()
        {
            b = 123456;
            c = 654321;
        }

        public static MyClass CreateMyClass()
        {
            MyClass my = new MyClass();
            return my;
        }

        public void Printf()
        {
            Console.WriteLine(a + "  " + b + "  " + c);
        }
    }

    struct MyStruct
    {
        public int a;
        public int b;

        public MyStruct(int _a, int _b)
        {
            a = 100;
            b = 101;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //const int a = 100;
            //readonly int b;
            MyClass mc = MyClass.CreateMyClass();
            mc.Printf();

            MyStruct ms = new MyStruct(1, 2);
            Console.WriteLine(ms.a + "  " + ms.b);

            Console.ReadKey();
        }
    }
}

 

 

  结构遵循其它数据类型都遵循的规则:在使用前所有的元素都必须初始化。在结构上调用new运算符,或者给所有的字段分别赋值。结构就完全初始化了。当然,如果结构定义为类的成员字段,在初始化包含的对象时,该结构会自动初始化为0。

  结构是会影响性能的值类型,但根据使用的结构方式。

 

 

 

 

 

二、对象和类型(第四部分)