1. C#中堆和栈有什么区别?
堆栈:由编译器自动分配和释放。 函数体内定义的变量通常位于堆栈上。 堆:一般由程序员分配和释放。 使用new等内存分配函数分配的内容在堆上。 在栈中存储时,必须保持存储顺序,保持先进后出的原则。 是一个连续的内存域,系统自动分配和维护; 堆:是无序的,是一个不连续的内存域,由用户自己控制和释放。 如果用户不自己释放,当内存达到某个特定值时,就会被垃圾收集器(GC)回收。 栈内存不需要我们管理,也不需要GC管理。 当栈顶元素用完后,立即释放。 堆需要 GC 清理。 使用引用类型时,一般对指针进行操作,而不是对引用类型对象本身进行操作。但是值类型对自身进行操作
2.C#中的委托是什么? 活动是佣金吗?
委托的本质是一个类。 委托就是将一种方法作为参数替换到另一种方法中。 事件是委托的实例,事件是一种特殊的委托。 //例如:事件中的参数是一个方法。
3.C#静态构造函数有什么特点?
最先执行的构造函数,一个类中只允许有一个不带参数的静态构造函数。 执行顺序为:静态变量>静态构造函数>实例变量>实例构造函数
4.CTS、CLS、CLR分别是什么解释?
CTS:通用语言系统。 CLS:通用语言规范。 CLR:公共语言运行时。 CTS:类型通用类型系统。 Int32、Int16→int、→、→bool。 每种语言都定义了自己的类型。 .NET 通过 CTS 提供公共类型,然后将其转换为生成相应的 .NET 类型。 CLS:通用语言规范。 不同语言的语法是不同的。 每种语言都有自己的语法。 .NET通过CLS提供通用语法,然后对不同的语言进行翻译,生成对应的.NET语法。 CLR:公共语言运行时,也就是GC、JIT等。CLR有不同的,比如服务器CLR、Linux CLR(Mono)、CLR()。 相当于一个引擎,负责执行IL。
5.C#中什么是值类型和引用类型?
值类型:enum、int、float、char、bool,引用类型:class、、、array、、
6.请详细说明C#中类和结构体的异同?
类可以被实例化并且是引用类型。 类可以实现接口并单继承其他类。 它也可以用作基本类型。 它是在内存堆上分配的值类型。 它不能用作基类型,但可以实现接口并进行分配。 在内存堆栈上。
7.new关键字的作用
操作符:创建对象实例 修饰符:在派生类中定义同名方法,隐藏基类方法 约束:泛型约束定义,约束可以使用的泛型类型
8.int和int有什么区别? 和整数?
int?对于可空类型,默认值可以是0int? 它是通过int装箱作为引用类型来实现的。
9.C#中按值传递和按引用传递有什么区别?
按值传递时,系统首先为被调用方法的形参分配内存空间,并将实参的值按照位置一一复制到形参中。 之后,被调用方法中形参值的任何改变都不会受到影响。 对应的实际参数;
引用传递时,系统并不复制实参本身的值传递给形参,而是将其引用值(即地址值)传递给形参。 因此,形参引用的地址处的变量与传递的变量是相同的。 实参是相同的,方法体中相应形参值的任何改变都会影响作为引用传递的实参。
简而言之,按值传递并不意味着值参数是值类型,而是形参变量会复制实参变量,即在堆栈上额外创建一个相同的变量。 通过引用传递则不然。 您可以使用 ref 和 out 来确定参数是否通过引用传递。
10.C#中传递参数时ref和out有什么区别?
(1) ref指定的参数在函数调用时必须首先初始化,而out则不需要。 (2)out指定的参数在进入函数时会自行清除,因此必须在函数内部进行初始化赋值操作,但不需要使用ref。 总结: ref 可以将值传入方法,也可以将值传出方法; out 只能在方法外部传递值。 注意:作为特殊的引用类型,其操作与值类型一致。 如果要在方法内部传递形参,则在将赋值结果传递出去时,需要加上ref或者out关键字。
11.C#中什么是装箱和拆箱?
装箱:将值类型转换为引用类型 拆箱:将引用类型转换为值类型 装箱:在堆上为值类型分配一个对象实例,并将值复制到新对象。 (1) 第一步:新分配托管堆内存(大小为值类型实例的大小加上方法表指针。 (2) 第二步:将值类型的实例字段复制到新分配的内存中。 (3 ) 第三步:返回新分配的对象在托管堆中的地址,这个地址是对象的引用。
拆箱:检查对象实例以确保它是给定值类型的装箱值。 将实例中的值复制到值类型变量中。 装箱时不需要显式类型转换,但拆箱时需要显式类型转换。 int i = 0;。 对象=我; //这个过程就是拳击! 只是框我! int j=(int)obj;//此过程obj拆箱!
12、C#实现多态过程中重载和重写有什么区别?
重写和重载之间的区别。 重载是一个同名的方法。 如果参数或参数类型不同,满足不同需求的多重重载就是重写基类中的函数。 实现多态性。 重载:方法名称相同但参数或参数类型不同; 重载是一个面向过程的概念。 重写:重写基类中的虚方法。 重写是一个面向对象的概念。
13.C#中关键字的作用是什么?
类的有意义的字段和方法用关键字修饰,称为静态成员,通过类名加访问运算符“.”来访问; 类实例的有意义的字段和方法没有经过关键字修饰,称为非静态成员。 成员或实例成员。 注意:静态字段在内存中只有一份副本,而非静态字段在每个实例对象中都有一份副本。 无论该方法是否静态,在内存中都只会有一份副本。 唯一的区别在于是通过类名还是实例名来访问。
14、C#中成员变量和成员函数前缀的作用是什么?
它们被称为常成员变量和常成员函数,也称为类成员变量和类成员函数。 分别用来反映班级的状态。 例如,类成员变量可以用来统计类实例的数量,而类成员函数则负责这样的统计动作。 无需使用新的
15.请描述C#中索引器的实现过程。 只能根据数字来索引吗?
C# 可以通过提供索引器来处理数组等对象。 特别是对于属性,每个元素都通过 get 或 set 方法公开。 索引器不仅可以索引数字(数组下标),还可以索引一些字符串。 因此,一般来说,C#中一个类通常只有一个索引器,就是THIS,但也可以有无数个,只要你的参数列表不同,索引器与返回无关价值。 索引器最大的好处就是让代码看起来更自然,更符合实际的思维模式。 来自微软的官方示例:索引器允许以与数组相同的方式对类或结构的实例进行索引。 索引器与属性类似,只是它们的访问器采用参数。 在以下示例中,定义了一个泛型类,并提供了简单的 get 和 set 访问器方法(作为分配和检索值的方法)。 类创建该类的一个实例来存储字符串。
16.C#中的类和类有什么区别?
类声明抽象类抽象方法。 如果一个类有抽象方法,那么这个类就是抽象类。 所谓抽象方法不包含主体(不提供实现方法),必须由继承者重写。 因此,抽象类是不可实例化的,只能通过继承被子类覆盖。
声明接口仅提供一些方法规范。 它在 C#8 之前的版本中不提供任何实现。 C#9版本还可以支持接口的实现; 它不能被修改等,并且没有字段、常量和构造函数。
两者的区别:
1. 中不能有字段,但类可以有; 2. 中不能有其他修饰符,但类可以有。 3.可以实现多重继承。
17.C#中修饰类有什么特点?
被封印,无法继承。
18、字符串中str=null、str=""和str=.Empty的区别
.Empty 相当于“”,Empty 是静态只读字段。 str="",初始化对象,并分配空字符串的内存空间 str=null,初始化对象,不分配内存空间
19.byte b = 'a'; 字节c = 1; 字节 d = 'ab'; 字节 e = '啊'; 字节 g = 256; 这些变量有哪些错误?
这道题测试的是数据类型可以携带的数据大小。 1byte=8bit,1个汉字=2个字节,1个英文字符=1个字节=8bit,所以bc是对的,deg是错的。 'a' 是字符类型。 java中一个错误字节的取值范围是-128~127,而C#中一个字节的取值范围是0~255
20. 和的区别,两者性能对比
它们都是参考类型。 堆上分配的默认容量为 16,这允许扩展其封装的字符串中的字符数。 每个对象都有一定的缓冲容量。 当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。 对于简单的字符串串联操作,性能可能并不总是比字符串好,因为对象的创建也消耗了大量的性能。 在字符串串联相对较少的情况下,过度滥用会导致性能的浪费而不是节省。 仅考虑使用大量不可预测的字符串操作。 从最后分析可以看出,如果是字符串拼接次数比较少的话,根本不会有太大区别。使用时最好设置一个合适的容量值,否则会出现容量不足而内存分配将被频繁执行。
21.什么是扩展方法?
用一句话来解释,扩展方法使你能够在不修改类型条件的情况下向现有类型“添加”方法:根据扩展方法必须满足的条件,1.它必须是静态类中的静态方法2.第一个参数的type是要扩展的类型,需要添加this关键字来标识为扩展方法。 建议:一般情况下,只有在万不得已的情况下才实现扩展方法,并谨慎实现:不能通过类名调用,而是直接使用类型调用。
22.有什么特点? 如何使用?
特征和属性是两个完全不同的概念,但名称相似。 特征是与目标对象关联的一条配置信息。 它本质上是一个为目标元素提供关联附加信息的类。 这些附加信息存储在dll内部的元数据中,本身没有任何意义。运行时使用反射来获取附加信息
23.什么是应用程序域()
由公共语言运行时围绕在同一应用程序范围内创建的对象(即从应用程序入口点开始的对象激活序列中的任何位置)建立的边界。 应用程序域有助于将一个应用程序中创建的对象与其他应用程序中创建的对象隔离开来,以便运行时行为是可预测的。 单个进程中可以存在多个应用程序域。 应用域可以理解为一个轻量级的进程。 发挥安全作用。 它占用很少的资源。
24.byte a =255;a+=5;a的值是多少?
byte的取值范围是-2的8次方到2的8次方-1、-256到258。当a+=1时,a的值为0。当a+=5时,a的值为0,所以a+=5,值为4
25.const和const有什么区别?
可以识别一个常数。 主要区别如下: 1、初始化位置不同。 const 必须在声明的同时赋值; 即可以在声明时赋值; 2、修改的对象不同。 const 可以修改类的字段或局部变量; 它只能修改类的字段。 3、const是编译时常量,其值是在编译时确定的; 它是一个运行时常量,其值在运行时确定。 4、const默认是静态的; 如果设置为静态,则需要显示声明。 5、修改引用类型时不同。 const只能修改值为null的其他引用类型; 它可以是任何类型。
26. 分析以下代码。 a和b的值是多少?
string strTmp = "a1某某某";
int a = System.Text.Encoding.Default.GetBytes(strTmp).Length;
int b = strTmp.Length;
分析:一个字母或数字占一个字节,一个汉字占两个字节,所以a=8,b=5
27.=new(“xyz”);创建了多少个?
有两个对象,一个是“xyz”,另一个是指向“xyz”的引用对象s。
28.C#可以直接操作内存吗?
C#在模式下可以使用指针来操作内存,但在托管模式下不能使用指针。 默认情况下,C#NET 不使用指针运行。 您需要通过右键单击项目 - >属性 - >选择生成 - >“允许”不安全代码”检查 - >保存来设置它
29. 什么是强类型,什么是弱类型? 哪一个更好? 为什么?
强类型是在编译时确定类型的数据,并且在执行期间不能更改类型,而弱类型仅在执行时确定类型。 没有好坏之分,都有各自的优点,强类型安全,因为已经提前确定了,而且高效。一般用在编译型编程语言中,如c++、java、c#等。弱类型是相对不安全,运行时容易出错,但比较灵活,多用于解释型编程语言,如etc。
30.Math.Round(11.5)等于什么? Math.Round(-11.5) 等于什么?
Math.Round(11.5)=.Round(-11.5)=-12
31.&和&&的区别
相似点:&和&&都可以用作逻辑与运算符,表示逻辑与(与)。 当运算符两边表达式的结果都为真时,结果为真。 否则,只要一侧为假,则结果为假。 (ps:使用逻辑AND时,&无意义,&本身不用于此)
不同的是 if(!=null&&.(.))&& 有一个短路功能,即如果第一个表达式为 false,则不再计算第二个表达式。 对于上面的表达式,当为null时,后面的表达式不会被执行,所以&&改成&也不会抛出异常。 (ps:所以当使用逻辑AND时,&是没有意义的)
& 用于按位运算。
总结 & 是位运算,返回结果为 int 类型 && 是逻辑运算,返回结果为 bool 类型
32.i++和++i有什么区别?
1.i++先赋值后递增; ++i 先递增,然后赋值。 2.i=0,i++=0,++i=1; .(++i==i++); 结果是真的
33.as和is的区别
as 确定转换时的兼容性。 如果无法执行转换,则返回 null(不生成新对象)。 判断as转换是否成功的依据是是否为null。 只进行类型兼容性判断,不进行实际类型。 转换返回 true 或 false。 如果对象为 null,也会返回 false。 as 比 is 更高效,因为只需要进行一次类型兼容性检查
34.谈谈final和final的区别。
Final:不能作为父类继承。 一个类不能既被声明为final,又被声明为。 :在 try{}catch{}{} 结构中使用,以在异常处理期间执行任何清除操作。
35.C#成员修饰符简述
:表示该方法或属性未实现。
const:指定域或局部变量的值不能改变。