Answer:关于C#连续赋值的面试题
2011-06-28 19:31
330 查看
题目在这里:Question:关于C#连续赋值的面试题
在msdn中,对=号操作符的说明如下:
赋值运算符(=)将右操作数的值存储在左操作数表示的存储位置、属性或索引器中,并将值作为结果返回。
操作数的类型必须相同(即右操作数必须可以隐式转换为左操作数的类型)。
首先来看
intx,y,z;
X=y=z=1;
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
1:z=1,将1赋值给z,接着返回1,
2:y=(z=1),将返回的1赋值给y,并返回1,
3:x=(y=(z=1)),将表达式2的结果1赋值给x。
接着看第一道题:
constintx=1;
shorty;
objectz;
z=y=x;
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
首先要说明的是x是const,因为const是编译时常量,所以
Z=y=x;在编译的时候就会变成z=y=1。
1:y=1,因为y是short,所以1被转换为short,所以返回值为1(short);
2:将y=1返回的结果,也就是1(short)赋值给z,所以z是1(short)装箱后的对象,
GetType返回System.Int16.
值得一提的是,如果你将上面的constintx=1中的const去掉,代码如下:
intx=1;
shorty;
objectz;
z=y=x;
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
因为x是Int32,y是Int16,因为Int32无法隐式转换成Int16.所以这段代码无法通过编译:
接着考虑第二题:
classC
{
privatestringx;
publicstringX
{
get{returnx??"";}
set{x=value;}
}
}
staticvoidMain()
{
Cc=newC();
objectz;
z=c.X=null;
//下面两句话输出什么
System.Console.WriteLine(z==null);
System.Console.WriteLine(c.X==null);
}
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
关键就是分析:z=c.X=null;
1:c.X=null;调用c的setX方法,设置x=null,并且将null作为值返回。
2:z=(c.X=null);因为c.X=null,返回了null,所以将null赋值给z,z此时为null;
3:Console.WriteLine(z==null),返回True;
4:Console.WriteLine(c.X==null),调用c的getX方法,方法返回””,所以c.X==null,返回False。
你都做对了吗?
参考文章:Chainingsimpleassignmentsisnotsosimple
相关文章推荐
- Question:关于C#连续赋值的面试题
- 于C#连续赋值的面试题
- Question:基于C#连续赋值的面试题介绍
- Question:基于C#连续赋值的面试题(解答)
- 一道关于实例化顺序的C#面试题
- 解析关于实例化顺序的C#面试题
- C# 关于类型转换 面试题
- 关于C#中 从未对字段***赋值,字段将一直保持其默认0
- 关于python连续赋值的需要注意的地方
- 【转摘】一道关于实例化顺序的C#面试题
- 关于C#编程中引用与值类型赋值的一些容易犯错的地方
- 关于一个给二维数组循环赋值问题的本渣研究出的解决办法[C#]
- 一道关于实例化顺序的C#面试题
- c#实现控件的连续赋值
- 关于c#中combobox赋值问题
- C# 面试题解析-请遍历页面上所有的TextBox控件并给它赋值为string.Empty
- 一道关于实例化顺序的C#面试题
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 一道关于实例化顺序的C#面试题
- c# winform 关于给静态全局变量赋值的问题