这才是你需要的最基础的.Net基础面试题(通俗易懂,最基础的.Net)

由于小编能力有限,这里的解释大多都是小编自己百度然后自己理解的
可能有的地方会有错误欢迎评论私信我更改

一群热爱技术并且向往优秀的程序猿同学,不喜欢水文,不喜欢贩卖焦虑,只喜欢谈技术,分享的都是技术干货。Talk is cheap. Show me the code

在这里插入图片描述

1. Linq查询,lambda表达式

LINQ(Language Integrated Query,语言集成查询)提供了一种跨数据源和数据格式的统一模型,实现查询。主要包括三个部分:LINQ to ObjectsLINQ to XMLLINQ enabled ADO.NET
而在LINQ enabled ADO.NET中又包括LINQ to DataSetLINQ to SQLLINQ to Entities
Lambda 表达式”是一种简化的匿名函数,在C#3.0中引入的,可用于创建委托或表达式目录树。也可以将 Lambda 表达式作为参数或者返回值使用。它的语法形式是: 输入参数 => 表达式或语句块,其中,=> 读作“goes to”,在LINQ查询中大量的使用到。

2. C#中的垃圾回收机制。

GC就是垃圾回收器,一般来说系统会自动检测不会使用的对象或变量进行内存的释放,不需要手动调用,用 Collect() 就是强制进行垃圾回收,使内存得到及时的释放,让程序效率更高。

3. Linq查询的优势。

无需复杂学习过程即可上手。  
编写更少代码即可创建完整应用。   
更快开发错误更少的应用程序。   
无需求助奇怪的编程技巧就可合并数据源。
让新开发者开发效率更高。   
任何对象或数据源都可以定制实现Linq适配器,为数据交互带来真正方便。

4. 面向对象的主要思想包括什么?

在面向对象中,一切皆为对象,面向对象的三大特征:
1)封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行操作。。
2)继承:继承可以解决代码复用问题,子类可以沿用父类方法和属性的一种方式。
3)多态:继承同一父类的不同子类,对父类方法的不同实现。分为方法的隐藏和重写。

5. C#中的接口和抽象类有什么异同?

从形态层面上:
相同点:抽象类和接口的都是抽象的,不能实例化,需要子类实现其抽象成员。
不同点:
1)抽象类是类的部分实现,可以包含已实现的成员,而接口不能包含任何成员的实现。
2)抽象类与普通类一样,可以继承类和实现接口,而接口只能继承接口,不能实现接口。
从设计层面上:
不同点:
1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
2)抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。
3)抽象类一般作为父类使用,和实现类往往属于同一类事物,而接口和实现类则不然,只是一种实现关系,例如:演员和角色的关系。

6. 什么是装箱和拆箱?

装箱就是把值类型到引用类型的转换
拆箱就是引用类型到值类型的转换

7. 简述 private、protected、internal 、public 修饰符的访问权限。

private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
internal: 在同一程序集内可以访问。
public : 公共成员,完全公开,没有访问限制。

8. C#中的委托是什么?事件是不是一种委托?

C#中的委托是一种引用类型,表示具有相同方法签名的方法的引用。类似于函数指针,也就是说它们是指向函数的“引用”,更加安全。
事件不是委托,是委托类型的变量。

9. .NET的错误处理机制是什么?

简述一下try-catch,try里面放入可能发生异常的代码,catch里面放入如果发生异常要执行的代码,finally里面放入不管是否发生异常,都要执行的代码

一般来说,为了在.NET Framework中处理可能的错误,会采用try-catch-finally这样的代码结构,其中,try块包含了程序正常的操作部分,但可能会出现异常,catch块包含的代码用于处理try中产生的异常,而finally块主要用于清理资源或执行要在try块或catch块末尾执行的其他操作,值得注意的是,无论是否产生异常,finally块中的代码总是要执行的。
在.NET中提供了许多预定义的异常类,所有的异常类都是派生于Exception类,只有当产生的异常与catch块中声明的异常类型匹配时,才能对异常进行处理。若catch块不能处理当前的异常,则会默认向方法的调用上一层抛出异常,层层上抛,直到找到匹配的catch块为止,若不存在匹配的catch块,则程序将异常终止。

10. 线程和进程的区别

最根本区别:进程是操作系统资源分配的基本单位,而线程是CPU调度和执行的基本单位
1)在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,线程之间切换的开销小。
2)所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
3)内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。
4)包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

11. WCF、WPF、WF、WebServices 简述

