C# 面试题及答案

  1. 分析以下代码

          

1  string str = "abc123中文汉字";
2 
3             int i = System.Text.Encoding.Default.GetBytes(str).Length;
4 
5             int j = str.Length;
6 
7             Console.WriteLine(i);
8 
9         Console.WriteLine(j);

 

答案:i=14;i=10;

2.请输出B.test()的输出结果

 1 class A
 2 {
 3 int i = 1;
 4 public virtual void M1()
 5 {
 6 Console.WriteLine(" i am A ");
 7 }
 8 public void M2()
 9 {
10 Console.WriteLine(" i ={0} ",i);
11 }
12 }
13 
14 class B:A
15 {
16 int i = 2;
17 public override void M1()
18 {
19 Console.WriteLine(" i am B ");
20 }
21 public new void M2()
22 {
23 Console.WriteLine(" i ={0} ", i);
24 }
25 }
26 
27 static void Main(string[] args)
28 
29 {
30 
31 B b = new B();
32 A a = b;
33 a.M1();
34 b.M1();
35 a.M2();
36 b.M2();
37 
38 }

 

答案: i am B;

i am B;

1;

2;

3.有序集合seqList{1,1,2,3,5,8,13,21,34.........}请查找集合中第一个大于2147483647的数。

答案:此函数是有名的斐波那契数。实现此函数的方法为

 1 //递归写法
 2 public int foo(int n)
 3 {
 4 if(n<2) return 1;
 5 else return foo(n-2)+foo(n-1)
 6 }
 7 
 8 //循环写法
 9 public int[] foo2(int n)
10 {
11 if(n==1) return new int{1};
12 else if(n==2) return new int{1,1};
13 else
14 {
15 int rel[]=new rel[n];
16 rel[0]=1;
17 rel[1]=1;
18 for(int i=2;i<n;i++)
19 {
20     rel[i]=rel[i-2]+rel[i-1];
21 }
22 }
23 }

 

查找大于2147483647的数用二分法查找。

    private static int FibonacciSearch(int[] array, int key) {
        int length = array.Length;
        int low = 0, high = length - 1, mid, k = 0;
        mid=(low+high )/2
        while(mid<high)
{
   if(array[mid]==key){return mid;break;}
else if(array[mid]>key){high=mid;mid=(low+high )/2;}
else if(array[mid]<key){low=mid;mid=(low+high )/2;}
}
}

4.简述以下词在C#语言中的作用

volatile:(创建单例模式时会使用,懒汉模式)就像大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果不加入volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.,简单地说就是防止编译器对代码进行优化.比如如下程序:

1
2
3
4
XBYTE[2]=0x55;
XBYTE[2]=0x56;
XBYTE[2]=0x57;
XBYTE[2]=0x58;
对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。如果键入volatile,则编译器会逐一的进行编译并产生相应的机器代码(产生四条代码).原文引用https://www.cnblogs.com/lvdongjie/p/5469246.html
interlocked:为多个线程共享的变量提供原子操作(仅限int类型)。微软原文https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.interlocked?view=netframework-4.7.2    个人微博原文:https://www.cnblogs.com/Zachary-Fan/p/interlocked.html
monitor:lock:(lock是一种混合锁,相当于Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁的组合)详见原文https://www.cnblogs.com/chengxingliang/p/3150731.html
 
ReaderWriterLock:字面意思,读写锁,分为读锁和写锁,多个线程读一个对象, 而只有一个线程要写这个对象. 那么对于读线程来说, 它不改变对象的内容, 我们就应该允许多个线程同时读, 只有在写的时候才要给锁住对象. 这样可以提高读线程的吞吐量。详见原文 https://blog.csdn.net/changtianshuiyue/article/details/16943499
 
AutoResetEvent|   ManualResetEvent  字面意思为自动重置事件和手动重置事件,这两个类可以理解为设置信号,来进行阻塞线程或者让线程重新启动。上原文https://www.cnblogs.com/fangyz/p/5040206.html
 
