没有合适的资源?快使用搜索试试~ 我知道了~
500多道最新C#面试题大全(有答案)
4星 · 超过85%的资源 需积分: 13 116 下载量 112 浏览量
2008-08-02
17:56:19
上传
评论 5
收藏 146KB DOC 举报
温馨提示
试读
35页
500多道C#面试题大全(有答案),能快速的让你掌握C#开发的基础知识,能让你掌握C#的基本概念如重载和重写,同时能满足你在应聘时涉及到得很多知识等,让你轻松找到理想的工作。于20105月更新
资源推荐
资源详情
资源评论
在 C#中,将类和数组等都归为了引用型的,那么值类型和引用型有什么区别呢?
值类型的变量包含自身的数据,而引用类型的变量是指向数据的内存块的,并不是直接存
放数据。对于值类型,每个变量都有一份自己的数据复制,对另一个值类型变量的操作并
不影响这一个变量的值。
而对于引用类型,两个变量有可能引用同一对象,因此对一个变量的操作会影响到另一个
变量。
(1)总的区别
值类型 引用类型
内存分配地点
分配在栈中 分配在堆中
效率
效率高,不需要地址转换 效率低,需要进行地址转换
内存回收
使用完后,立即回收 使用完后,不是立即回收,
等待 回收
赋值操作
进行复制,创建一个同值
新对象
只是对原有对象的引用
函数参数与返
回值
是对象的复制 是原有对象的引用,并不产
生新的对象
类型扩展
不易扩展 容易扩展,方便与类型扩展
(2)赋值区别
static void Main(string arg[])
{
int x=10;
int y=x;
Console.writeline(x.ToString()+","+y.ToString());//输出的结果是:10,10
y=20;
Console.writeline(x.ToString()+","+y.ToString());//输出的结果是:10,20
int [] arry=new int [1];
int [] arry1=arry;
arry[0]=10;
Console.writeline(arry[0].ToString()+","+arry1[0].ToString());//输出的结果是:10,10
arry1[0]=20;
Console.writeline(arry[0].ToString()+","+arry1[0].ToString());//输出的结果是:10,20
string str1="liao:;
string str2=str1;
Console.writeline(str1+","+str2);//输出的结果是:liao,liao
str1="xiao";
Console.writeline(str1+","+str2);//输出的结果是:xiao,liao
}
1)因 int 是值类型,int x' int y 内存中就有两个地方存储 x,y;所以当改变 x 或 y 的值时,都不会改变
另一个变量的值。
2)因 int [] arry,int []arry1 是数组,数组是引用类型,所以这两个变量引用了同一个对象(数组)
所以当 改变某一个引用指向的对象的属性同时也会影响到所有其他指向这个对象的引用
所以当 的值改成 时,的值也随着改变成 最后的 和
的值都为 不过虽然字符类型 也是引用类型,但它的工作方式更像值类
型既当 的值改成时,新创建了一个 对象, 引用这个新的
对象; 仍然引用原来 对象。产生这种行为的原因是 对象是恒定的,
也就是说,一旦一个 对象被创建,它的值就不能再修改,所以当改变一个字符串
变量的值的时候,仅仅是新创建了一个包含修改内容的新的 对象。
(3)作为函数参数或者返回值
'' class Program
''' {
''''''' public static void add(int k)
''''''' {
''''''''''' k = k + 39;
''''''' }
''''''' public static void add(ref int i)
''''''' {
''''''''''' i = i + 39;
''''''' }
''''''' public static void add(int[] j)
''''''' {
''''''''''' j[0] = j[0] + 39;
''''''' }
''''''' public static void astr(ref string sy)
''''''' {
''''''''''' sy = "ddd";
''''''' }
''''''' static void Main(string[] args)
''''''' {
''''''''''' int[] ary = new int[1];
''''''''''' int[] ary1 = ary;
''''''''''' ary[0] = 1;
''''''''''' add(ary[0]);
''''''''''' Console.WriteLine(ary[0].ToString()); //输出的结果是:1
''''''''''' add(ref ary[0]);
''''''''''' Console.WriteLine(ary[0].ToString()); //输出的结果是:40
''''''''''' add(ary);
''''''''''' Console.WriteLine(ary[0].ToString()); //输出的结果是:79
''''''''''' string str4 = "liaoxiaol";
''''''''''' astr(ref str4);'''''''''''''''' //输出的结果是:ddd //str4 的值已改变
''''''''''' Console.WriteLine(str4);
''''''' }
''' }
说明:
1)对于值类型的变量:要想在函数中对传进去的参数做真正的修改,需要借助于 ref 这个关键字
所以当执行 后,的值时并没有改变;而当执行 后,
的值
就变成了
对于引用类型的变量,则和值变量相反而在实际应用中我们并不想引用类型变量作为函数参数
传入后,其值有所心改变,要做到这一点需要为“引用类型”提供一个额外的 ! 函数
所以当执行 后,的值就变成了 "
虽然 类型也是引用类型但前面也说过 类型的工作更像值类型
附加#对于引用类型来说,提供一个 ! 函数不是一件容易的事情,尤其出现引用类型嵌套的时
候,
在 $中,尤其自己定义类型的时候,常常由于是用 % 来定义还是用
! 来定义,即是定义一个值类型还是一个引用类型呢。在这本书上给了几
个判定条件,如果如下几点都满足的话,建议用 % 来定义为值类型,否则
用 ! 定义为引用类型。
这个类型是否主要为了数据存储;
是否只通过属性来访问对象的数据成员;
这个类型是否不会有子类型;
在程序处理的时候不会把这个类型对象通过多态来处理。
总而言之,在 $中,就是把底层面的数据用值类型来处理,而包含复杂
操作,需要进行扩展的数据用引用类型来处理
重载和覆盖的区别
"&&'#"()*)
重载是让同名的方法根据不同的数据类型可以处理和返回不同类型的数据。发
生在同一类中
而覆盖则与作用域有关了,在子类中与父类同名的方法,在子类中父类的方法
就不能被调用,可以说被屏蔽了。发生在不同类中
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
覆盖是指派生类中存在重新定义的函数,其函数名、参数列、返回值类型必须
同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体
(花括号 中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用
子类中的覆盖版本,而不是父类中的被覆盖函数版本,这种机制就叫做覆盖。
下面我们从成员函数的角度来讲述重载和覆盖的区别。
成员函数被重载的特征有:
相同的范围(在同一个类中);
函数名字相同;
参数不同;
,%! 关键字可有可无。
覆盖的特征有:
不同的范围(分别位于派生类与基类);
函数名字相同;
参数相同;
基类函数必须有 ,%! 关键字。
C#中 null 与""的区别:
%!! 是定义了变量后没有初始化的值,如果使用 , 函数进行强制转换会得到
不同的值,整数被强制转换后,值为 ,字符串在强制转换后值是;则是表示字符
串数据类型变量被赋值的值,跟 %!! 完全不同)%!! 是一个特殊值,代表无效引用)
)列举 (-.)/01页面之间传递值的几种方式。
答))使用 2%-如))))34)5 ))))
66666666666666666)使用 - 变量
66666666666666666)使用 -,)1
)一列数的规则如下#、、、、7、8、、、))))))求第 位数是多少, 用
递归算法实现。
答:4%9! !*!
66666666666666666:
666666666666666664%9! ,*
66666666666666666:
66666666666666666!);<=
66666666666666666>
666666666666666664%9! =
66666666666666666:
66666666666666666?
66666666666666666%
66666666666666666!@AA?
66666666666666666%
66666666666666666!%=&=&
66666666666666666>
66666666666666666>
)$中的委托是什么?事件是不是一种委托?
答 :
66666666666666666委托可以把一个方法作为参数代入另一个方法。
66666666666666666委托可以理解为指向一个函数的引用。
66666666666666666是,是一种特殊的委托
7), 与重载的区别
答 :
66666,与重载的区别。重载是方法的名称相同。参数或参数类型不同,进行多次重
载以适应不同的需要
66666B,是进行基类中函数的重写。为了适应需要。
')如果在一个 CD- 结构的系统中需要传递变量值,但是又不能使用
-、E、(44! ,您有几种方法进行处理?
答 : 2%-、=F(%G 、 G)-,)1
")请编程遍历页面上所有 1C 控件并给它赋值为 )0F4?
答:
G-F);H)=F)! !G)!
:
!-F);H)=F)1C
:
剩余34页未读,继续阅读
widelysea
- 粉丝: 26
- 资源: 18
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 高等数学第一章第二节数列的极限
- Python 版冒泡排序算法源代码
- tensorflow-gpu-2.7.2-cp38-cp38-manylinux2010-x86-64.whl
- tensorflow-2.7.3-cp39-cp39-manylinux2010-x86-64.whl
- tensorflow-2.7.2-cp39-cp39-manylinux2010-x86-64.whl
- Python版本快速排序源代码
- Python 语言版的快速排序算法实现
- 450815388207377安卓_base.apk
- 超微主板 X9DRE-TF+ bios 支持 nvme启动
- 基于Python通过下载气象数据和插值拟合离散数据曲线实现对寒潮过程的能量分析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页