C#类与对象

类的定义

当你定义一个类,相当于定义一个数据类型的蓝图,这实际上没有定义任何数据,但它定义了类的名称意味着什么。 也就是说类的对象由什么组成以及在这个对象上执行什么行为。对象是类的实例 ,构成类的方法和变量被称为类的成员

类是由关键字class 后面跟 类名 。类的主体包含在花括号内

csharp 复制代码
namespace Learn3
{
    internal class Program
    {
        //类的默认级别为internal  Person为类的名称
        class Person
        {
            //类的主体
            //类的成员默认级别为private
            //string Name = "";
            //int Age;
            public string Name = "";
            public int Age;
        
        
        }
        static void Main(string[] args)
        {

        }
    }
}

我们可以通过new来实例化出类的对象,进行操作

csharp 复制代码
namespace Learn3
{
    internal class Program
    {
        //类的默认级别为internal  Person为类的名称
        class Person
        {
            //类的主体
            //类的成员默认级别为private
            string Name = "";
            int age;
        
        }
        static void Main(string[] args)
        {
            //这一步通过new 来实例化类的对象 此时的per是类的对象
            Person per = new Person();
        }
    }
}

使用对象

由于类中的成员默认级别是private因此我们无法在类外部访问,因此我们需要使用public或internal修饰符让我们得到对象成员可以访问

csharp 复制代码
namespace Learn3
{
    internal class Program
    {
        class Person
        {
            //使用public或internal访问修饰符 可以使我们在类外部进行访问
            public string Name="";
            public int Age;

        }
        static void Main(string[] args)
        {
            //实例化对象
            Person per = new Person();
            //通过 . 的方式来进行调用
            per.Name = "张三";
            per.Age = 10;
            Console.WriteLine($"这个人叫{per.Name},他今年{per.Age}了");
        }
    }
}

类中的成员函数

类的成员函数是一个在类定义中有它的定义或原型函数。作为类的成员,它可以在类的任何对象上操作。并且能访问该对象的类的所有成员(static成员除外,如果想访问static成员需要使用静态函数)

csharp 复制代码
namespace Learn3
{
    internal class Program
    {
        class Person
        {
            public string Name="";
            public int Age;
            public void GetInfo() 
            {
                Console.WriteLine($"这个人叫{Name},他今年{Age}了");
            }
        }

        static void Main(string[] args)
        {
            Person per = new Person();
            per.Name = "张三";
            per.Age = 10;
            per.GetInfo();
        }
    }
}

类的静态成员

类的静态成员需要使用static声明。static修饰过的成员它属于类本身而不是实例化对象的本身。

csharp 复制代码
namespace Learn3
{
    internal class Program
    {


        class Person
        {
            public string Name="";
            public int Age;
            //static 静态修饰后 Num为静态成员变量只属于类本身
            public static int Num;
            public void GetInfo() 
            {
                Console.WriteLine($"这个人叫{Name},他今年{Age}了");
            }
        }

        static void Main(string[] args)
        {

            Person per = new Person();
            Person.Num = 1;//Num成员属于类本身而不属于类的对象
            
        }
    }
}

而如果希望类中的函数只能访问静态成员就需要使用static进行修饰函数

csharp 复制代码
namespace Learn3
{
    internal class Program
    {
        class Person
        {
            public string Name="";
            public int Age;
            //静态变量成员
            public static int Num;
            public void GetInfo() 
            {
                Console.WriteLine($"这个人叫{Name},他今年{Age}了");
            }
            //属于类本身只能访问静态字段
            public static void GetNum() 
            {
                //Console.WriteLine(Name);//报错 无法访问非静态字段
                Console.WriteLine(Num);//访问静态字段
            } 
        }

        static void Main(string[] args)
        {

            Person per = new Person();
            Person.Num = 1;//Num成员属于类本身而不属于类的对象
            Person.GetNum();//同理GetNum函数成员属于类本身而不属于类的对象

        }
    }
}

构造函数

类的构造函数是类的一个特殊的成员函数,当创建类时运行。构造函数的名字与类名完全相同,且无任何返回值 并且在类中允许你创建多个构造函数,它通过重载来找到对应的构造函数

csharp 复制代码
namespace Learn3
{
    internal class Program
    {


        class Person
        {
            public string Name="";
            public int Age;
            //构造函数名与类名一致且无返回值 无参
            public Person() 
            {
                Console.WriteLine("实例化对象已创建");
            }
        }