Semaphore 信号量,通过计数器设置可以访问的线程数目例如设置为10,则可以同时有10个线程访问此资源,每当有一个线程访问此资源,则信号量减1,访问完成之后释放则加1,当信号量=0时禁止访问,阻塞线程,当信号量>0时,可以访问。原文https://www.cnblogs.com/tianzhiliang/archive/2010/08/31/1813635.html
 
Mutex   互斥量,嗯。。。说起来挺麻烦,还是看原文吧。https://www.cnblogs.com/suntp/p/8258488.html
 
5.MVC平台,网页设计textbox控件时,编辑代码有四种形式,以下已经写出了第一种,请写出后三种。
@using MvcViewModelTest.Models
1 //第一种 
2 <input id="tea_Name" name="tea.Name" type="text" value="马老师"/>
3 //第二种
4 @Html.TextBox("tea.Name",Model.tea.Name)
5 //第三种
6 @Html.TextBoxFor(m=>m.tea.Name)
7 //第四种
8 @Html.TextEditorFor(m=>m.tea.Name)

6.用一条SQL语句 查询出每门功课都大于80分的学生姓名,表结构如下

姓名   课程   分数  
张三 语文 81
张三 数学 75
张三 英语 82
李四 语文 76
李四 数学 90
李四 英语 82
王五 语文 81
王五 数学 100
王五 英语 92

 

 

 

 

 

 

 

 

答案一:select 姓名 from 表 where 姓名 not in (select 姓名 from 表 where 分数<=80)

答案二(推荐):select 姓名 from 表  group by 姓名 having min(分数)>80

7.简述Vue中methods、computed以及watch的用法及区别。

1#computed:计算属性将被混入到 Vue 实例中。所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例。

2#methods:methods 将被混入到 Vue 实例中。可以直接通过 VM 实例访问这些方法,或者在指令表达式中使用。方法中的 this 自动绑定为 Vue 实例。

3#watch:是一种更通用的方式来观察和响应 Vue 实例上的数据变动。一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每一个属性。
 官方API地址https://cn.vuejs.org/v2/api/#computed

个人博客:https://blog.csdn.net/smartdt/article/details/75557369

8.现有一个业务系统有4万用户,所有用户每天产生6千万数据,系统要求快速查询60天数据,请给出你的实现方案。

9.描述你曾经或者正在使用的大型项目解决方案。

10.何时必须声明一个类为抽象类?

答案:当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。

11.MVC框架中,ActionResult,JsonResult,ContentResult哪个可以return view()?

答案:ActionResult。

12.Aspx页面中,updatepanel的作用是什么?

答案:UpdatePanel控制页面的局部更新。(局部更新控件)、

13.MVC框架中,当使用Get方法访问JsonResult时,能否直接采用以下写法:return json(obj).为什么?

答案:不能,要使用 res.JsonRequestBehavior = JsonRequestBehavior.AllowGet;//允许使用GET方式获取,否则用GET获取是会报错。 

14.可以采用foreach迭代的类的对象必须满足什么条件?

答案:需要实现IEnumerable接口或声明GetEnumerator方法的类型。注:不一定要实现IEnumerable接口,但一定要实现GetEnumrator方法。

15.在dotnet环境下,如何把数据库数据转换为XML格式输出?

将数据库的内容读取到dataTable或dataSet中,dataTable或dataSet转为xml。

private string ConvertDataTableToXML(DataTable xmlDS) //DataTable可改用dataset
    {
        MemoryStream stream = null;
        XmlTextWriter writer = null;
        try
        {
            stream = new MemoryStream();
            writer = new XmlTextWriter(stream, Encoding.Default);
            xmlDS.WriteXml(writer);
            int count = (int)stream.Length;
            byte[] arr = new byte[count];
            stream.Seek(0, SeekOrigin.Begin);
            stream.Read(arr, 0, count);
            UTF8Encoding utf = new UTF8Encoding();
            return utf.GetString(arr).Trim();
        }
        catch
        {
            return String.Empty;
        }
        finally
        {
            if (writer != null) writer.Close();
        }
    }

 