WCF:Windows Communication Foundation,是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。它是.NET框架的一部分,由 .NET Framework 3.0 开始引入。整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。是Windows平台上开发分布式应用最佳的实践方式。
WPF:Windows Presentation Foundation,WPF是微软新一代图形系统,运行在.NET Framework 3.0架构下,为用户界面、2D/3D 图形、文档和媒体提供了统一的描述和操作方法。
WF: Windows Workflow Foundation,它是微软在.NET3.0之后推出的一套工作流开发框架,其主要的目的在于为现有的.NET应用程序嵌入工作流应用。
WebService:一种跨编程语言和跨操作系统平台的远程调用技术。
1)远程调用,就是一台计算机的应用可以调用其他计算机上的应用。
2)跨编程语言:是指服务端、客户端程序的编程语言可以不同
3)跨操作系统平台:是指服务端、客户端可在不同的操作系统上运行
例如:支付宝,支付宝并没有银行卡等数据,它只是去调用银行提供的接口来获得数据。还有天气预报等,也是气象局把自己的系统服务以WebService服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能。

12. int[][]myArray3=new int[3] []{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}};myArray3[2][1]的值是

int[][]myArray3=new int[3] []{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}};myArray3[2][1]

答案:2

13. 启动一个线程主要用什么方法_______

创建Thread实例并调用Start方法启动线程

14. 能用foreach遍历访问的对象需要实现 ______ 接口或声明____方法的类型。

能用foreach遍历访问的对象需要实现 IEnumerable 接口或声明GetEnumerator 方法的类型

15. 请叙述const与readonly的区别。

(const是静态的,必须要初始值,readonly可以用常量去赋值,可以不初始化 )

const为静态常量,所谓静态常量就是在编译期间会对变量进行解析,再将常量的值替换成初始化的值。
readonly为动态常量,所谓动态常量就是编译期间会将变量标记只读常量,而不用常量的值代替,这样在声明时可以不初始化,可以延迟到构造函数初始化。

16. c#中的三元运算符是什么

C#中有一个三元运算符”?:”,语法为:条件表达式?表达式1:表达式2;
该操作首先求出条件表达式的值(bool类型),为true时调用表达式1,为false时调用表达式2。其逻辑为:”如果为真执行第一个,否则执行第二个。”

17. 当整数a赋值给一个object对象时,整数a将会被什么?

装箱(从值类型变成引用类型)

18. public static const int A=1;这段代码有错误么?是什么?

const成员都是static所以应该去掉static

19. 利用operator声明且仅声明了==,有什么错误么?

 public void TestFunc()
        {
            Complex complex1 = new Complex();
            Complex complex2 = new Complex();
            //进行+操作
            var s = complex1 + complex2;
        }


    }
    public class Complex
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public Complex()
        {

        }
        
        // 必须在当前类中定义
        //operator在这里定义,我们的类就可以进行+操作,
        public static Complex operator +(Complex a, Complex b)
        {
            return new Complex() { Name = a.Name + b.Name, Age = a.Age + b.Age };
        }
        //这个是进行-操作
        public static string operator -(Complex a, Complex b)
        {
            return null;
        }
        //public static Boolean operator ==(Complex a, Complex b)
        //{
        //    return true;
        //}
        //public static Boolean operator !=(Complex a, Complex b)
        //{
        //    return false;
        //}
        //public override bool Equals(object obj)
        //{
        //    return base.Equals(obj);
        //}
        //public override int GetHashCode()
        //{
        //    return base.GetHashCode();
        //}
    }
}
重载了==就必须重载 “!=”
有==就要有!=    不能缺少

20. 委托声明的关键字是什么?

delegate
委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值.
委托的定义格式(封装命名方法或匿名方法)

public delegate void TestDelegate(string message);

一个Demo
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
 
namespace CsharpConsoleApplication
{
    public delegate void MyVoidDelegate();//声明一个没有参数没有返回值的委托函数
    public delegate bool MyStringDelegate(string str);//声明一个参数为string类型,返回值为bool类型的委托
    class Program
    {
        static void Main(string[] args)
        {
 
            MyVoidDelegate delvoid = new MyVoidDelegate(Who);//Who函数必须是无返回值且无参数
            delvoid();//委托的调用
            MyStringDelegate delstr = MyName;//MyName 函数必须是返回值为bool类型且参数是string类型
            delstr("小明");//委托的调用
            System.Console.ReadLine();
 
        }
        static void Who()
        {
            System.Console.WriteLine("我是中国人");
        }
 
        static bool MyName(string name)
        {
            System.Console.WriteLine("我叫"+name);
            return true;
        }
 
    }
 
}

21. 用sealed修饰的类有什么特点?

该类为密封类,不可被继承

22. 在.Net中所有可序列化的类都被标记为什么?

使用Serializable特性标记

23. 下面的代码中有什么错误吗?

using System;
class A
{
public virtual void F(){
Console.WriteLine(“A.F”);
}
}
abstract class B:A
{
public abstract override void F();
}

