3_关于c#中类的初步认识

关于C#中类的认识

静态字段 static

静态字段被类的所有实例共享,所有实例都访问内存同一内存位置,因此,如果该内存位置的值一旦被某个实例改变了,这种改变对所有的实例都可见。我们可以使用static关键字来将字段声明为静态,如:

namespace Hello
{
    internal class Program
    {
        static void Main(string[] args)
        {
            D d1 = new D();
            d1.Menu1 = 1;
            D.Menu2 = 100;
            D d2 = new D();
            d2.Menu1 = 10;
            Console.WriteLine($"d1's Menu1 is {d1.Menu1} and d1's Menu2 is {D.Menu2}");
            Console.WriteLine($"d2's Menu1 is {d1.Menu1} and d2's Menu2 is {D.Menu2}");
        }
    }

    class D
    {
        public int Menu1;
        public static int Menu2;
    }
}

在上面的额代码中,无论创建了多少个D的实例,其Menu2始终是保持一致的,但是各个实例的Menu1则是不同的。对于静态字段的额使用,我们可以直接这样使用:类名.静态字段

关于静态成员的生命周期

静态成员和实例成员的生命周期是不同的。

  • 对于实例成员来讲,只有在实例被创建后才会产生实例成员,伴随着实例对象的销毁实例成员也会被销毁。
  • 对于静态成员来讲,不管该类有没有实例,该类始终都会有静态成员,并且可以访问。如下所示:
namespace Hello
{
    internal class Program
    {
        static void Main(string[] args)
        {
            D.Menu2 = 200;
            Console.WriteLine($"D's Menu2 is {D.Menu2}");
        }
    }

    class D
    {
        public int Menu1;
        public static int Menu2;
    }
}

关于类的属性声明和访问器

set和get访问器都有预定的语法和语义。可以把set访问器想象成一个方法,但有一个单独的参数,它“设置”属性的值。get访问器没有参数并返回一个值。

  • set访问器:
    • 拥有一个独立的、隐式的参数,名称为value,与属性的类型相同;
    • 拥有一个返回类型void
  • get访问器:
    • 没有参数;
    • 拥有一个与属性类型相同的返回类型。

如下图所示:

namespace Hello
{
    internal class Program
    {
        static void Main(string[] args)
        {
            C1 c = new C1();
            c.TheRealValue = 10;
            Console.WriteLine(c.TheRealValue);
        }
    }

    class C1
    {
        private int theRealValue;
        public int TheRealValue 	//暴漏对私有成员访问的接口
        {
            set
            {
                theRealValue = value;
            }
            get
            {
                return theRealValue;
            }
        }

    }
}

自动实现属性

因为属性经常要被关联到相关字段,所以C#提供了自动实现属性,允许只声明属性而不声明后备字段。编译器会自动的创建隐藏的后备字段以及自动挂载到get和set访问器上。如下图实例所示:

namespace Hello
{
    internal class Program
    {
        static void Main(string[] args)
        {
            C1 c = new C1();
            c.TheRealValue = 10;
            Console.WriteLine(c.TheRealValue);
        }
    }

    class C1
    {
        private int theRealValue;
        public int TheRealValue { get; set; }
    }
}

实例构造函数

实例构造函数是一个特殊的方法,它在创建类的每个新实例时候执行。注意要将构造函数声明为public,构造函数名称和类名一致,且没有返回值。

默认情况下编译器自带一个无参数的构造方法,我们也可以定义多个构造方法。

using System.Runtime.CompilerServices;

namespace Hello
{
    internal class Program
    {
        static void Main(string[] args)
        {
            C1 c1 = new C1();
            Console.WriteLine(c1.TheRealValue);
            C1 c2 = new C1(90);
            Console.WriteLine(c2.TheRealValue);
        }
    }

    class C1
    {
        public int TheRealValue;

        public C1()
        {
            TheRealValue = 10;
        }

        public C1(int TheRealValue)
        {
            this.TheRealValue = TheRealValue;
        }
    }
}
posted @ 2023-12-28 14:43  LilyFlower  阅读(2)  评论(0编辑  收藏  举报