.NET/C#⾯试题汇总系列:基础语法

1. 字符串中string str=null和string str=""和string str=string.Empty的区别?

  1. string str = null;:这种方式声明了一个字符串变量str,并将其初始化为null。这意味着str不指向任何实际的字符串对象。如果你试图访问str的属性或方法,将会抛出一个NullReferenceException异常。

  2. string str = "";:这种方式声明了一个字符串变量str,并将其初始化为空字符串("")。这意味着str是一个有效的字符串对象,但它的长度为0,没有任何字符。你可以安全地调用str的方法,而不会抛出异常。

  3. string str = string.Empty;:这种方式与string str = "";相同,都是将str初始化为一个空字符串。使用string.Empty是一种编程习惯,因为它明确表示你的意图是将字符串初始化为空。然而,在性能方面,这两种方式没有区别。

总结一下,

如果你想要声明一个未初始化的字符串变量,可以使用string str;(默认情况下,局部变量会被初始化为null)。

如果你想要将字符串初始化为空,可以使用string str = "";string str = string.Empty;。 

2. byte b = 'a'; byte c = 1; byte d = 'ab'; byte e = '啊'; byte g = 256; 这些变量有些 错误是错再哪⾥? 

在C#中,byte是一种基本数据类型,用于表示一个8位无符号整数。它的取值范围是0到255。byte类型的变量可以用来存储二进制数据、图像数据、音频数据等。 

3.string和StringBuilder的区别,两者性能的⽐较 

  1. 可变性:string是不可变的,这意味着一旦创建了一个string对象,就不能更改它的内容。而StringBuilder是可变的,可以在不创建新对象的情况下修改其内容。

  2. 性能:由于string的不可变性,每次对其进行修改时,都需要创建一个新的string对象,这会导致额外的内存分配和垃圾回收开销。而StringBuilder在修改时不会创建新的对象,因此在进行大量字符串操作时,使用StringBuilder的性能会更好。

 4.什么是扩展⽅法?

扩展方法(Extension Methods)是一种在C#中为现有类型添加新功能的方法,而无需修改原始类型的源代码。

条件:按扩展⽅法必须满⾜的条件,

1.必须要静态类中的静态⽅法

2.第⼀个参数的类型是要扩展的类型,并且需要添加this关键字以标识其为扩展⽅法 

建议:通常,只在不得已的情况下才实现扩展⽅法,并谨慎的实现

使⽤:不能通过类名调⽤,直接使⽤类型来调⽤ 

 5.byte a =255;a+=5;a的值是多少?

 byte的取值范围是0--255,a+=1时,a的值时0,所 以a+=5时,值是4

 6.什么是装箱和拆箱?

装箱:将类型转换为引用类型的过程称为装箱

int num = 42;
object boxedNum = num; // 装箱操作

拆箱:将引用类型转换类型的过程称为拆箱

object boxedNum = 42;
int num = (int)boxedNum; // 拆箱操作

装箱和拆箱操作可能会带来性能开销,因为它们涉及到内存分配和数据复制。在编写代码时,应尽量避免不必要的装箱和拆箱操作,以提高程序的性能。 

 7.值类型和引⽤类型的区别

值类型变量是直接包含值。将⼀个值类型变量赋给另⼀个值类型变量,是复制包含的值,默认值是0。

引⽤类型变量的赋值只复制对对象的引⽤,⽽不复制对象本身,默认值是null 

值类型有整形、浮点型、bool、枚举。

引⽤类型有class、delegate、Object、string

 值类型存储在中,引⽤类型存储在

 8.new关键字的作⽤?

  1. 创建对象实例
    MyClass obj = new MyClass(); 
  2. 初始化变量:
    int[] arr = new int[5]; // 创建一个长度为5的整数数组
  3. 调用构造函数
    MyClass obj = new MyClass(param1, param2);
  4. 匿名类型初始化:
    var obj = new { Name = "John", Age = 30 };
  5. 数组初始化
    int[] arr = new int[] { 1, 2, 3, 4, 5 };
  6. 放置语句:
    object obj = new object(); // 将对象放置在堆上

    int num = new int(); // 将对象放置在栈上
  7. 泛型类型参数:
    List<int> list = new List<int>();
  8. 嵌套类访问
    OuterClass.NestedClass nestedObj = new OuterClass.NestedClass();

