1. 字符串中string str=null和string str=""和string str=string.Empty的区别?
string str = null;
:这种方式声明了一个字符串变量str,并将其初始化为null。这意味着str不指向任何实际的字符串对象。如果你试图访问str的属性或方法,将会抛出一个NullReferenceException异常。
string str = "";
:这种方式声明了一个字符串变量str,并将其初始化为空字符串("")。这意味着str是一个有效的字符串对象,但它的长度为0,没有任何字符。你可以安全地调用str的方法,而不会抛出异常。
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的区别,两者性能的⽐较
可变性:string是不可变的,这意味着一旦创建了一个string对象,就不能更改它的内容。而StringBuilder是可变的,可以在不创建新对象的情况下修改其内容。
性能:由于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关键字的作⽤?
- 创建对象实例:
MyClass obj = new MyClass();- 初始化变量:
int[] arr = new int[5]; // 创建一个长度为5的整数数组- 调用构造函数:
MyClass obj = new MyClass(param1, param2);- 匿名类型初始化:
var obj = new { Name = "John", Age = 30 };- 数组初始化:
int[] arr = new int[] { 1, 2, 3, 4, 5 };- 放置语句:
object obj = new object(); // 将对象放置在堆上
int num = new int(); // 将对象放置在栈上- 泛型类型参数:
List<int> list = new List<int>();- 嵌套类访问:
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,否则为0。例如,12 (1100 in binary) & 7 (0111 in binary)
将产生4 (0100 in binary)
。&&
是一个布尔逻辑运算符,用于连接两个条件表达式。当两个表达式都为真时,结果才为真。如果第一个表达式为假,则不会计算第二个表达式,因为结果已确定为假。这被称为“短路”行为。- 应用场景
&
通常用于整数的二进制操作,如设置特定位、清除特定位或检查特定位的状态。例如,你可以使用按位与来检查一个数字是否为偶数:(number & 1) == 0
。&&
主要用于布尔逻辑判断,如if语句和while循环中的条件判断。例如,你可以在if语句中使用&&
来确保两个条件同时满足:if (isValid && isAuthenticated)
。- 返回类型
&
其操作数通常为整数,返回的结果也是一个整数。&&
其操作数通常为布尔值,返回的结果也是一个布尔值。
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
在不确定类型转换是否安全时非常有用。- is:
is
操作符用于检查对象是否为特定的类型。如果对象是指定类型或者是其派生类型,is
表达式的结果为true
,否则为false
。与as
不同,is
不进行转换,它仅用于类型检查。返回类型
- as:
as
操作符尝试将对象转换为指定的类型,并返回转换后的对象或null
。如果转换失败,不会引发异常。- is:
is
操作符返回一个布尔值,表示类型检查是否成功。