您的位置:首页 > 职场人生

于C#连续赋值的面试题

2011-07-17 09:24 225 查看
在msdn中,对=号操作符的说明如下:




赋值运算符(=)将右操作数的值存储在左操作数表示的存储位置、属性或索引器中,并将值作为结果返回。

操作数的类型必须相同(即右操作数必须可以隐式转换为左操作数的类型)。


首先来看

intx,y,z;
X=y=z=1;


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;


首先要说明的是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;


因为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);
}


关键就是分析: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


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: