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();
        }
    }
}
相关推荐
最美的不是下雨天4 小时前
为什么要用async、await ?
c#
NullReference5 小时前
记一次WPF程序界面卡死的情况
c#
秋月的私语5 小时前
wpf程序启动居中并且最小化到托盘修复记录
c#
木心爱编程8 小时前
C++程序员速通C#:从Hello World到数据类型
c++·c#
※※冰馨※※8 小时前
【c#】 使用winform如何将一个船的图标(ship.png)添加到资源文件
开发语言·windows·c#
咕白m6259 小时前
C# 实现 Word 与 TXT 文本格式互转
c#·.net
土了个豆子的1 天前
04.事件中心模块
开发语言·前端·visualstudio·单例模式·c#
@areok@1 天前
C++mat传入C#OpencvCSharp的mat
开发语言·c++·opencv·c#