二:对象和类型

类和结构

  • 类是存在在堆上,结构是存储在栈上
  • 类可以继承,结构不能继承
  • 类的定义是class,结构是struct
  • 结构的性能要比类好,类的用处要比结构大

类的成员可访问符public,protected,internal,internal protected,private

类的成员

  • 数据成员:字段,常量,事件
  • 函数成员:提供了操作类的数据的功能,包括方法,属性,构造器,终接器,运算符和索引器。

静态构造函数

特征:只执行一次,构造函数执行的时间不确定,不同的静态构造函数顺序也就不确定。静态构造函数没有修饰符,因为C#代码不调用它,而是又.NET运行库调用。

使用静态构造函数的原因:类的一些静态字段或属性,需要在第一次使用之前,从外部初始化。

静态构造函数使用的示例

using System;

namespace TestStaticConstructer
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(UserInterface.BackColor);
            Console.ReadLine();
        }
    }

    class UserInterface
    {
        public static readonly Color BackColor;
        static UserInterface()
        {
            DateTime dt = DateTime.Now;
            if ((dt.DayOfWeek == DayOfWeek.Sunday) || (dt.DayOfWeek == DayOfWeek.Saturday))
                BackColor = Color.Green;
            else
                BackColor = Color.Red;
        }
    }

    enum Color
    {
        Green,
        Red,
        Yellow
    }
}
View Code

只读字段

只读字段readonly和const的区别,readonly在类初始化之前不知道值,二const在一开始就已经确定了值。如pi的定义使用const。

匿名类型

            var v1 = new { Name = "N1", Address = "A1" };
            var v2 = new { Name = "N2", Address = "A2" };
            var v3 = new { Name = "N3", address = "A3" };
            Console.WriteLine(v1.Name + "-" + v1.Address);
            Console.WriteLine(v1.GetType() == v2.GetType());
            Console.WriteLine(v1.GetType() == v3.GetType());

运行的结果如下

结构

先定义一个结构

    struct Student
    {
        public string Name;
    }

测试结构

        static void TestStruct()
        {
            Student s1 = new Student();
            s1.Name = "Test";
            Student s2;
            s2 = s1;
            Console.WriteLine(s1.Name+"-"+s2.Name);
            s2.Name = "New Name";
            Console.WriteLine(s1.Name + "-" + s2.Name);
        }

这个示例可以看出类和结构的差别,如果是类,s2=s1这句话就意味着两个类是同一个类,地址相同,修改任何一个变量的值另外一个也会跟着一起改变。

总结:结构是值类型,类是引用类型。

结构没有继承,唯一的例外是基类是System.Object,这意味着可以用Object类接收一个结构

弱引用

相对于正常的类,主要在作用域内内存就不会被回收。弱类型是只要运行垃圾回收器,就会被释放内存。用处是在占用内存很大,又不经常用的情况。

(个人感觉没啥用)

部分类

partial关键字允许把类的定义放在多个文件中。partial可以修饰类,接口,结构。

    partial class PartClass
    {
        public string FirstName;
        public void FirstFunction()
        {

        }
    }
    partial class PartClass
    {
        public string LastName;
    }

只要引用了这两个部分类的命名空间,两个部分类中定义的成员都可以使用。

静态类

static的类,不能实例化,直接使用

Object类

所有的类的最终基类都是Sytem.Object。

该类的方法有ToString(),GetHashCode(),Equals(),Finalize(),GetType(),MemberwiseClone();

拓展方法

如果一个类已经封闭,或者是一个外部组件的类不能修改。添加方法的方法是使用拓展方法。

猜你喜欢

转载自www.cnblogs.com/yuanhaowen/p/9943724.html