16.Html页面上,有如下代码<input type="button"  name ="btndel" onclick="Del()"/>.现在要求用户点击删除后,弹出删除确认的对话框,并在点击确定后弹出对话框“”“删除完毕”,用JS如何实现。

答案:

1 function Del()
2 {
3 if(confirm("确定删除"))
4       alert("删除成功")
5 }

17.请写出一个json的例子。

答案:[{"id":"123","name":"huawei"}]

18.List<Domain1> Alist 中有100个Domain1元素,且每个Domain1元素都有属性string  typStr,现在需要取出AList中所有typeStr="Atype"的元素,并组成新的List,该如何实现。

答案:

1 List<string> BList=new List<string>();
2 foreach(var a in AList)
3 {
4 if(a.typeStr=="Atype")
5     Blist.add(a.typeStr);
6 }

19.EF框架中,使用DBFirst时数据库中的表A没有主键,能否通过“从数据库更新模型“操作,将表A导入到EF框架中。

答案:不能,表必须要有主键,否则会报错。

savechange()方法返回0,而不是正常的大于0的书。切记设置主键。

返回错误InnerException = {"无法更新 EntitySet“t_Customer”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持当前操作的 <InsertFunction> 元素。"}。

在发现错误后要吧原有的数据库的表删除,重新更新。如果不删除的话,无法更新,并且要重新生成解决方案。
20.foreach和for循环谁的效率高?switch和if呢?

答案:foreach高,for 循环每次都要进行判断i的大小,foreach 依赖 IEnumerable.第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a,以后每次再执              行 var a in GetList() 的时候 调用 MoveNext.直到循环结束。期间GetList()方法只执行一次.

        同样的道理:当有多个判断时,switch更快。

21.WebService基于什么协议?

 答案:soap协议,而Soap建立在http上的。

22.WebService和WebAPI 有什么不同。   

1、webservice是基于SOAP协议的,数据格式是XML,webapi遵循的http协议,它的Response可以被而Web API的MediaTypeFormatter转换成Json、XML 或者任何你想转换的格式。
2、webservice它只能部署在IIS上,而webapi可以寄宿在不同的宿主上(寄宿的本质就是利用一个具体的应用程序为Web Api提供一个运行的环境,并解决请求的接收和响应的回复),如Web Host,Self Host方式
3、webservice 也可以通过ajax访问。

4、webapi无状态,相对webservice更轻量级。webapi支持如get,post等http操作,并且对限制带宽的设备,比如智能手机等支持的很好。

这样对比的话webservice貌似并不好用。但是我们为什么要用它呢,理由如下:

1、很好的跨编程语言和跨操作系统
2、可移植性:传统的WebService只是利用了HTTP通道,进行独立的交互,但是这个交互协议可以移植到其他协议下运作

 

23.C#是否支持多重继承?

答案:不支持。多重继承指的是一个类可以同时继承多个类,比如A类继承自B类和C类,这就是多重继承。C#只能继承一个类,但是可以继承多个接口。

24.修饰符protected internal 的意思?

internal修饰的b在同一个项目中哪里都可以访问,而在另外一个项目中就不能访问,说明“同一程序集”指的是同一个项目;对于protected internal修饰的a在同一项目中哪里都可以访问,而在其它项目中只有在派生类可以访问,所以protected internal 修饰的成员变量是同一程序集或者派生类可以访问,也就是protected跟internal的并集,而不是交集。(被protected internal修饰的属性/方法只能在它的在同一个程序集(Assembly)中的子类被访问)查资料找到了两种说法,不知道哪种是对的,个人以为是第一种是对的。

25.bs架构下,可否声明一个静态的数据库连接对象,所有的业务类都引用该静态连接对象去访问数据库?