9. int?和int有什么区别?

  • int?为可空类型,默认值可以是null
  • int默认值是0
  • int?是通过int装箱为引⽤类型实现

使用int?的一个优点是可以避免空引用异常(NullReferenceException) 

10. C#中的委托是什么?

  •  将⽅法当作参数传⼊另⼀个⽅法的参数。
  • .net中有很多常⻅的委托如:Func 、Action
  • 作⽤:提⾼⽅法的扩展性

 11.⽤最有效的⽅法算出2乘以8等于⼏?

位运算是最快,使⽤的是位运算 逻辑左位移<<。 ⽅法是2<<3相当于0000 0000 0000 0010 (2的16位 int⼆进制)左移三位就是 0000 0000 0001 0000(16的⼆进制)

12.const和readonly有什么区别

 const和readonly都是用于声明不可变变量的关键字

 const关键字用于声明常量,即在声明时必须初始化,并且之后不能被修改。

const int myConstant = 10;

 readonly关键字用于声明只读字段,它可以在声明时或构造函数中初始化,并且在对象实例化后可以更改一次。

public class MyClass
{
    public readonly int a;

    public MyClass(int value)
    {
        a = value;
    }
}

13.现有⼀个整数number,请写⼀个⽅法判断这个整数是否是2的N次⽅

 取模运算: ⽤number%2==0可以判断,但是这个有点低级

 14.CTS、CLS、CLR分别作何解释

1. CTS(Clear To Send):CTS是一种通信协议信号,用于在数据传输之前确认接收方是否准备好接收数据。

2. CLS(Clear Screen):CLS是一个命令或函数,用于清除终端或控制台屏幕上的文本内容。

3. CLR(Clear Register):CLR是一个指令或操作码,用于将寄存器的内容清零。

15.在.net中,配件的意思是?

配件(Assembly)是指一个包含程序集的二进制文件。
1. 程序集:这是.NET应用程序的主要组成部分,它包含了编译后的代码和元数据。程序集可以是动态链接库(DLL)或可执行文件(EXE)。
2. 资源:这些是与程序集关联的数据,如图像、音频、文本等。资源可以被嵌入到程序集中,也可以作为外部文件存储。
3. 清单:清单是一个描述程序集内容的XML文件,它包含了程序集的名称、版本、公钥等信息。清单还描述了程序集所依赖的其他程序集。

 16.分析下⾯代码,a、b的值是多少?

1 string strTmp = "a1某某某";
2 int a = System.Text.Encoding.Default.GetBytes(strTmp).Length;
3 int b = strTmp.Length;

 分析:⼀个字⺟、数字占⼀个byte,⼀个中⽂占占两个byte,所以a=8,b=5

 17.Strings = new String(“xyz”);创建了⼏个String Object?

两个对象,⼀个是“xyz”,⼀个是指向“xyz”的引⽤对象s。

18.静态成员和⾮静态成员的区别 

1.静态成员⽤statis修饰符声明,在类被实例化时创建,通过类进⾏访问

2.不带statis的变量时⾮静态变量,在对象被实例化时创建,通过对象进⾏访问,

3.静态⽅法⾥不能使⽤⾮静态成员,⾮静态⽅法可以使⽤静态成员

4.静态成员属于类,⽽不属于对象

生命周期

  • 静态成员:静态成员变量的生命周期是整个程序运行期间。它们在程序启动时被创建,并且直到程序结束时才被销毁
  • 非静态成员:非静态成员变量的生命周期依赖于对象的生命周期。当对象被创建时,它的非静态成员被创建,当对象被销毁时,这些成员也随之销毁。

访问方式

  • 静态成员:静态成员可以通过类名直接访问,无需创建类的实例。这为在没有实例化对象的情况下使用类的成员提供了可能。
  • 非静态成员:非静态成员只能通过对象实例访问。每个对象有自己独立的非静态成员副本,它们的值可以在不同的对象间有所不同。

19.c#可否对内存直接操作 

 可以,但是不推荐

20.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

 s1+1不能显式转换成short类型,可以修改为s1 =(short)(s1 + 1) 。

short s1 = 1; s1 += 1正确

21.什么是强类型,什么是弱类型?哪种更好些?为什么?

强类型是在编译的时候就确定类型的数据,在执⾏时类型不能更改,⽽弱类型在执⾏的时候才会确定类型。

没有好不好,⼆者各有好处,强类型安全,因为它事先已经确定好了,⽽且效率⾼。

 22.using关键字的作⽤