答案:abstract override 是不可以一起修饰方法
父类中有abstract,那么子类同名方法必定有override,若父类中有 virtual方法,子类同名方法不一定是override,可能是overload。

24. 请解释接口的显式实现有什么意义?

//这种方式是隐示实现:
public interface IReview
{
void GetReviews();
}
public class ShopReview :IReview
{
public void GetReviews(){}
}

IReview rv = new ShopReview(); rv.GetReviews();
ShopReview rv = new ShopReview(); rv.GetReviews();
都可以调用GetReviews这个方法。
还有一种方式是显示实现:
public interface IReview
{
void GetReviews();
}
public class ShopReview :IReview
{
void IReview.GetReviews(){}
}
通过这种方式的接口实现。GetReviews就只能通过接口来调用:
IReview rv = new ShopReview(); rv.GetReviews();
下面的这种方式将会编译错误:
ShopReview rv = new ShopReview();rv.GetReviews();

//  结论:
//  隐示实现接口和类都可以访问
//  显示实现只有接口可以访问。

显式实现接口:实现类在实现接口中方法时,方法名前必须添加接口名,且不能添加访问修饰符。在调用时,显式实现接口的方法只能通过接口访问,不能通过类访问。
这样做的好处:
1)若一个类实现接口,而接口中的方法只需要在类的内部实现,则可以使用显式实现接口的方式,这样类的实例这无法使用该接口成员。
2)显式接口成员可以避免了成员之间因为同名而发生混淆。如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,这就必须要使用到显式实现接口方式。

25. 请解释.NET采用委托实现的事件模型与JAVA中采用接口实现的事件模型有什么区别,

.net中的委托概念java中没有相同的,只有事件模式是一样的,java中有一个叫Obserable接口,可以添加IEventListener,使用内部类可以构建类似于委托的概念

26. 请解释ASP.NET中button linkbutton imagebutton 及hyperlink这四个控件之间的功能区别?

Button是按钮控件,具有按钮所有的属性和事件方法,在客户端被渲染为表单元素提交按钮。
Linkbutton是链接按钮,用于创建超链接样式的按钮。该控件的外观与 HyperLink 控件相同,但其功能与 Button 控件一样。它的主要作用是就是在ASP.NET页面中显示一个超链接。当点击链接时,页面就会往服务器端传递信息,并且在服务器端来处理相应的事件。在客户端被渲染为超链接以及一段用于提交数据的JS代码。
ImageButton 是图片按钮,它以一张图片来代替按钮,来执行按钮的功能,显示为图片,具有按钮的所有功能,在客户端被渲染为表单元素图片按钮。
Hyperlink是超链接控件,用于创建超链接,点击超链接可以使用户转移到同一页面的不同部分或另一个页面.不具有按钮的功能。

27. override与重载的区别

Override:方法重写,子类对父类中的方法进行重新实现,要求,父类与子类之间、方法名和参数类型,数量,顺序一致。在C#允许子类对父类的抽象方法或虚方法进行重写,以适应新的需求。
重载:在同一类中,存在多个具有相同方法名,而不同参数列表的方法,在调用时根据实际参数确定执行哪个重载方法。
28. 请描述一下ref和out在方法参数传递上的异同点?Ref和out

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace aaa
{
    class Program
    {
        static void Main(string[] args)
        {
            int age = 22;//传递给ref定义参数的方法,所以必须赋初始值。
            A a = new A();
            a.GetStr(ref age);
            Console.WriteLine(age.ToString());//导致参数按引用传递,所以目标函数会直接更改这个数字。
            int year;传递给out定义参数的方法,不需要赋初始值。
            a.GetTest(out year);
            Console.WriteLine(year.ToString());//导致参数按引用传递,所以目标函数会直接更改这个数字。
            Console.Read();
        }
    }
    public class A
    {
        //传入的值必须是初始化的,
        public void GetStr(ref int i)
        {
            i = 0;//ref修饰,可以修改也可以不改。
        }
        //传进来的值可以是未初始化的
        public void GetTest(out int i)
        {
            i = 100;//out修饰,必须在退出此方法前为out修饰的变量i赋值。
        }
    }
}

ref和out:
相同点
1)在实参和形参上都必须添加关键字
2)在方法中对参数的设置和改变将会被保留。
不同点
1)ref修饰的参数在方法调用前必须初始化,而out修饰的参数在方法调用时候可以不初始化。
2)在方法中out修饰的参数必须进行赋值,而ref修饰的参数不需要。
3)out修饰的参数主要用于返回值,ref修饰的参数主要用于修改。

29. 请指出GAC的含义