答案:一个静态的Sqlconnection来管理项目内所有的数据库连接在绝大部分场景是不合理的
(没说绝对不可行,在winform单线程项目中,这样做是没有问题的,因为操作者是一个用户,每个用户都有一份程序副本)
如果是多个用户提交的请求是
同一个AppDomain中的函数,方法(这种说话不严谨,不过我暂时找不到更好的表达方式)
来处理时.都是用同一个静态的Sqlconnection对象是不行的.
会引起并发问题,会引起相互干扰.还需要加锁lock才能操作.

26.C#提供了一个默认的无参数构造函数,当我实现了另外一个有一个参数的构造函数的时候,还想保留这个无参数的构造函数。这样我应该写几个构造函数?

答案:两个。

27.能够阻止某一个类被其他类继承么?能够实现允许某个类被继承,但不允许其中某个方法被覆写吗?

答案:(1)当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承,(2)可以,标记这个类为public,并标记这个方法为sealed.

28.什么是强类型?C#是强类型吗,JS呢?

答案:强类型指的是程序中表达的任何对象所从属的类型都必须能在编译时刻确定。常见的强类型语言有C++JavaApexPython等,C#是强类型,JS不是。

29.金额等精确的数值声明为什么类型?

答案:float,double,decimal

30.读写数据库都需要哪些对象,简要说明其作用。

答案1、 Connection:与数据源建立连接。
2、 Command:对数据源执行SQL命令并返回结果。
3、 DataReader:读取数据源的数据,只允许对将数据源以只读、顺向的方式查看其中所存储的数据。其常用于检索大量数据,DataReader对象还是一种非常节省资源的数据对象
4、 DataAdapter:对数据源执行操作并返回结果,在DataSet与数据源之间建立通信,将数据源中的数据写入DataSet中,或根据DataSet中的数据绑定数据源。
5、 DataSet:内存中的数据库,是数据表的集合,它可以包含任意多个数据表

31.通过程序控制GC的强制回收是否可以提高效率?

答案:个人以为是可以的(在网上没找到答案),GC是循环遍历所有资源的,如果你已经强制回收了,那么遍历的就会少,从而提高效率。

32.int?和int的区别。

答案:int?为可空类型,可以是null,他是通过把int装箱为引用类型实现的。

33.求数列(1,1,2,3,5,8,13。。。。)的和。

答案:见第三题的循环写法,定义一个变量为sum,sum+=arr[I]

34.BS架构下,在session中存储了一个datatable的对象y,y在什么时候会被GC回收?这种存储数据的方式是否合理?如果Application增加了对y的引用,什么时候会被GC回收?

答案:在session的生命周期结束之后回收,不合理,每个session储存在服务器端的内存里,每个用户都会有一个独立的session,如果session的内容过于复杂,当大量的用户访问的时候会导致内存溢出。Application是所有用户共有的,所以应该不会被回收(个人理解)

35.string和stringbuilder的区别。

答案:System.String是不可变的字符串。System.StringBuilder存放了一个可变的字符串,并提供一些对这个字符串修改的方法

36.举例写一个单例模式

 1 public class Singleton
 2     {
 3         private static Singleton _Singleton = null;
 4         private static object Singleton_Lock = new object();
 5         public static Singleton CreateInstance()
 6         {
 7             if (_Singleton == null) //双if +lock
 8             {
 9                 lock (Singleton_Lock)
10                 {
11                     Console.WriteLine("路过。");
12                     if (_Singleton == null)
13                     {
14                         Console.WriteLine("被创建。");
15                         _Singleton = new Singleton();
16                     }
17                 }
18             }
19             return _Singleton;
20         }
21     }

37.描述一下virtual、sealed、override和abstract的区别。

答案:

virtual申明虚方法的关键字,说明该方法可以被重写

sealed说明该类不可被继承

override重写基类的方法

abstract申明抽象类和抽象方法的关键字,抽象方法不提供实现,由子类实现,抽象类不可实例化。

