C#语言基础-4 对象和类型1

  类和结构都是创建对象的模板每个对象都包含数据,并提供了处理和访问数据的方法。
  类定义了类的每个对象(称为实例)可以包含的数据和功能。

  结构与类的区别是它们在内存中的存储方式、访问方式(类是存储在堆上的引用类型,而结构是存储在栈上的值类型)和它们的一些特征(如结构不支持继承)。
  较小的数据类型使用结构可提高性能。但在语法上,结构与类非常相似,主要的区别是使用关键字 struct代替class来声明结构。

一、类
   类中的数据和函数称为类的成员。成员的可访问性可以是public、protected、internal protected 、private、internal。 

  1、数据成员
    数据成员是包含类的数据——字段、常量和事件的成员。
    数据成员可以是静态数据。类成员总是实例成员,除非用static进行显式的声明。
    字段是与类相关的变量。

 2、函数成员
    函数成员提供了操作类中数据的某些功能,包括方法、属性、构造函数和终结器(析构函数)、运算符以及索引器。
    方法是与某个类相关的函数,函数成员默认为实例成员,使用static修饰符可以把方法定义为静态方法。
    属性是可以从客户端访问的函数组
    构造函数是在实例化对象时自动调用的特殊函数。它们必须与所属的类同名,且不能有返 回类型。构造函数用于初始化字段的值。(用于创建实例对象)
    终结器(析构函数)类似于构造函数,是在CLR检测到不再需要某个对象时调用它。它们的名称与类相同,但前面有一个~符号。(用于释放实例对象)

      2.1.方法
    语法定义:修饰符 返回值类型 方法名(参数类型 参数名)
                        {
                            代码
                        }
        修饰符和参数可以没有,但是必须有返回值和方法名,没有返回值的使用void 表示无返回值。参数可以有1个或多个。
    调用方法:
    创建类的实例后,使用.即可访问公开的方法。
    静态方法直接使用 类型名称.方法即可调用
    调用有参数的方法时,按照参数类型依次传入参数。

    out参数/ref参数
        使用out或ref参数。在方法内对变量做的任何改变都会影响原始对象的值。
        如果out或ref参数是值类型时,在
        区别:out参数可以不初始化,ref参数必须初始化。out参数必须在方法结束时赋值,ref不必赋值。

    可选参数
    传参时,给参数赋一个默认值,该参数就变成可选参数,可选参数必须排在必填参数之后。

        //name是必填参数,age是可选参数
        void Show(string name, ref int x, out int y, int age = 0)
        {
            y = 0;
        } 

    方法的重载
        方法的重载就是有多个同名方法,并且参数个数或类型不一样。
        必须方法名称相同,参数不一样。
        重载的方法会在调用时根据传入的参数来确认调用的方法。

        int Show()
        {
            return 1;
        }
        string Show(int x)
        {
            return x.ToString();
        }
        string Show(out int x)
        {
            x = 1;
            return x.ToString();
        }

      2.2.属性
      属性是一个方法或一对方法,在客户端代码看来,它是一个字段。
      语法定义: 访问修饰符 类型 名称{get;set;}
      get表示该属性可读,是属性读取方法的简写
      set表示该属性可写,是属性写入方法的简写

      get访问器不带任何参数,并且必须返回属性声明的类型。
      set访问器不带指定任何显式参数, 但编译器假定它带一个参数,其类型也与属性相同,并表示为value。
      如:

        public string Name1 { get; set; }
        private string name2;
        public string Name2
        {
            get
            {
                return name2;
            }
            set
            {
                name2 = value;
            }
        }

      只读和只写属性
      在定义属性时,只写get访问器,该属性就是只读属性。同理只写set属性就是只写属性。
      get和set可以用不同的修饰符进行修饰,没有访问修饰符时,访问器的访问级别和属性一样。

        public string Name1 { get;private  set; }
        private string name2;
        public string Name2
        {
            get
            {
                return name2;
            }
            private set
            {
                name2 = value;
            }
        }

  2.3.构造函数
  与类型同名并且没有返回值的方法。创建类之后,类会默认有一个无参构造函数,不必显性声明构造函数。
  构造函数是在使用类创建实例时调用。
  当显性声明带参数构造函数后,类就不会默认创建无参构造函数,如果需要无参数构造函数,需要利用重载显性声明。

    public class ShowTest
    {
        public ShowTest(int x)
        {
        }
        public ShowTest()
        {
        }
    }

  当唯一的构造函数使用private或protected修饰时,表示该类不能使用new来创建类的实体。
  这种类存在的意义:
    类仅用作某些静态成员或属性的容器,因此永远不会实例化它。(工具类通常可以使用这种方式)
    希望类仅通过调用某个静态成员函数来实例化(这就是所谓对象实例化的类工厂方法) 例如:单利模式

  静态构造函数
    创建静态构造函数时,类会默认有一个无参构造函数。
    静态构造函数至多运行一次。(使用类创建第一个实例时就会被调用,之后不会被运行)
    静态构造函数存在的意义:
        类有一些静态字段或属性,需要在第一次使用类之前,从外部源中初始化这些静态字段和属性。

    public class ShowTest
    {
        public static string Name { get; set; }
        static ShowTest()
        {
            Name = "Liu";
        }
    }
    Console.Write(ShowTest.Name);

  从构造函数中调用其他构造函数
  当一个类有多个构造函数时,这些构造函数包含一些共同的代码,我们可以使用构造函数初始化器来实现。如:第2个构造函数可以写成第3中形式。
  构造函数初始化器可以包含对同一个类的另一个构造函数的调用,也可以包含对直接基类的构造函数的调用(使用相同的语法,但应使用 base关键字代替this)。初始化器中不能有多个调用。

        public int Result { get; set; }
        public ShowTest(int x, int y)
        {
            Result = x + y;
        }
        public ShowTest(int x)
        {
            Result = x + 1;
        }
        public ShowTest(int x) : this(x, 1)
        {
        } 

3、只读字段
  常量是一个不能修改值的变量。但是有时候需要一个变量,其值不应改变,但是在运行之前不知道它的值。只读字段就是解决这个问题。
  语法定义:访问修饰符 readonly 类型 名称;
  只读属性只能在它所在类的构造函数中进行初始化或者在定义是初始化或者不进行初始化,不初始化时默认为指定类型的默认值。

        public readonly int Result = 1;
        public ShowTest(int x, int y)
        {
            Result = x + y;
        }

只读字段可以是静态的,如果是静态的只读字段,非静态构造函数就不能进行赋值了。

二、匿名类型

 使用var和new可以创建匿名类型。注意:创建的匿名类型只能在创建时赋值,因为它的属性时只读的。
 如 var obj = new { Name = "Liu", Age = 12 };

            var obj = new { Name = "Liu", Age = 12 };
            Psersion psersion = new Psersion();
            psersion.Name = "Liu1";
            var obj1 = new { psersion.Name, psersion.Age };
            psersion.Name = "Liu2";
            psersion.Age = 12;
            Console.Write(obj1.Name);//输出的是Liu1

猜你喜欢

转载自www.cnblogs.com/liuxiansheng1024/p/12563062.html