就是一个缓存,我们可以把某些需要的东西放入缓存,在运行一些程序可以直接用,而不需要把每一个需要的东西,都放到运行程序的目录下。
GAC:Global Assembly Cache,全局程序集缓存,它的作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Data、System.Windows.Forms等等。这样,很多程序就可以从GAC里面取得Assembly,而不需要再把所有要用到的Assembly都拷贝到应用程序的执行目录下面。举例而言,如果没有GAC,那么势必每个WinForm程序的目录下就都要从C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705下面拷贝一份System.Windows.Forms.dll,这样显然不如都从GAC里面取用方便,也有利于Assembly的升级和版本控制。GAC中的所有的Assembly都会存放在系统目录"%winroot%\assembly下面。放在系统目录下的好处之一是可以让系统管理员通过用户权限来控制Assembly的访问。

30. 请指出.NET中所有类型的基类

.Net中所有类型的基类是System.Object

31. 请列出C#中几种循环的方法,并指出他们的不同

for:一般用于循环次数已知的循环
while: 一般用于循环次数未知的循环,工作原理:先判断后执行
do…while:一般用于循环次数未知的循环,工作原理:先执行一次后判断
foreach:当一个序列实现IEnumerable接口或者GetEnumerator()方法时,可以用该循环方法,一般用于遍历集合或数组,更加安全。

32. 用C#实现以下功能:产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复

namespace Wolfy.RandomDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] result = GetRandom(100);
            for (int i = 0; i < result.Length; i++)
            {
                Console.WriteLine(result[i]);
            }
            Console.WriteLine("over:" + result.Length);
            Console.Read();
        }
        /// <summary>
        /// 获得无重复随机数组
        /// </summary>
        /// <param name="n">上限n</param>
        /// <returns>返回随机数组</returns>
        static int[] GetRandom(int n)
        {
            //容器A和B
            int[] arryA = new int[n];
            int[] arryB = new int[n];
            //填充容器a
            for (int i = 0; i < arryA.Length; i++)
            {
                arryA[i] = i + 1;
            }
            //随机对象
            Random r = new Random();
            //最后一个元素的索引 如n=100,end=99
            int end = n - 1;
            for (int i = 0; i < n; i++)
            {
                //生成随机数 因为随机的是索引 所以从0到100取,end=100
                      //一个大于等于 minValue 且小于 maxValue 的 32 位带符号整数,即:返回的值范围包括 minValue 但不包括 maxValue。
                //如果 minValue 等于 maxValue,则返回 minValue
                //
                int minValue = 0;
                int maxValue = end + 1;
                int ranIndex = r.Next(minValue, maxValue);
                //把随机数放在容器B中
                arryB[i] = arryA[ranIndex];
                //用最后一个元素覆盖取出的元素
                arryA[ranIndex] = arryA[end];
                //缩减随机数生成的范围
                end--;
            }
            //返回生成的随机数组
            return arryB;
        }
    }
}

33. 简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。

WebService特点: 平台独立性(Platform-independent)、跨语言(只要能支持XML的语言都可以)以及穿透企业防火墙;Webservice是基于http的是无状态的;但是它的缺点也很明显,就是需要部署一台Web Server;而且速度比较慢;
.Net Remoting的特点是:用户既可以使用TCP信道进行二进制流方式通信,也可以使用HTTP信道进行SOAP格式的通信,效率相对WebService要高不少;Remoting可以用于有状态的情况;但是它的缺点也很明显,.Net Remoting只能应用于MS的.Net Framework之下。
使用场合:
如果互动双方都是支持.NET技术的环境,并且在操作系统上能提供一致的验证机制,而且很重视沟通双方作业的效率,就是.NET Remoting上场的时机。
相反的,如果沟通双方是异质环境,又或沟通的模式就是无状态的情况,持续进行的互动作业前后是没有关联的,Web Service就是理想选择了。

34. 根据线程安全的相关知识,分析以下代码,当调用test方法时i〉10时是否会引起死锁?并简要说明理由。

public void test(int i)
{
   lock(this)
 {
   if (i〉10)
   {
     i--;
     test(i);
   }
 }
}

不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object[引用传递],那么死锁会发生)

35. 根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写:

namespace test
{
public delegate void OnDBOperate();
public class UserControlBase : System.Windows.Forms.UserControl
{
public event OnDBOperate OnNew;
privatevoidtoolBar_ButtonClick(object sender,System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
if(e.Button.Equals(BtnNew))
{
//请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。
}
}
}
}
 

  if(   OnNew   !=   null   ){
                    OnNew( );
              }

36. NET Remoting 的工作原理是什么?

在Remoting中是通过通道(channel)来实现两个应用程序域之间对象的通信。首先,客户端通过Remoting,访问通道以获得服务端对象,再通过代理解析为客户端对象。这就提供一种可能性,即以服务的方式来发布服务器对象。远程对象代码可以运行在服务器上(如服务器激活的对象和客户端激活的对象),然后客户端再通过Remoting连接服务器,获得该服务对象并通过序列化在客户端运行。

