C# 基础知识扩充2 值类型与引用类型,类与结构,拆装箱,冒泡排序,递归,集合运用场景,const与readonly out与ref StringBuild和String 有何不同

8 篇文章 0 订阅

一:在C#中,string str = null 与 string str = “” 请尽量使用文字或图说明其中的区别

string str=null 把这个引用指向了一个null,没有地址没有值的地方。
string str="" 把这个引用指向了一个地址,地址里面存的是空的字符。

string str="" 代表着这个值是字符串类型的空,你也不能说是没有数据的null;
而 string str=null 就相当于一个人没有考试,所以没有分数(没有数据),0分都不是的那种。

二:简述类和结构的相同点和不同点。并用代码举例

不同点:
1.关键字不同 一个是class,一个是struct

2.类型不同class是引用类型struct是值类型,一个是堆区,另一个是栈区

3.成员不同,结构体没有默认的构造函数(可以添加)和没有析构函数。
注:不可以使用abstract,protected,sealed修饰!

4.Struct变量使用完之后就自动解除内存分配,Class实例有垃圾回收机制来保证内存的回收处理

5.继承性,结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口

6.在结构体中可以声明字段,注:但是声明字段的时候是不能给初始值的.

7.实体类中如果我们没有显示的定义构造函数,那么会有一个隐式无参的构造函数(重载构造函数之后,需要显示声明无参构造函数),而在结构体中隐身无参的构造函数无论如何都存在!

8.在类中可以显示的定义无参的构造函数,而在结构体中我们不能显示的定义无参的构造函数。

9.结构体是可以New的,而结构体构造函数要求必须要为所有的字段赋值.即使是无参的构造函数,也会给值类型赋初值为 0,引用类型赋初值为null。

相同点:
1.都有属性和方法
2.和类一样可以继承自接口

//用struct声明
    public struct ClassA
    {
        public string name;//结构中不能设初始值
    }
 
 
 static void Main(string[] args)
        {
            ClassA classA;//无需new 直接定义对象即可
            classA.name = "李四";//必须赋初值
        }  
 //用class声明
    public class ClassB
    {
        public string name="李四";//可以设初始值
    }
 
static void Main(string[] args)
        {
            ClassB classB=new Class1();//需要new 初始化对象才可以使用
            classB.name = "王舞";//无需赋初值
        } 

三:什么是拆箱和装箱?举例说明

装箱:将值类型转换成引用类型的操作

拆箱:将引用类型转换成值类型的操作

int numA=0;//声明一个值类型
//通过ToString强转成String类型,重所周知String类型是引用类型
string numB=a.ToString();
String numA="0";//声明一个引用类型
//通过Convert.Int32()可以将引用类型转换成值类型
int numB=Convert.Int32(numA);

四:编程实现一个冒泡排序

int[] arr = { 4,2,1,5,3};
            for (int i = 0; i < arr.Length; i++)
            {
                for (int j = i+1; j < arr.Length; j++)
                {
                    //arr[i]与arr[j]后面的数相比较,如果大于后面的数,则互相调换位置
                    if (arr[i]>arr[j])
                    {
                        int temp = arr[i];
                        arr[i] = arr[j];
                        arr[j] = temp;
                    }
                }
            }

五:编程实现一个递归方法

public int Add(int a) {
            if (a==1||a==2)
            {
                return a;
            }
            return Add(a - 2) + Add(a - 1);
        }

解释:方法自己调自己,就是方法的递归!

六:说说目前学的集合有哪些?,每一种集合的特点以及使用场景

ArrayList:可以进行动态维护,访问元素时需要进行类型转换。
对于需要快速随机访问元素,使用ArrayList!

Hashtable:元素以键/值对的方式存在。访问元素时需要进行类型转换。
对于需要以键值对存储的元素,使用Hashtable!

List:可以进行动态维护,访问元素时无需进行类型转换。
对于常常处理不同类型数据转换的类,可以使用泛型集合。

Dictionary<K,V>:元素以键/值对的方式存在。
访问元素时无需进行类型转换。

七:变量被标记为 “const” 和readonly” 有何不同?

const常量既可以声明在类中也可以在函数体内,但是static readonly常量只能声明在类中!

八:“out” 和 “ref” 参数有何不同?用代码举例

out参数在进入方法的时候,C#会自动清空它的一切引用和指向

        public string Out(out string str) {
            str = "1";//必需先要为str参数赋值
            return str;
        }
        
        static void Main(string[] args)
        {
            ClassA classA = new ClassA();
            string str;
            Console.WriteLine(class1.Out(out str));
        }

ref参数的参数必须最先初始化,ref参数在使用前必需初始化

        public string Ref(ref string str) 
        {
            str = "1";//必需先要为str参数赋值
            return str;
        }
 
        static void Main(string[] args)
        {
            Class1 class1 = new Class1();
            string str="0";
            //ref参数的参数必须最先初始化,使用前必需初始化
            Console.WriteLine(class1.Ref(ref str));
        }

九:“StringBuilder” 和 “String” 有何不同?

1.String声明之后在内存中大小是不可修改的
2.StringBuilder可以自由扩展大小(String分配在栈区,StringBuilder分配在堆区)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值