C#基础知识(4)

这篇博客详细介绍了C#的基础知识,包括封装性、readonly关键字、设计模式(如单例)和继承的概念、语法、特点。在封装性中讲解了属性的使用;readonly特性允许在构造函数中初始化,但不可再次修改;继承部分讨论了构造方法、方法的隐藏与重写。此外,还提到了多态、访问权限修饰符、as关键字和Is关键字的应用。
摘要由CSDN通过智能技术生成

一、封装性

什么是封装

​ 1.可以将某段具有特殊功能的代码提取出来,做成方法。

​ 2.将某些具有特殊格式的数据做成一个类的对象。(比如年龄不可能超过150,也不可能有负数)

//封装方法使年龄在合理的访问内

class Person
{
   
    //因为如果直接访问直接访问这个字段
    //那么对这个字段进行的赋值可能是不符合逻辑的
    //所以,将这个字段做成私有的不允许外界直接访问(private)
    private uint age;

    //但是将age私有化后,外界如果还需要使用
    //我们给外界提供访问这个age字段的方法
	public void SetAge(uint newAge)
	{
   
		if (newAge > 150) return;
		age = newAge;//将外界传过来的值给age赋值   
	}
	public uint GetAge()
	{
   
		return age;
	}
}

class Program
{
   
    public static void Main(string[] args)
    {
   
        //实例化一个Person对象
        Person xiaoming = new Person();
        //访问xioaming的age字段
        xiaoming.SetAge(10);//设置年龄值
        uint age = xiaoming.GetAge();//获取年龄值
    }
}

属性

语法:[访问权限修饰符] 要访问的字段类型 属性名(遵循大驼峰命名法,但一般用访问的字段作为属性名){ }

注意:一个属性中,至少要有一个访问器(即:set{})

class Person
{
   
    private uint age;    
    //通过属性和属性访问器来实现
    public uint Age //属性与方法写法上差了一个()
    {
   
        //写操作
        set {
   
            //在属性访问器中(set{}就叫属性访问器),使用value来表示外界传的值
            if (value <= 150) age = value;
        }
        //读操作
        get
        {
   
            return age;
        }
    }
}
class Program
{
   
    public static void Main(string[] args)
    {
   
        //实例化一个Person对象
        Person xiaoming = new Person();        
		//使用属性非常简单,且能达到与方法一样的效果
        xiaoming.Age = 10;
        Console.WriteLine(xiaoming.Age);
    }
}

二、readonly只读关键字

1.readonly通常在类中属性前面

2.使用lreadonly的属性,只能在定义时,或者构造函数中初始化,其他地方都不能再修改其值。

readonly与get{}比较:

readonly只能够初始化一次,即在定义或者构造方法初始化时,而get{}虽然也起到的只读的作用,但可以通过set{}进行多次修改。

readonly(只读)与const(常量)比较:

​ 1.const常量必须要有初始值,而readonly可以没有

​ 2.readonly可以在构造方法中进行赋值,而const不行。const一旦确定值就不可以改变了

eg:例如我们这里有一个类

lass TestClass2
    {
   
        private int someValue;

        public void ChangeValue(int newValue)
        {
   
            someValue = newValue;
        }

        public int ShowValue()
        {
   
            return someValue;
        }
    }

而在另一个类中使用它

class TestClass
    {
   
        private readonly TestClass2 tc; // 注意此处tc是readonly的

        public TestClass()
        {
   
            tc = new TestClass2();
        }

        public void ChangeTCValue(int value)
        {
   
            tc.ChangeValue(value);
        }

        public void Show()
        {
   
            Console.WriteLine("{0}", tc.ShowValue());
        }
    }

我们看到虽然tc这个字段是readonly的,但是可以使用方法来改变tc中someValue的值。似乎这个“只读”失去了意义,因为可以修改它的值的话还叫什么“只读”呢?

非也!

从上面的代码中我们可以看到,tc的类型是TestClass2,是一个引用类型。而引用类型是必须用new关键字为它分配了一块内存以后它才能在后续代码中工作的。也就是说,tc这个变量仅仅是一块内存地址罢了。这里的“readonly” tc只是无法再重新更改它的引用,但它所引用对象的属性是可以改变的。

那么为什么不用const呢?还是因为tc是引用,是动态分配内存的,不可能在编译阶段就确定它的地址,这点和值类型(包括string)是完全不一样的。

综上所述,可以得出结论:readonly修饰的字段,其初始化仅是固定了其引用(地址不能修改),但它引用的对象的属性是可以更改的。

当然,这里的“地址不能修改”指的是在代码中不能再对readonly变量进行再赋值,实际运行情况中可能会遇到GC或反射改变内存的情况。但是在本文所说的环境下不必考虑。

所以,大胆放心的用readonly吧,这样还可以防止不必要的再赋值,保证了这个对象的安全性。

三、设计模式

用来解决特定问题的解决方案

单例

在一个项目的不同模块中获取对象,那么获取到的是同一个对象。

//单例
class User
{
   
    //第一种单例方式:
    //通过私有化构造方法,限制new一个新的对象
    //创建私有静态类对象,通过他来创建对象时只执行一次
    //提供一个公有的静态的访问方法(CurrentUser())或者是类的属性只读(Current)来获取一个对象

    //1.私有化构造方法,目的:防止用户通过new的方式多次实例化对象。</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值