38.List<int> listNumber,其中存储了从1到100的数字,现需要将ListNumber按照形如“1,2,3,4.。。”输出,请写出相应的代码。

1 foreach(var a in listNumber.sort())
2 {
3   Console.WriteLine(a);
4 }

39.int,string,hashtable,datetime,datatable中哪些是引用类型?

答案:string,hashtable,datatable

40.一棵二叉查找树(Binary Seach Tree)具有以下特点,树中的任一节点,如果左子树不为空,则左子树的所有节点的值都小于该节点的值,如果右子树不为空,那么右子树所有节点的值都大于该节点的值;任一个节点的左右子树都是二叉查找树,示意图如下

假设二叉查找树的节点定义如下:

1 Class BSTreeNode{
2 int value;
3 BSTreeNode leftChild;
4 BSTreeNode rightChild;
5 }

要实现一个方法printRang:按从小到大的顺序输出范围在【min,max】之间的所有值。请写出你认为最高效的代码。

 1 void printRang(BSTreeNode btsnode,int min,int max)
 2 {
 3 //中序遍历,大于min的输出,小于max的不输出
 5 //循环这里使用栈辅助进行遍历
 6 System.Collections.Generic.Stack<Tree> stack = new System.Collections.Generic.Stack<Tree>();
 7 while(btsnode != null || stack.Any())
 8 {
 9 if(btsnode.value>max)break;
10 else if (btsnode != null)
11                 {
12                      stack.Push(btsnode);
13                     btsnode = btsnode.Left;
14                 }
15                 else
16                 {
17                     var item = stack.Pop();
18                     if(item.Value>=min&&item.Value<=max)
19                           Console.WriteLine(item.Value);
20                     btsnode = item.Right;
21                 } 
23 }
24 }

41.请写出一段在多线程运行时有可能产生死锁(不需要一定产生)的代码。

 1 int string a="aaaa",b="bbbb";
 2 public void Seta(){
 3 lock(b)
 4 {
 5 a="bbbb";
 6 }
 7 }
 8 public void Setb(){
 9 lock(a)
10 {
11 b="aaaa";
12 }
13 }
14 
15   Thread t = new Thread(Seta);  
16   Thread.Sleep(5000);
17   t.Start();  
18   Thread t2 = new Thread(Setb);  
19   Thread.Sleep(5000);
20   t2.Start();  

42.假设你的编程语言提供这样的异步机制,把一个任务放在一个线程池中执行,当前线程继续执行,直到调用这个任务取返回值的方法时才阻塞并等待任务完成拿到返回值。

现在有这样一个场景,收到一个客户端的订单请求要检查商品的库存能否满足,查询该客户按照当前的价格策略能否享受订单的折扣才能接受订单,而这两个检查都是非常耗时的操作。原来的代码是这样的:

1 public booleanprocessOrder(Order order)
2 {
3 if(!checkCustomerprice(order))
4 return false;
5 if(!checkInventory(order))
6 return false;
7 //订单逻辑代码不需要关注
8 return true;
9 }

请用上述的异步机制改写这段代码,减小这个方法的响应延迟。

 1 //这里使用task
 2 Task<bool> task = new Task<bool>(() => checkCustomerprice());
 3 task.Start();
 4 bool result = task.Result;
 5 
 6 Task<bool> task2 = new Task<bool>(() => checkInventory());
 7 task2.Start();
 8 bool result2 = task2.Result;
 9 
10 if(result&&result2)
11    return true;
12 else 
13    return  false;
14 
15 //自己研究写的,不知道对不对,仅供参考

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

   public(公共的) 完全公开,访问不受限制。

   protected(保护的) 访问仅限于包含类或从包含类派生的类型。该类内部和继承类中可以访问。

   internal(内部的) 访问仅限于当前程序集。在同一命名空间内可以访问。

   protected internal(内部保护的) 访问仅限于从包含类派生的当前程序集或类型(待确定)。

   private(私有的) 访问仅限于包含类型。在类的内部才可以访问