37. 在.NET中,配件的意思是?

配件就是Assembly(程序集),程序集由程序集清单,类型元数据,MSIL代码和资源组成。

38. .NET中读写文件需要用到那些方法?他们的作用?

1)File类:
使用场合:当读写文件大小不大,同时可以一次性进行读写操作的时候使用
使用方式:不同的方式可以读写文件类型不一样。
ReadAllBytes() WriteAllByte():可以读写任意类型的文件
ReadAllLines() ReadAllText():只能读写文本类型文件
2)FileStream类:
使用场合:当读写大文件的时候使用,它可以自定义读写的数组大小
使用方式:一个流对象只能做一个事情:如果需要读和写那么就需要创建两个流
读取:将数据读取到数组
写入:将数组的数据再写入到文件
3)StreamReader/StreamWrite类:
使用场合:只能对文本文件进行读写操作
使用方式:它可以按行、按字符以及按块进行读取和写入

39. 在C#中有一个double型的变量,比如10321.5和122235401.21644,作为货币的值如何按各个不同国家的习惯来输出。比如美国用$10,321.50和$122,235,401.22而在英国则为£10 321.50和£122 235 401.22

System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-US");
//System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-GB");为英 国 货币类型decimal y = 9999999999999999999999999999m;
string str = String.Format(MyCulture,"My amount = {0:c}",y);

40. 在C#中using和new这两个关键字有什么意义,请写出你所知道的意义?

using 关键字有两个主要用途:
1)作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。
2)作为语句,用于定义一个范围,在此范围的末尾将释放对象。
在 C# 中,new 关键字可用作运算符、修饰符或约束。
1)new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。
2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。
3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。

41. 在下面的例子里,输出什么?

  using System;
  class A
  {
  public A()
  {
   PrintFields();
  }
   public virtual void PrintFields(){}
}
  class B:A
  {
    int x=1;
    int y;
    public B()
   {
      y=-1;
     }
     public override void PrintFields()
     {
      Console.WriteLine(“x={0},y={1},x,y);
     }

当使用new B()创建B的实例时,产生什么输出?
概述一下:
先调用父类构造方法,父类构造方法种调用了PrintFields(),这个方法被子类重写了
所以调用子类的PrintFields()方法,输出,
然后才会调用B的构造方法,y=-1这时的x=1,y=-1
详细:
创建子类对象时,先调用父类构造方法,再调用子类构造方法,当调用父类构造方法时,由于还未调用子类构造方法,因此,x=1,y=0,当调用父类构造方法时,在父类构造方法中将调用PrintFields()方法,而该方法为虚方法且被子类重写,由于目前为子类对象,因此,调用子类重写后的PrintFields()方法,故输出:X=1,Y=0。

42. 求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m

int Num = this.TextBox1.Text.ToString() ;
int Sum = 0 ;
for (int i = 0 ; i 〈 Num + 1 ; i++)
{
if((i%2) == 1)
{
Sum += i ;
}
else
{
Sum -=i ;
}
}
System.Console.WriteLine(Sum.ToString());
System.Console.ReadLine() ;

43. 描述一下C#中索引器的实现过程,是否只能根据数字进行索引?

不是。可以用任意类型。

44. NET中读写XML的类都归属于哪些命名空间?

答:System.Xml

45. CLR与IL分别是什么含义?

简述:
CLR是一个虚拟机,支持不同语言的互操作
IL是中间语言,所有的.Net源码都编译成IL,IL是CPU的指令集,运行时被编译器变成机器码,被解释执行

CLR:Common Language Runtime,公共语言运行时,是一套完整的、高级的虚拟机,它被设计为用来支持不同的编程语言,并支持它们之间的互操作。
IL,中间语言,也称MSIL,微软中间语言,或CIL,通用中间语言;所有.NET源代码在进行编译时都被编译成IL,IL独立于CPU的指令集,与平台无关。在应用程序运行时被即时(Just-In-Time,JIT)编译器处理成为机器码,被解释及执行。

46. 进程与程序的区别?

(1)进程是动态的,而程序是静态的。
(2)进程有一定的生命期,而程序是指令的集合,本身无“运动”的含义。没有建立进程的程序不能作为1个独立单位得到操作系统的认可。
(3)1个程序可以对应多个进程,但1个进程只能对应1个程序。进程和程序的关系犹如演出和剧本的关系。

47. 私有程序集与共享程序集有什么区别?

一个私有程序集通常为单个应用程序所使用,并且存储于这个应用程序所在的目录之中,或此目录下面的一个子目录中。
共享程序集通常存储在全局程序集缓存(Global Assembly Cache)之中,这是一个由.NET运行时所维护的程序集仓库。共享程序集通常是对许多应用程序都有用的代码库,比如.NET Framework类。

48. New有几种用法

在 C# 中,new 关键字可用作运算符、修饰符或约束。
1)new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。
2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。
3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。

