c#面试题(1)笔试题
到11月15号之前,陆陆续续面试了多家公司,以下是各公司的笔试题,重复的就不说了,权当记录,方便明年的金三银四,适合初级的程序员,有错误欢迎指正
一.列举ASP.NET 页面之间传值的几种方式,优缺点?
①QueryString
优点:1.使用简单,对于安全性要求不高时传递数字或是文本值非常有效。
缺点:1.缺乏安全性,由于它的值暴露在浏览器的URL地址中 2 不能传递对象
使用方法:1.在源页面的代码中用需要传递的名称和值构造URL地址。
2.在源页面的代码用Response.Redirect(URL);重定向到上面的URL地址中。
url = "b.aspx?name=Carl" ; Response.Redirect(url);
3.在目的页面的代码使用Request.QueryString["name"];取出URL地址中传递的值。(a的值就是Carl)
string a = Request.QueryString["name"];
②Session
优点:1.使用简单,不仅能传递简单数据类型,还能传递对象。2.数据量大小是不限制的。
缺点:1.在Session变量存储大量的数据会消耗较多的服务器资源。2.容易丢失。
使用方法:1.在源页面:Session["Name"]="Value(Or Object)";
Session["Name"] ="Carl";
2.在目的页面。Result = Session["Name"]
name = Session["Name"].ToString();
注意:session不用时可以销毁它,销毁的方法是:清除一个:Session.Remove("session名"); 清除所有:Session.Clear();
③Cookie
优点:1.使用简单,是保持用户状态的一种非常常用的方法。比如在购物网站中用户跨多个页面表单时可以用它来保持用户状态。
缺点:1.常常被人认为用来收集用户隐私而遭到批评。2.安全性不高,容易伪造。
使用方法
1.在源页面的代码中创建你需要传递的名称和值构造Cookie对象:
HttpCookie objCookie = new HttpCookie("Name","Carl!"); Response.Cookies.Add(cookie);
2.在目的页面的代码使用Cookie对象取出传递的值:Result = Request.Cookies[ "Name" ].Value;
string myName1Value; myName1Value = Request.Cookies[ "Name" ].Value;
④Application
优点:1.使用简单,消耗较少的服务器资源。2.不仅能传递简单数据,还能传递对象。3.数据量大小是不限制的。
缺点:1.作为全局变量容易被误操作。所以单个用户使用的变量一般不能用application。
使用方法:1.在源页面的代码中创建你需要传递的名称和值构造Application变量:Application["Name"]="Value(Or Object)";
Application["Name"] = "Carl";
2.在目的页面的代码使用Application变量取出传递的值。Result = Application["Name"]
string Name; Application.Lock(); //使用lock防止并发修改 Name = Application["Name"].ToString(); Application.UnLock();
⑤Server.Transfer
优点:1.直接在服务器端重定向,使用简单方便,减少了客户端对服务器端提出请求。2.可以传递各种数据类型的值和控件的值。
缺点:1.客户端浏览器中的URL地址是不改变,会导致在新的页面可能出现一些意想不到的问题。比如如果源页面和目的页面不在同一个虚拟目录或其子目录下,那么使用相对路径的图片、超链接都会导致错误的指向。
使用方法:1.在源页面的代码中,使用Page类的Server.Transfer跳到另一个页面传递页面数据:Server.Transfer("b.aspx","false")。
public string Name { get{ return "Carl";} } private void Button1_Click(object sender, System.EventArgs e) { Server.Transfer("b.aspx"); }
2.在目的页面中,使用Context.Handler来接收数据:FormerPage formerPage = (FormerPage)Context.Handler; 然后用formerPage的属性和方法来获取前一个页面的值,或者直接用Context.Items["myParameter "]
a newWeb; //实例a窗体 newWeb = (source)Context.Handler; string Name; Name = newWeb.Name;
二.private、protected、public、internal修饰符访问权限
private:私有成员,在类的内部才可以访问
protected:保护成员,在类的内部和继承类中可以访问
public:公共成员,完全公开,没有访问限制
internal:当前程序集内可以访问
三 abstract class 和 interface 有什么区别
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
四 委托是什么?委托和事件的关系?
委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针。事件是特殊的委托
五 C#中using 和new 这两个关键字的意义?
using引入名称空间或者使用非托管资源
new新建实例或者隐藏父类方法(重写)
六 重写和重载的区别?
2重载发生在一个类内,重写发生在具有继承关系的类内
3重载要求方法名相同,必须具有不同的参数列表,返回值类型可以相同也可以不同;重写要求访问修饰符、方法名、参数列表必须完全与被重写的方法相同
在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 where 上下文关键字指定的。下表列出了六种类型的约束:约束说明
T:结构
类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。有关更多信息,请参见使用可以为 null 的类型(C# 编程指南)。
T:类
类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。
T:new()
类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。
T:<基类名>
类型参数必须是指定的基类或派生自指定的基类。
T:<接口名称>
类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
T:U
为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。
装箱时值类型转换为引用类型,拆箱是引用类型转换为值类型
八 向服务器发送请求有几种方式?
post 和get
九 ADO.NET中常用的对象有哪些?分别描述一下?
connection 连接数据库对象
command 命令对象,指示要执行的命令和存储过程!
datareader是一个向前的只读的数据流。
dataAdapter是功能强大的适配器,支持增删改查的功能
dataset是一个数据级对象,相当与内存中的一张表或多张表
十 .NET的错误处理机制是什么?
采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。
十一 概述反射和序列化
反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性
序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
十二 什么是虚函数?什么是抽象函数?
虚函数:没有实现的,可以由子类继承并重写的函数。
抽象函数:规定其非虚子类必须实现的函数,必须被重写。
继承:继承是一种联结类的层次模型,可以提高代码的可复用性和可扩展性。在需要定义和实现一个类时,可以从一个已存在的类中派生,这个过程被称为类继承。新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。子类将父类所定义的内容作为自己的内容(可复用性),并可以加入新内容(可扩展性)。
封装:封装是将对象的实现细节隐藏,然后定义一些公有方法来显示该对象的功能。封装可以保证代码具有优良模块性的基础,目的是实现代码的“高内聚,低耦合”。
多态:多态是指允许不同类的对象对同一信息作出响应。不用修改源程序代码,就可以让程序选择多个运行状态。多态性包括参数化多态性和包含多态性,能够很好的解决程序函数同名问题。
十五 Func<T> 与Action<T> 的区别?
Func<T>有返回类型;Action<T>只有参数类型,不能传返回类型。所以Action<T>的委托函数都是没有返回值的。
十六 简述Linq是什么?以及原理?
LINQ是一种用来进行数据访问的编程模型,使得.NET语言可以直接支持数据查询。原理就是一个方法的扩展,使用委托
十七 什么是MVC?完整流程是什么?使用MVC的好处?
MVC是Model-View-Controller的简称,即模型-视图-控制器
流程
好处:视图层和业务层分离,高重用性和可适用性,较低的生命周期成本,可维护性,快速的部署,有利于软件工程化管理
十八 ASP.NET MVC的路由选择是什么?
{controller}/{action}/{id}
十九 ASP.NET MVC 的局部视图是什么?MVC中可以创建自定义视图引擎吗?
PartialView , 可以
二十 控制器和视图之间数据传递的方式有哪些?
①ViewBag ②ViewData ③TempData ④Model
二十一 MVC中的ActionResult的返回值有几种类型?
12种,ViewResult,PartialViewResult,RedirectResult,RedirectToRouteResult,ContentResult,EmptyResult,JavaScriptResult,JsonResult,FileResult,HttpUnauthorizedResult,HttpStatusCodeResult,HttpNoFoundResult
二十二 MVC中的HtmlHelper是什么?
HtmlHelper是一个返回Html字符串的方法。返回的字符串可以是任意类型。例如你可以使用HtmlHelper方法返回一个标准的html标签<input>
<button>
<img>
等等。
你也可以自定义HtmlHelper方法,返回一些复杂的html,来展示数据。
二十三 说一说存储过程和触发器的特点
优点:1 预编译,已优化,效率较高。避免了SQL语句在网络传输然后再解释的低效率。 2 存储过程可以重复使用,减少开发人员的工作量。 3 业务逻辑封装性好,修改方便。 4 安全。不会有SQL语句注入问题存在。
缺点:1 可移植性是存储过程和触发器最大的缺点。 2 占用服务器端太多的资源,对服务器造成很大的压力 3 不能做DDL。 4 触发器排错困难,而且数据容易造成不一致,后期维护不方便。
二十四 索引的作用?它的优点缺点?
索引的作用:创建索引能够大大的提高系统的性能
优点:①通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
②大大加快数据的检索速度,这也是创建索引的最主要原因 ③加快表与表之间的连接,在实现数据的参考完整性方面特别有意义
④在使用分组和排序,子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
⑤通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
缺点:①创建索引和维护索引需要时间,这种时间随着数据量的增加而增加
②索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占物理空间,如果要建立聚簇索引,需要的空间更大
③当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这就降低了数据的维护速度。
二十五 写一条SQL语句,取出表A中第31到第四十记录 (sqlserver,自动增长id为主键,id可能不是连续的)
select * from (select ROW_NUMBER() over(order by t.ID) curr,t.* from tableA t) a where a.curr between 31 and 40
select top 40 * from tableA except select top 30 * from tableA
select top 10 * from tableA where ID not in (select top 30 ID from tableA)
二十六 写出一种或几种实现方法 1-2+3-4+5......-m
int Sum = 0 ; //判断奇偶,奇就加,偶就减 for (int i = 0 ; i < m+ 1 ; i++) { if((i%2) == 1) { Sum += i ; } else { Sum = Sum - i ; } }
int result = 0; //第二种:(1 - 2) + (3 - 4)+...
if (max % 2 == 0)
{
result = (max / 2) * (-1);
}
else
{ result = ((max + 1) / 2) * (-1) + max + 1; }
二十七 假设有50瓶饮料,喝完3个空瓶可以换一瓶饮料,以此类推,请问总共可以和多少瓶饮料?
思路:总共五十瓶喝完三瓶 +1 那么 50-3+1-3+1
int n = 50;
int i = 0; while(true)
{ n-=3; n++; i++; if (n<3)
{ Console.WriteLine("共喝了"+(50+i)+"瓶"); break; } }
二十八 如何终止多线程
用interrupt来处理,而不是stop或者volatile等方法。把主动权交给被中断的线程。这样可以保证线程的安全停止。
要想达到这样的效果不仅仅需要调用interrupt方法,而且需要被请求方,被停止方和子方法被调用方相互配合。作为请求方,就是调用Thread.interrupt()
发送一个中断请求的信号,而被停止方必须在适当的时候去检查这个中断信号,并且在可能抛出InterruptedException
的时候去处理这个信号。
二十九 给定表 table1 中有两个字段 ID、LastUpdateDate,ID表示更新的事务号, LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号
Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1)
三十 用代码写出一种你熟悉的排序算法
int i, j; int temp; for (i = 0; i < len -1; ++i) { for (j = len - 1; j > i; --j) { if (array[j] < array[j - 1]) { temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; } } }
三十一 Observer 模式
namespace 观察者模式的实现 { //银行短信系统抽象接口,是被观察者--该类型相当于抽象主体角色Subject public abstract class BankMessageSystem { protected IList<Depositor> observers; //构造函数初始化观察者列表实例 protected BankMessageSystem() { observers = new List<Depositor>(); } //增加预约储户 public abstract void Add(Depositor depositor); //删除预约储户 public abstract void Delete(Depositor depositor); //通知储户 public void Notify() { foreach (Depositor depositor in observers) { if (depositor.AccountIsChanged) { depositor.Update(depositor.Balance, depositor.OperationDateTime); //账户发生了变化,并且通知了,储户的账户就认为没有变化 depositor.AccountIsChanged = false; } } } } //北京银行短信系统,是被观察者--该类型相当于具体主体角色ConcreteSubject public sealed class BeiJingBankMessageSystem : BankMessageSystem { //增加预约储户 public override void Add(Depositor depositor) { //应该先判断该用户是否存在,存在不操作,不存在则增加到储户列表中,这里简化了 observers.Add(depositor); } //删除预约储户 public override void Delete(Depositor depositor) { //应该先判断该用户是否存在,存在则删除,不存在无操作,这里简化了 observers.Remove(depositor); } } //储户的抽象接口--相当于抽象观察者角色(Observer) public abstract class Depositor { //状态数据 private string _name; private int _balance; private int _total; private bool _isChanged; //初始化状态数据 protected Depositor(string name, int total) { this._name = name; this._balance = total;//存款总额等于余额 this._isChanged = false;//账户未发生变化 } //储户的名称,假设可以唯一区别的 public string Name { get { return _name; } private set { this._name = value; } } public int Balance { get { return this._balance; } } //取钱 public void GetMoney(int num) { if (num <= this._balance && num > 0) { this._balance = this._balance - num; this._isChanged = true; OperationDateTime = DateTime.Now; } } //账户操作时间 public DateTime OperationDateTime { get; set; } //账户是否发生变化 public bool AccountIsChanged { get { return this._isChanged; } set { this._isChanged = value; } } //更新储户状态 public abstract void Update(int currentBalance, DateTime dateTime); } //北京的具体储户--相当于具体观察者角色ConcreteObserver public sealed class BeiJingDepositor : Depositor { public BeiJingDepositor(string name, int total) : base(name, total) { } public override void Update(int currentBalance, DateTime dateTime) { Console.WriteLine(Name + ":账户发生了变化,变化时间是" + dateTime.ToString() + ",当前余额是" + currentBalance.ToString()); } } // 客户端(Client) class Program { static void Main(string[] args) { //我们有了三位储户,都是武林高手,也比较有钱 Depositor huangFeiHong = new BeiJingDepositor("黄飞鸿", 3000); Depositor fangShiYu = new BeiJingDepositor("方世玉", 1300); Depositor hongXiGuan = new BeiJingDepositor("洪熙官", 2500); BankMessageSystem beijingBank = new BeiJingBankMessageSystem(); //这三位开始订阅银行短信业务 beijingBank.Add(huangFeiHong); beijingBank.Add(fangShiYu); beijingBank.Add(hongXiGuan); //黄飞鸿取100块钱 huangFeiHong.GetMoney(100); beijingBank.Notify(); //黄飞鸿和方世玉都取了钱 huangFeiHong.GetMoney(200); fangShiYu.GetMoney(200); beijingBank.Notify(); //他们三个都取了钱 huangFeiHong.GetMoney(320); fangShiYu.GetMoney(4330); hongXiGuan.GetMoney(332); beijingBank.Notify(); Console.Read(); } } }
三十二 什么是AJAX?它有几种请求处理模式?如何避免AJAX请求到缓存数据?
AJAX的全称是Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。能够实现局部刷新页面。 两种post和get
产生缓存的情况:
Ajax在发送的数据成功后,会把请求的URL和返回的响应结果保存在缓存内,当下一次调用Ajax发送相同的请求时,它会直接从缓存中把数据取出来,这是为了提高页面的响应速度和用户体验。当前这要求两次请求URL完全相同,包括参数。这个时候,浏览器就不会与服务器交互。
解决缓存方案:
解决这个问题最有效的办法是禁止页面缓存,有以下几种处理方法:
1、在ajax发送请求前加上 xmlHttpRequest.setRequestHeader(“Cache-Control”,”no-cache”);
2、在服务端加 header(“Cache-Control: no-cache, must-revalidate”);
3、在ajax发送请求前加上 xmlHttpRequest.setRequestHeader(“If-Modified-Since”,”0″);
4、在 Ajax 的 URL 参数后加上 "?fresh=" + Math.random(); //当然这里参数 fresh 可以任意取了
5、第五种方法和第四种类似,在 URL 参数后加上 "?timestamp=" + new Date().getTime();
6、用POST替代GET:不推荐
三十三 是否可以继承string类?为什么?
不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。
三十四 列举c#中集合类型
1.数组集合类型:描述允许将数组视为集合处理的数组功能。
2.ArrayList 和List 集合类型:描述泛型和非泛型列表(最常用的集合类型)的功能。
3.Hashtable 和Dictionary 集合类型:描述基于哈希的泛型和非泛型字典类型的功能。
4.SortedList 和SortedDictionary 集合类型:描述排序的字典以及组合字典和列表功能的混合类型。
5.队列Queue集合类型:描述泛型和非泛型队列的功能。
6.堆栈Stack集合类型:描述泛型和非泛型堆栈的功能。
7.HashSet 集合类型:描述泛型HashSet(T) 集合类型。
8.HashSet 和LINQ Set 运算:描述HashSet(T) 集合类型提供的Set 操作以及LINQ Set 操作。
三十五匿名类型对象是可变对象还是不可变对象?
我理解的是可变的(有大神欢迎指正)
三十六嵌套类型可以访问外部包含类型的所有private成员,这一说法正确吗? 正确
三十七 线程池中的线程是前台线程还是后台线程?前台线程和后台线程的区别是什么?
线程池的线程默认为后台线程。前台线程和后台线程唯一区别就是:应用程序必须运行完所有的前台线程才可以退出
三十八 方法声明中的params关键字之后不允许任何其他参数,说法正确吗?
为了将方法声明为可以接受可变数量参数的方法,我们可以使用params关键字来声明数组,要求:
(1)在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
(2)该参数必须标识一个一维数组,但类型不限,对该参数传递null或者0个数目的数组的引用都是合法的
三十九 为什么不提倡catch(exception)?
方法如果过大,则无法直观体现出错的代码段,假设如果报了空指针,出错的原因可能是在XX行参数为NULL,但这个原本不该为NULL的参数变为NULL才是代码出问题的根本原因。所以不提倡开头结尾包这种捕获异常。当然只是不提倡,没有说一定有多不好。
四十 序列化是指什么过程?列出几种需要序列化的场景?
序列化是通过将对象转换为字节流,从而存储对象或将对象传输到内存,数据库或文件的过程。主要用途是保存对象的状态,包括对象的数据,以便能够在需要是重建对象。反向过程称为 反序列化。XML序列化、SOAP序列化等
四十一 ODP.NET 主要功能
我理解的是类似于ADO.NET ,ODP.NET 用于连接Oracle数据库
四十二 Oracle数据库中如何实现自增长列?
第一步,创建sequence
-- Create sequence create sequence SEQ_T_RECV minvalue 1 maxvalue 9999999 start with 1 increment by 1 cache 50;
第二步,创建表
-- Create table create table RECV_MSG ( id NUMBER, messageid VARCHAR2(32), contents VARCHAR2(2000), app_flg VARCHAR2(100), phonenumber VARCHAR2(2000), updatetime DATE default sysdate );
第三步,建立触发器
CREATE OR REPLACE TRIGGER "recv_trig" BEFORE INSERT ON recv_msg REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW DECLARE BEGIN SELECT SEQ_T_RECV.NEXTVAL INTO :NEW.ID FROM DUAL; END recv_trig;
第四步,测试并确认
四十三 数据库中的Union 和Union All的区别?
1、UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
2、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。
3、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。
4、从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。
四十四 htttpmodule和httphandler的作用和区别
1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你响应了哪个事件,一些事件是在Handler之前运行的,一些是在Handler之后运行的
2.对请求的处理上:IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.
3.IHttpHandler按照你的请求 生成响应的内容,IHttpModule对请求进行预处理,如验证、修改、过滤等等,同时也可以对响应进行处理ASP.Net系统本身配置有很多HttpHandler和HttpModule,以处理aspx等.Net标准的页面文件,以及这些页面文件中标 准的事件等。
四十五 用递归求1+2+3+4+....+100
int digui (int n) { if(n==1) return 1; else return (digui(n-1)+n); }
四十六 string str =null;与string str = “”,两者的区别?
1.最大的区别在于String str=null没有分配内存,String str=""分配了内存
2.String str=null 这个引用指向了一个null ,没有地址没有值的地方
3,String str="" 这个引用指向了一个地址,地址里面存的是空的字符
四十七 ASP.NET常见内置对象有?
1.Response对象:通过该对象的属性和方法可以控制如何将服务器端的数据发送到客户端浏览器。
2. Request对象:当客户发出请求执行ASP.NET程序时,客户端的请求信息会包装在Request对象中,这些请求信息包括请求报头(Header)、客户端的机器信息,客户端浏览器信息,请求方法(如POST、GET)、提交的窗体信息等。
3.Server对象:反映了Web服务器的各种信息,它提供了服务器可以提供的各种服务。
4. Application对象:一个集合对象,并在整个ASP.NET网站内可用,不同的用户在不同的时间都可以访问Application对象的变量。由于它是一个内置对象,所以使用它的时候与使用Response对象和Request对象类似,不需要进行任何对象的实例化,就可以直接用。
5.Session对象:负责存储、读取和改变一个特定用户的会话信息。对于每个用户的每次访问Session对象是唯一的。
6. Cookie对象:在Web程序设计中,它表示一个长度不超过4K的一个普通的文本文件。这个文件在用户的硬盘上,可以由Web浏览器进行访问。
四十八C# 下实现把Array复制到ArrayList
//方法一 Console.WriteLine("方法一:for循环"); for (int i = 0; i < array.Length; i++) { list.Add(array[i]); Console.WriteLine(list[i]); } //方法二 Console.WriteLine("方法二:使用ArrayList 的CopyTo()方法"); list.CopyTo(array); forList(array, list); //方法三 Console.WriteLine("方法三:使用ArrayList的Adapter()方法"); ArrayList list1 = ArrayList.Adapter(array); forList(array, list1); //f方法四 Console.WriteLine("方法四:直接使用构造方法传入,因为Array实现了ICollection:"); ArrayList list2 = new ArrayList(array); forList(array, list1); Console.ReadKey();
四十九 用c#创建一个int数组,长度为100,并向其中随机插入1-100,并且不重复
List<int> lst = new List<int>(); Random r = new Random(); while (true) { int temp = r.Next(1, 101); if (lst.Count == 100) { break; } if (!lst.Contains(temp)) { lst.Add(temp); } } for (int i = 0; i < lst.Count; i++) { Console.WriteLine(lst[i]); } Console.Read();
五十 编写一个类,继承基类(基类有方法F1),继承接口并实现其方法F2 (类A,基类BaseA,接口InterA)
Class A: BaseA ,IneterA { public voerride void F1(){....} PUblic void F2(){....} }