44.ado.net的五个主要对象。答案见第30题。

45.列举asp.net页面之间传值的几种方式。

答案:

Request.Form["SourceData2"].ToString();
Request.QueryString["parameter1"].ToString();
 Context.Items["value"].ToString();还有cookie,session,application
46.C#中委托是什么?事件是不是一种委托?事件和委托的关系。
答案:委托是指向事件的一种函数指针,把事件转换为了一种引用类型的变量,可以让其他函数调用。(纯纯的个人理解,网上有不同答案,我也不知道哪个是对的,建议找出版的资料。)
47.override(重写)与重载overload的区别。
答案:override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法,
重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。
48.MVC模式。(我并没有完全GET到这个考点)
答案:MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
49.什么是装箱和拆箱?
答案:值类型转换为引用类型是装箱,引用类型装换为值类型是拆箱。
50.什么叫应用程序域AppDomain。
答案: "域",就是范围,环境,边界的意思,那么什么是应用程序域,官方给出的是这样的解释:操作系统和运行库环境通常会

在应用程序间提供某种形式的隔离.

     应用程序域为安全性、可靠性、版本控制以及卸载程序集提供了隔离边界。应用程序域通常由运行库宿主创建,

运行库宿主负责在运行应用程序之前引导公共语言运行库。

  应用程序域本质上就就是一种隔离,目的也就是使应用程序中运行的代码不能直接访问其他应用程序中的代码或资

源如果你需要访问其他应用程序中的对象时你就可以复制这些对象,或通过代理访问这些对象.

51.堆和栈的区别。

答案:heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的,引用类型储存在这。
stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的,值类型存储在这。
52.GC是什么,为什么要有GC?

答案;垃圾回收器,如果没有GC,那么一个系统随着运行时间的增长,占用内存会越来越大,如果我们没有主动释放的话。

53。值类型和引用类型的区别。

答案:

1.    值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的
地址。

2.     值类型存取速度快,引用类型存取速度慢。

3.     值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用

4.     值类型继承自System.ValueType,引用类型继承自System.Object

5.     栈的内存分配是自动释放;而堆在.NET中会有GC来释放      

6.      值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
7. 值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。

54.C#中的接口和类有什么异同。

不同点:

不能直接实例化接口。

接口不包含方法的实现。

接口可以多继承,类只能单继承。

类定义可以在不同的源文件之间进行拆分。

相同点:

接口、类和结构都可以从多个接口继承。

接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。

接口和类都可以包含事件、索引器、属性。

54.try{}里有一个return语句,那么紧跟在这个try后面的finally{}里的code会不会被执行。什么时候执行?

答案;会,在return 之前执行。

55.描述线程与进程的区别。

1.进程有自己独立的地址空间;而线程共享进程的地址空间;
2.一个程序至少有一个进程,一个进程至少有一个线程;

3.线程是处理器调度的基本单位,但进程不是;

4.二者均可并发执行

56.什么是反射?

答案:动态获取程序集信息,动态获取类的属性和方法。

57.什么是匿名方法?请写一段代码。

delegate(int i) { return i > 0; }

58.写出几种工作流产品或框架,并简要的对比他们的差异。

59.写出你所了解的设计模式,说一说使用设计模式带来的好处,并尝试用代码写出一个例子。

60.接受一个数组,找出两个数的索引,这两个数组相加之和等于指定的数字。找出一组即可,同一元素不可使用两次。

比如:nums=[2,7,11,15],目标数字是9,因为nums【0】+nums【1】=9,所以返回【0,1】

答案:最简单的方法是使用两个for循环,此种方法不给出代码了,下面是第二种算法,需要先进行排序,排序算法略。

 1 int[] getindex(int n)
 2 {
 3 int i=0,j=nums.length-1
 4 while(i<j)
 5 {
 6     if(nums[i]+nums[j]==n)break;
 7     else if(nums[i]+nums[j]>n)j--;
 8     else i++;
 9 }
10 int[] a=new int[]{i,j}
11 return a;
12 }