49. 接口是否可继承接口?抽象类是否可实现接口?抽象类是否可继承类?

在C#中,接口可以继承接口,但不是实现接口,因为,接口中不能存在实现的成员。
抽象类与普通类无差异,只是不能被实例化而已,因此,抽象可以实现接口,也可以继承类,但抽象类一般作为父类使用。

50. 什么是类和对象以及关系?

对象:一种具有状态(属性)和行为(方法)的编程实体,用于描述现实世界的某个具体事物。
:具用一系列对象共同特征和行为的通用类型。
对象和类的关系
类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类,类描述了一组有相同属性和相同方法的对象。

51. 委托回调静态方法和实例方法有何区别?

当一个实例方法被调用时,需要通过实例对象来访问,绑定一个实例方法到委托必须同时让委托得到实例方法的代码段和实例对象的信息,这样在委托被回调时候.NET才能成功地执行该实例方法。委托内部的对象成员变量_target是一个指向目标实例的引用。当委托绑定静态方法时,内部的对象成员变量_target将会被设置成null,而当委托绑定实例方法时,_target将会设置成指向该实例方法所属类型的一个实例对象,当委托被执行时,该对象实例将被用来调用实例方法。

52. 什么是链式委托?

链式委托是指一个由委托串成的链表,当链表上的一个委托被回调时,所有链表上该委托的后续委托将会被顺序执行。在委托中存在内部的对象成员变量_prev,该指针指向委托链中的下一个委托。

53. GetHashCode方法有何作用什么时候会用该方法?

简述:
值类型的判断相等直接用==就可以,但是引用类型的必须要用到equals方法,
但是Equals会比较慢,我们可以先用HashCode来判断想不想等,HashCode相等的话,
我们可以用Equals方法进一步确定是不是相等,如果HashCode不相等,那么Equals肯定不相等

GetHashCode方法就是一个判断对象是否相等的快速检查器,当把一个对象添加到一个散列表中时,会先判断这个对象是不是在其中,因为散列表是不允许出现碰撞的。在判断时,并不是直接上来就调用Equals方法,而是会先调用GetHashCode方法,计算出待添加对象的一个散列值:
如果这个散列值不命中,那就说明这个对象一定不在散列中,可以添加;
如果这个散列值命中了,那也不能说明这个对象一定在散列中,因为可能散列值冲突了,所以,要继续调用Equals方法,来看看这个散列值命中的对象,到底在不在散列表里。

54. 委托是否可以有返回值?

委托可以是带有返回值的方法,但多于一个带返回值的方法被添加到委托链中时,程序员需要手动的调用委托链上的每一个方法,否则委托使用者将只能得到委托链上最后一个被执行方法的返回值。

55. 如何把一个Array复制到ArrayList里

foreach( object o in array ){
arrayList.Add(o);
}

56. 什么叫应用程序域?什么是受管制的代码?什么是强类型系统?

应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小
受管制的代码:unsafe:非托管代码。不经过CLR运行。
强类型系统 RTTI:类型识别系统。

57. C#中,string str = null与string str =““,请尽量用文字说明区别。(要点:说明详细的内存空间分配)

string str = null 是不分配内存空间,而string str = ““ 给它分配长度为空字符串的内存空间。

58. 概述反射和序列化

反射就是为了在程序的运行过程中动态的获取类的方法和属性, 优点就是可以实现动态创建对象和编译,体现出很大的灵活性,缺点是对性能有影响。
序列化是将对象状态转换为容易传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

59. 如何理解委托

委托是一种特殊的引用类型,允许将方法作为参数进行传递。
委托在使用过程中的一般步骤:类型定义、对象创建和方法绑定,方法调用。
委托是一种引用方法类型,一旦委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看作是对函数的抽象,是函数的‘类’,委托的实例将代表一个具体的函数。

60. C#中能使用指针吗,怎样使用指针?

能,我们可以使用unsafe关键词,开启不安全代码(unsafe code)开发模式直接操作内存,这样就可以使用指针了。

61. 概述三层结构体系?

表示层(UI),业务逻辑层(BLL),数据访问层(DAL)。

62. 列举一下你所了解的XML技术及其应用?

xml一般是用来做数据传输格式、软件配置的。可以用来做网页(xslt)、可以当作数据库、可以用于配置,用于保存静态数据类型,使用最多的是web Services和config。

63. 值类型和引用类型的区别?

C#数据类型分为两大类:值类型(数据存放在栈stack中)和引用类型(数据存放在堆heap中,地址存放在栈stack中)。值类型变量声明后,不管是否已经赋值,编译器为其分配内存。声明一个引用类时,只在栈中分配内存,用于存放地址,而并没有为其分配堆上的内存空间。

64. 构造器Constructor是否可以被继承?是否可以被Override?

Constructor不可以被继承,因此不能被重写(Overriding),但可以被重载(Overloading).

65. 是否可以继承String类?

因为String类是密封类所以不可以继承string类。

66. 当一个线程进入一个对象的方法后,其它线程是否可以进入该对象的方法?

取决于是否进行线程同步。如果进行了线程同步,只能一个线程进入。

67. 用最有效的方法算出2乘以8等于几?

2<<3(位运算速度极快,这里是把2扩大三次方,实则求2的四次方 )

68. C#是否可以对内存直接进行操作?

C#是可以对内存进行直接操作的,虽然很少用到指针,但是C#是可以使用指针的,在用的时候需要在前边加unsafe。

69. 什么是受管制的代码?

unsafe:非托管代码。不经过CLR运行。

70. sleep() 和 wait() 有什么区别?

sleep()方法是将当前线程挂起指定的时间。
wait()释放对象上的锁并阻塞当前线程,直到它重新获取该锁。

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

short s1 =1; s1 = s1 + 1;有错,
s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1=(short)(s1 + 1) 。short s1 = 1;s1 += 1正确。

72. 什么是虚函数?什么是抽象函数?

虚函数:可由子类继承并重写的函数。
抽象函数:规定其非虚子类必须实现的函数,必须被重写。

73. 什么是XML?

XML即可扩展标记语言,主要用来做数据传输格式、软件配置。

74. C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?

一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加性质

75. .net的错误处理机制是什么?

.net错误处理机制采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。

76. &和&&的区别

&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and).

77. 用Singleton如何写设计模式

//单例模式: static属性里面new ,构造函数private
public class Singleton{
//静态私有变量
private static Singleton singleton = new Singleton();
//私有构造方法
private Singleton(){
System.out.println("生成了一个实例!!!");
}
//外部类通过Singleton.getInstance()获取这个类的对象。
public static Singleton getInstance(){
return singleton;
}
}

78. 在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?

using 引入名称空间或者使用非托管资源
new 新建实例或者隐藏父类方法

79. String s = new String(“xyz”);创建了几个String Object?

两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。

PS:
我这里在多加一句,String s = “abc” 这句是创建了一个引用对象,堆并没有分配内存,而abc还是在字符串池里面

80. C#中,i++与++i,有什么区别?

i++是使用完 i 之后再使 i 加一
++i是在使用 i 之前便使 i 加一

81. 一列数的规则如下: 1、1、2、3、5、8、13、21、34… 求第30位数是多少,用递归算法实现。

 public class MainClass { 
    public static void Main(){  
Console.WriteLine(Foo(30));  
}
    public static int Foo(int i) {
      if (i <= 0) return 0;
      else if(i > 0 && i <= 2) return 1;
      else return Foo(i -1) + Foo(i - 2);
    }
    } 

82. 描述一下C#中索引器的实现过程,是否只能根据数字进行索引

C#通过提供索引器,可以像处理数组一样处理对象。特别是属性,每一个元素都以一个get或set方法暴露。索引器不单能索引数字(数组下标),还能索引一些HASHMAP的字符串,所以,通常来说,C#中类的索引器通常只有一个,就是THIS,但也可以有无数个,只要你的参数列表不同就可以了索引器和返回值无关, 索引器最大的好处是使代码看上去更自然,更符合实际的思考模式。

83. 什么是Code-Behind技术?

code-Behind技术就是代码后置,在ASP.NET中通过ASPX页面指向CS文件的方法实现显示逻辑和处理逻辑的分离,这样有助于web应用程序的创建。

84. int、DateTime、string是否可以为null?

int、DateTime不能,因为其为值类型,值类型不能为null,只有引用类型才能被赋值null。string可以为null。

85. 传入某个属性的set方法的隐含参数的名称是什么?

value,它的类型和属性所声名的类型相同。

86. string、String;int、Int32;Boolean、bool的区别

String、Int32、Boolean等都属于.Net中定义的类,而string、int、bool相当于C#中对这些类定义的别名。

87. 不是说字符串是不可变的吗?string s=“abc”;s="123"不就是变了吗?

String是不可变的在这段代码中,s原先指向一个String对象,内容是 “abc”,然后我们将s指向"123",那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"123",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。

88. 是否可以从一个static方法内部发出对非static方法的调用?

不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。

89. 说出一些常用的类、接口,请各举5个。