        static void Main(string[] args)
        {

            Person per = new Person();
            per.Name = "张三";
            Console.WriteLine("名字:"+per.Name);
        }
    }
}

有参构造函数

同时它允许你对构造函数传递参数,也叫有参构造函数,一般用于初始化赋值

csharp 复制代码
namespace Learn3
{
    internal class Program
    {
    class Person
        {
            public string Name="";
            public int Age;
            public void GetInfo() 
            {
                Console.WriteLine($"这个人叫{Name},他今年{Age}了");
            }
            //有参构造函数 初始化对象
            public Person(string name,int age) 
            {
                Name = name;
                Age = age;
                Console.WriteLine("实例化对象已创建");
            }
          }

        static void Main(string[] args)
        {
            // 传递参数
            Person per = new Person("张三",18);
            per.GetInfo();
        }
    }
}

析构函数

析构函数时类的一个特殊函数成员,当类超出范围时运行 析构函数的名称是在类的名称前加上一个波浪形(~)作为前缀,它不返回值,也不带任何参数。

析构函数用于在结束程序(比如关闭文件、释放内存等)之前释放资源。析构函数不能继承或重载。

csharp 复制代码
namespace Learn3
{
    internal class Program
    {
    class Person
        {
            public string Name="";
            public int Age;
            public void GetInfo() 
            {
                Console.WriteLine($"这个人叫{Name},他今年{Age}了");
            }
            //有参构造函数 初始化对象
            public Person(string name,int age) 
            {
                Name = name;
                Age = age;
                Console.WriteLine("实例化对象已创建");
            }
            //结束程序之前运行
            ~Person() 
             {
                 Console.WriteLine("对象被销毁");
             }
          }

        static void Main(string[] args)
        {
            // 传递参数
            Person per = new Person("张三",18);
            per.GetInfo();
        }
    }
}

类中构造函数的this关键字

this关键字在构造函数中有两种用法

  1. 引用当前实例,构造函数中this指向你实例化的对象
  2. 链式调用构造函数 使用:this语法,一个构造函数可以调用同一个类中的另一个构造函数,避免代码重复,通常较少的调用较多的。它与重载相结合

引用当前实例 如下,构造函数中的this指向实例化对象

csharp 复制代码
namespace Learn3
{
    internal class Program
    {


        class Person
        {
            public string Name="";
            public int Age;
            public Person(string name,int age) 
            {
               //此时this指向类的实例化对象,上下文中的per对象
                this.Name = name;
                Console.WriteLine("实例化对象已创建");
            }
        }

        static void Main(string[] args)
        {

            Person per = new Person("张三",18);
        }
    }
}

链式调用构造函数

csharp 复制代码
namespace Learn3
{
    internal class Program
    {


        class Person
        {
            public string Name="";
            public int Age;
            public void GetInfo() 
            {
                Console.WriteLine($"这个人叫{Name},他今年{Age}了");
            }
            public Person(string name,int age) 
            {
                this.Name = name;
                this.Age = age;
                Console.WriteLine("实例化对象已创建");
            }
            
            //实例化出Person的对象如果传参是一个单一的string类型根据重载编译器会先走这个构造函数,而我们通过:this又指向了上方的构造函数并且传递a参数和11参数 对对象进行初始化赋值
            public Person(string a):this (a,11) 
            {
                //此处可以是空的或者包含初始化逻辑
            }

        }

        static void Main(string[] args)
        {

            Person per = new Person("张三");
            per.GetInfo();
        }
    }
}
相关推荐
大飞pkz3 小时前
【设计模式】观察者模式
开发语言·观察者模式·设计模式·c#
唐青枫4 小时前
深入掌握 FluentMigrator:C#.NET 数据库迁移框架详解
c#·.net
李宥小哥5 小时前
C#基础08-面向对象
开发语言·c#
李宥小哥5 小时前
C#基础07-类与对象
服务器·数据库·c#
包达叔6 小时前
仿NewLife的XmlConfig类实现Json配置文件
c#·json·newlife
大飞pkz9 小时前
【设计模式】解释器模式
开发语言·设计模式·c#·解释器模式
敲敲敲-敲代码12 小时前
web系统(asp.net和C#)
前端·c#·asp.net
__XYZ12 小时前
Vala编程语言高级特性-弱引用和所有权
c语言·开发语言·后端·c#
大飞pkz17 小时前
【设计模式】责任链模式
开发语言·设计模式·c#·责任链模式
大飞pkz19 小时前
【设计模式】六大基本原则
开发语言·设计模式·c#·六大原则