61.

SELECT * FROM 表 /*数据源*/
AS P
PIVOT 
(
    SUM(Amount/*行转列后 列的值*/) FOR 
    p.Month/*需要行转列的列*/ IN (1,2,3,4/*列的值*/)
) AS T

附注:列转行语句。测试语句

 1 CREATE TABLE ProgrectDetail
 2 (
 3     ProgrectName         NVARCHAR(20), --工程名称
 4     OverseaSupply        INT,          --海外供应商供给数量
 5     NativeSupply         INT,          --国内供应商供给数量
 6     SouthSupply          INT,          --南方供应商供给数量
 7     NorthSupply          INT           --北方供应商供给数量
 8 )
 9 
10 INSERT INTO ProgrectDetail
11 SELECT 'A', 100, 200, 50, 50
12 UNION ALL
13 SELECT 'B', 200, 300, 150, 150
14 UNION ALL
15 SELECT 'C', 159, 400, 20, 320
16 UNION ALL

 1 SELECT P.ProgrectName,P.Supplier,P.SupplyNum
 2 FROM 
 3 (
 4     SELECT ProgrectName, OverseaSupply, NativeSupply,
 5            SouthSupply, NorthSupply
 6      FROM ProgrectDetail
 7 )T
 8 UNPIVOT 
 9 (
10     SupplyNum FOR Supplier IN
11     (OverseaSupply, NativeSupply, SouthSupply, NorthSupply )
12 ) P

执行结果:

 

 62.描述new有两种用法

第一种:new Class():创建对象

第二种:覆盖方法

public new XXXX(){}

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

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

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

 1 using System;
 2 class A
 3 {
 4 public virtual void F(){
 5 Console.WriteLine("A.F");
 6 }
 7 }
 8 abstract class B:A
 9 {
10 public abstract override void F();
11 
12 //答:abstract override 是不可以一起修饰. 
13 } // new public abstract void F();

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

66.如何在C#中实现继承?也就是继承的格式

在类名后加上一个冒号,再加上基类的名称。

67.描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
答:不是。可以用任意类型.https://www.cnblogs.com/yaoxiaodan/p/5295132.html

68.私有成员会被继承么?

会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了.

69.C#中所有对象共同的基类是什么?

System.Object

70.在方法定义中,virtual有什么含意?

被virtual修饰的方法可以被子类覆写.

71.能够将非静态的方法覆写成静态方法么?

不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将virtual改为override

72.可以覆写私有的虚方法么?

不可以,甚至子类中无法访问父类中的私有方法

73.什么是抽象类(abstract class)?

一种不可以被实例化的类。抽象类中一般含有抽象方法,当然也可有具体实现。继承类只有实现过所有抽象类的抽象方法后才能被实例化.

74.接口(interface)是什么?

只含有公有抽象方法(public abstract method)的类。这些方法必须在子类中被实现.

75.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。

76.构造器Constructor是否可被override?
答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

77.是否可以继承String类?
答:String类是final类故不可以继承.

78.数组有没有length()这个方法? String有没有length()这个方法?
答:数组没有length()这个方法,有length的属性。String有length()这个方法(查网上资料说有个方法,但个人实验了一下是没有的,只有Length属性).

79.成员变量和成员函数前加static的作用?
答:它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。

80.c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 指令 和语句 new 创建实例 new 隐藏基类中方法。
答:using 引入名称空间或者使用非托管资源
new 新建实例或者隐藏父类方法

81.什么是虚函数?什么是抽象函数?
答:虚函数:没有实现的,可由子类继承并重写的函数。抽象函数:规定其非虚子类必须实现的函数,必须被重写。

82.c#中的三元运算符是?
答:?:

83.public static const int A=1;这段代码有错误么?是什么?
答:const不能用static修饰。

84.Ref参数是引用调用,out参数是输入调用。

85.constreadonly有什么区别?