常用的类:StreamReader、WebClient、Dictionary<K,V>、StringBuilder、SqlConnection、FileStream、File、Regex、List
常用的接口:IDisposable、IEnumerable、IDbConnection、IComparable、ICollection、IList、IDictionary

90. 如果不用VisualStudio,用哪个命令行编译C#程序?

csc.exe。

91. 你对泛型了解吗?简单说明一下泛型的有什么好处?

泛型:“泛型”的字面意思就是广泛的类型。通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用 好处是——可以复用代码,降低耦合性,而且还提高了代码的可读性以及安全性。

92. DateTime.Parse(myString); 这行代码有什么问题?

有问题,当myString不能满足时间格式要求的时候,会引发异常,建议使用DateTime.TryParse()

93. XML 与 HTML的主要区别?

  1. XML是区分大小写字母的,HTML不区分。
  2. 在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略结束标记。在XML中,绝对不能省略掉结束标记。
  3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为结尾。这样分析器就知道不用 查找结束标记了。
  4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。
  5. 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。

94. 请简述结构和类的区别

1、类型不同:结构是一种值类型,而类是引用类型。
2、存储不同:结构使用栈存储,而类使用堆存储。栈的空间相对较小.但是访问效率相对较高.堆的空间相对较大.但是访问效率相对较低。
3、作用不同:类是反映现实事物的一种抽象,而结构体的作用只是一种包含了具体不同类别数据的一种包装,结构体不具备类的继承多态特性。
4、初始化不同:类可以在声明的时候初始化,结构不能在申明的时候初始化(不能在结构中初始化字段),否则报错。

95. 请解释一下IClonable

IClonable方法是实现深度复制的接口,实现它应该能深度复制一个对象出来。深度复制的特征的调用对象的构造方法,创建新的对象,包括创建对象中嵌套的引用对象的新实例。而Shadow复制则不同,是浅表复制,不重新创建新实例。浅表复制的实现是Object.MemberWiseClone().
深度复制(Deep Copy)与浅表复制(Shadow Copy)

96. 用接口或父类作为输入的参数有什么好处?返回值如果是接口是为了什么?

接口或父类作为参数,所有继承了此接口或父类的类都可以使用,即你给此方法传参数的时候,可以把继承了这个接口或父类的类的实例传给这个方法。可以一次性传入多种字段、方法等而不用定义多个形参,接口作为返回值,返回的是实现接口的对象。

  1. = 和 == 的区别?

是赋值运算符, ==是关系运算符,用于等值判断

98. 数组有没有length()这个方法?String 有没有length()这个方法?

数组是没有length()这个方法的,有length这个属性,可以计算数组的长度。
String是有length()这个方法的,用来计算字符串的长度。

99. 数组和泛型集合的区别

泛型集合只能放定义类型的元素,会自动增大,取出时不用做类型转换。
数组只能放定义类型的元素,不会自动增大,取出时不用做类型转换。

100.System.Object中有什么方法?有什么用?

1.ToString():是获取对象的字符串表示的一种快捷方式
2.Finalize():允许对象在垃圾回收该对象之前尝试并执行释放资源并执行其他清理操作
3.GetType():获取当前实例的确切运行时类型
4.GetHashCode():用作特定类型的哈希函数
5.构造函数方法:主要用来在创建对象时初始化对象

101.Linq中concat union intersect的区别

Concat :连接两个序列。
Union : 通过使用默认的相等比较器生成两个序列的并集。
Intersect : 通过使用默认的相等比较器对值进行比较生成两个序列的交集。

102.请问哈希表(hashtable)是如何存储数据的?

以哈希表的形式存储数据,数据的形式是键值对。

103…NET中的CTS、CLS和CLR

CLR公共语言运行库
CLS通用语言规范
CTS通用类型系统

104.NET和C#的区别

.NET一般指.Net Framework框架,是Microsoft为开发应用程序而创建的一个具有革命意义的平台,C#运行在.NET(CLR)上的,用于创建应用程序的一种高级编程语言。

105.设计模式有哪些?

1.单例设计模式
2.工厂设计模式
3.代理设计模式
4.观察者设计模式
5.适配器模式
6.原型模式

106.StringBuilder 和 String的区别?

String是不可变化的字符,它只能赋值一次,每一次内容发生改变,都会生成一个新的对象。
StringBuilder是可以变化的字符,每次操作都是对自身对象进行操作,而不是生成新的对象,其所占空间会随着内容的增加而扩充。

107.Linq与SQL语句的执行速度哪个更快?

SQL语句的执行速度更快

108.C#代码编译成中间语言有什么作用?

优点:一是可以实现平台无关性,既与特定CPU无关;二是只要把.NET矿建某种语言编译成IL代码,就实现.NET矿建中语言之间的交互操作。
IL是.NET矿建中的中间语言(Intermediate Language)的缩写。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页