1. using 指令 - 引入命名空间,也可using 别名

2. using 语句 - 确保资源释放

        释放资源,实现了IDisposiable的类在using中创建,using结束后会⾃定调⽤该对象的Dispose⽅法, 释放资源。

 23.ref和out有什么区别

1.都是按引⽤类型进⾏传递

2.属性不是变量不能作为out、ref参数传递

3.ref参数必须初始化。out不需要初始化

4.作⽤,当⽅法有多个返回值时,out⾮常有⽤

  • 初始值要求‌:ref参数在传递给方法之前必须被初始化,而out参数在传递前不必初始化(尽管在方法内部必须被赋予一个值)。
  • 用途‌:ref常用于需要修改输入参数并返回修改后结果的情况。out则更侧重于输出参数,尤其是当方法需要返回多个值时。
  • 可读性‌:out参数的使用有助于阅读代码的人了解该参数是一个输出值,而ref参数的意图可能不那么明显。

24.a.Equals(b)和a==b⼀样吗? 

 不⼀样,a==b仅仅表示a和b值相等,a.Equals(b)表示a与b⼀致

25.下⾯这段代码求值

1 class Class1
2     {
3         internal static int count = 0;
4         static Class1()
5             {
6                 count++;
7             }
8         public Class1()
9             {
10                 count++;
11             }
12     }
13     Class1 o1 = new Class1();
14     Class1 o2 = new Class1();

o1.count的值是多少?

答案:3,静态 构造⽅法计算⼀次,两个实例化对象计算两次。

 26.关于构造函数说法正确的是哪个?

  • a)构造函数可以声明返回类型。
  • b)构造函数不可以⽤private修饰
  • c)构造函数必须与类名相同
  • d)构造函数不能带参数

答案:c ,构造函数必须与类名相同,可以传递多个传递,作⽤就是便于初始化对象成员,不能有任何返回类型

27.下面这段代码求值

Math.Round(11.5)=12

Math.Round(-11.5)=-12

 28..&和&&的区别

  1. 操作方式
    • & 是一个按位与运算符,它对两个数的每一位进行逻辑与操作。这意味着,如果同一位置的两个比特均为1,则结果在该位置为1,否则为0。例如,12 (1100 in binary) & 7 (0111 in binary) 将产生 4 (0100 in binary)
    • && 是一个布尔逻辑运算符,用于连接两个条件表达式。当两个表达式都为真时,结果才为真。如果第一个表达式为假,则不会计算第二个表达式,因为结果已确定为假。这被称为“短路”行为。
  2. 应用场景
    • & 通常用于整数的二进制操作,如设置特定位、清除特定位或检查特定位的状态。例如,你可以使用按位与来检查一个数字是否为偶数:(number & 1) == 0
    • && 主要用于布尔逻辑判断,如if语句和while循环中的条件判断。例如,你可以在if语句中使用 && 来确保两个条件同时满足:if (isValid && isAuthenticated)
  3. 返回类型
    • & 其操作数通常为整数,返回的结果也是一个整数
    • && 其操作数通常为布尔值,返回的结果也是一个布尔值

 29. i++和++i有什么区别?

1.i++是先赋值,然后再⾃增;++i是先⾃增,后赋值。

2.i=0,i++=0,++i=1; Console.WriteLine(i==i); 结果位true

30.as和is的区别 

as在转换的同时判断兼容性,如果⽆法进⾏转换,返回位null(没有产⽣新的对象),as转换是否成功判 断的依据是是否位null is只是做类型兼容性判断,并不执⾏真正的类型转换,返回true或false,对象为 null也会返回false。

as⽐is效率更⾼,as只需要做⼀次类型兼容检查 

 as 和 is 关键字主要用于类型检查和转换,但它们的行为和用途有所不同

应用场景

  • as: 当你尝试将一个对象转换为另一个类型时,如果转换失败,as操作符不会引发异常,而是返回null。这使得as在不确定类型转换是否安全时非常有用。
  • isis操作符用于检查对象是否为特定的类型。如果对象是指定类型或者是其派生类型,is表达式的结果为true,否则为false。与as不同,is不进行转换,它仅用于类型检查。

返回类型

  • asas操作符尝试将对象转换为指定的类型,并返回转换后的对象或null。如果转换失败,不会引发异常。
  • isis操作符返回一个布尔值,表示类型检查是否成功。
  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值