const可以用于局部常量,而readonly实际是类的initonly字段,显然不能是局部的,const是编译时常量,readonly是运行时常量。

86.虚函数的用法:

答:1)virtual指明一成员函数为虚函数,而virtual仅用于类的定义里,在类外可不加此关键字. 

2)一个类的成员函数被定义为虚函数时,子类该函数仍保持虚函数特征.
3)子类覆盖此函数时,定义里可不加virtual关键字,但函数声明要和基类的完全一致!且此声明是必须的.
4)不是纯虚函数时,父类的虚函数必须要实现; 而若将父类的虚函数设定为纯虚函数时,子类必需要覆盖之而且必须要实现之!

87.解释virtualsealedoverrideabstract的区别

virtual申明虚方法的关键字,说明该方法可以被重写

sealed说明该类不可被继承

override重写基类的方法

abstract申明抽象类和抽象方法的关键字,抽象方法不提供实现,由子类实现,抽象类不可实例化

88.对象和类的区别是什么?

答:“类”(Class)具有相同属性和方法的一组对象的集合. 类是抽象的概念,仅仅是模板

对象是一个你能够看得到、摸得着的具体实体。

89.什么是局部变量,什么是成员变量?

答:局部变量是指一个方法中定义的变量;成员变量是指在类范围里定义的变量,也就是之前讲过的属性。

90.静态成员和实例成员的区别?

答:使用static修饰的成员称为静态成员,使用实例对象调用的成员称为实例成员

 

91.概述序列化

答: 序列化是将对象的状态存储到特定存储介质中的过程。

反序列化则是从特定存储介质中的数据重新构建对象的过程

 92.对象能否调用静态方法 ?

答:不能。对于类内部定义的静态变量及静态方法,该类的对象均不能调用。

93为什么不能指定接口中方法的修饰符?

答:接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。他们默认为公有方法。

94.请详述在.net中类(class)与结构(struct)的异同:

答:Class可以被实例化,属于引用类型,是分配在内存的堆上的,Struct属于值类型,是分配在内存的栈上的

95.接口和抽象类具有什么区别?

答:含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型

下面比较一下两者的语法区别:

1. 抽象类可以有构造方法,接口中不能有构造方法。

2. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

3. 抽象类中抽象方法可以指定为public,接口中抽象方法不能指定任何修饰符,默认就是public

4. 一个类可以实现多个接口,但只能继承一个抽象类。

96.base关键字的作用是什么?

答:子类继承父类的过程中,可能需要在子类中调用父类中的成员,如属性、方法或者构造方法。这个时候,可以使用base关键字来完成。base的作用是用于引用父类的成员,如属性、方法或者是构造方法

97.什么是抽象类?

答:抽象类不能创建实例,它只能作为父类被继承。抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象。从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类的随意性。

98.接口和抽象类两者在应用上的区别:

答:接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用

99.面向对象的特征有哪些方面?

答:面向对象的编程语言有封装、继承 、抽象、多态等4个主要的特征。

封装:

封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。

抽象:

抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类

继承:

子类继承父类成员,实现代码复用,提高了软件的可重用性和可扩展性。

多态:

不同子类对同一个消息作出不同的反映,提高软件灵活性

100.在C#中,string str=null string str= string.Empty与string str=“”请尽量使用文字或图象说明其中的区别。

答: string.Empty:不分配存储空间。"":分配一个长度为空的存储空间,""和String.Empty,这两个都是表示空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的。

101.Params是什么含义?

答:Params是C#中的关键字,采用此关键字可以指定参数数目为可变;在方法声明中的params关键字之后不允许任何其他参数,并且在方法声明中只允许一个params关键字。

102.float f=-123.567F; int i=(int)f;i的值现在是_____? 答:-123

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

答:属性:用于存取类的字段。特性:用来标识类,方法等的附加性质。

attribute:自定义属性的基类;property :类中的属性。

104.

posted @ 2019-04-16 00:21  周小杰  阅读(52869)  评论(6编辑  收藏  举报