C#学习笔记8:类,成员变量,成员方法,属性,构造方法

-呈阶梯状分布- 21 次阅读 1297 字 发布于 2026-08-10 最后更新于 2026-08-10 C#学习笔记


我们前面学过许多类型,有int,string,double等等。通过类型,我们可以实例化一个对象,例如int[] a = new int[0];中,a就是int[]类型的对象。我们当然也可以自定义一种类型。

class 类名
{
    成员变量...
    成员变量...
    
    属性...
    属性...

    成员方法...
    成员方法...

    构造方法...
}

可以看到,我们用class 类名{}就能创建一个类,而大括号内放的就是类的内容。你可以先实例化一个类,以便后续测试,代码如下:

using System;

namespace Csharp
{
    class Test
    {
        
    }
    class Program
    {
        static void Main(string[] args)
        {
            Test testObject = new Test();
        }
    }
}

接下来,我会详细介绍类都有哪些内容:

成员变量

和结构体一样,类也有成员变量,并且在使用上与结构体完全一致。我们为类添加上成员变量:

using System;

namespace Csharp
{
    class Test
    {
        int x = 0;
        int y = 0;
        int z = 0;
    }
    class Program
    {
        static void Main(string[] args)
        {
            Test testObject = new Test();
        }
    }
}

但是,此时我们不能使用testObject.x来调用成员变量x,因为成员变量默认作用域为private,只能在类内部调用。

成员方法

同样是类似结构体,类也有自己的成员方法,代码如下:

using System;

namespace Csharp
{
    class Test
    {
        int x = 0;
        int y = 0;
        int z = 0;
        public void PrintXYZ()
        {
            Console.WriteLine("x:{0} y:{1} z:{2}", x, y, z);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Test testObject = new Test();
        }
    }
}

作为给外部调用的方法,我们在前面加上public改变其作用域,就可以使用testObject.PrintXYZ()调用了。

属性

我们知道,变量可以读取(如Console.WriteLine(x);),也可以写入(如x = 3;),属性也是如此,不过他改变了读写的逻辑。

属性内有get和set两大块,所以属性的结构如下:

作用域 属性类型 属性名
{
    get
    {
    
    }
    set
    {
    
    }
}

get负责读,set负责写,接下来详细介绍这两部分:

get在属性被读取时使用,决定返回什么内容。你可以先定义一个private的成员变量,再通过属性返回给外界访问,这种间接访问的方式非常常用。

using System;

namespace Csharp
{
    class Test
    {
        int x = 0;
        int y = 0;
        int z = 0;
        private string name;

        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                
            }
        }
        public void PrintXYZ()
        {
            Console.WriteLine("x:{0} y:{1} z:{2}", x, y, z);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Test testObject = new Test();
        }
    }
}

这样,你就可以通过testObject.Name间接访问访问不到的name了。

set,也就是写入、赋值。我们在赋值的时候,都是变量名 = 值,那么我们怎么知道用户赋予了什么值呢?

在set内,用户写入的值被存储在一个变量value内,你直接写value就能访问到用户写入的内容,如果我们想把私有成员变量赋值为value,可以这么写:

using System;

namespace Csharp
{
    class Test
    {
        int x = 0;
        int y = 0;
        int z = 0;
        private string name;

        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        public void PrintXYZ()
        {
            Console.WriteLine("x:{0} y:{1} z:{2}", x, y, z);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Test testObject = new Test();
        }
    }
}

那么,此时对Name进行操作就相当于对name进行操作了。当然,你也可以修改读写的流程,让他没那么无聊。不过,如果你确实只需要把属性当成员变量用的话,可以这么写:

public int XYZ
{
    get; set;
}

此时,XYZ这个属性就和成员变量无异,读写功能与成员变量一致。

构造方法

正如在调用函数时我们希望传入一些参数,在实例化一个类时我们希望传入参数,就可以用构造方法实现。结构如下:

public 类名()
{
    代码块...
}

可以看到,构造方法作用域必须为public,且方法名和类名一致,不用填写返回值类型。此时我们可以在方法参数内填入参数,来作为实例化类时需要传入的参数,例如我们希望实例化的时候传入xyz,就可以这么写:

using System;

namespace Csharp
{
    class Test
    {
        int x = 0;
        int y = 0;
        int z = 0;
        public void PrintXYZ()
        {
            Console.WriteLine("x:{0} y:{1} z:{2}", x, y, z);
        }
        public Test(int x, int y, int z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Test testObject = new Test(0, 0, 0);
        }
    }
}

可以看到,我们希望将形式参数xyz赋值给成员变量xyz,但两者名称相同,怎么办?
此时,this.x代表成员变量的x,而x代表形式参数的x,this在此处就代表实例化对象,通过this.就可以调用成员变量,只是在大多数情况下this.可以省略。

构造方法也可以重载,例如我希望添加一个不输入参数就默认xyz为0的重载:

using System;

namespace Csharp
{
    class Test
    {
        int x = 0;
        int y = 0;
        int z = 0;
        public void PrintXYZ()
        {
            Console.WriteLine("x:{0} y:{1} z:{2}", x, y, z);
        }
        public Test(int x, int y, int z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
        }
        public Test()
        {
            x = 0;
            y = 0;
            z = 0;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Test testObject1 = new Test(0, 0, 0);
            Test testObject2 = new Test();
        }
    }
}

可以看到,在不混淆的情况下,xyz默认指的就是this.xyz。

OK,下一篇继续面向对象!