当前位置:  编程技术>.net/c#/asp.net

Question:基于C#连续赋值的面试题(解答)

    来源: 互联网  发布时间:2014-10-20

    本文导语:  题目在这里:Question:基于C#连续赋值的面试题介绍在msdn中,对=号操作符的说明如下: 赋值运算符 ( =) 将右操作数的值存储在左操作数表示的存储位置、属性或索引器中,并将值作为结果返回。操作数的类型必须相同(即右操...

题目在这里:Question:基于C#连续赋值的面试题介绍在msdn中,对=号操作符的说明如下:
 
赋值运算符 ( =) 将右操作数的值存储在左操作数表示的存储位置、属性或索引器中,并将值作为结果返回。
操作数的类型必须相同(即右操作数必须可以隐式转换为左操作数的类型)。
首先来看
int x,y,z;X = y = z = 1;
.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { 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。
接着看第一道题:
const int x=1;short y;object z;z=y=x;

.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { 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.
值得一提的是,如果你将上面的const int x=1中的const去掉,代码如下:
int x=1;short y;object z;z=y=x;

.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { 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.所以这段代码无法通过编译:
接着考虑第二题:

代码如下:

class C
 {
     private string x;
     public string X
     {
         get { return x ?? ""; }
         set { x = value; }
     }
 }

static void Main()
{
    C c = new C();
    object z;
    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。

你都做对了吗?


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.swing类joptionpane的类成员方法: question_message定义及介绍
  • Dummy's question 1 - Question
  • java命名空间javax.swing类jrootpane的类成员方法: question_dialog定义及介绍
  • PHP问答系统 Question2Answer
  • easy question:请解释一下++a的含义(详细点);
  • A question about RPM
  • jb easy question
  • float question.
  • [question]tmd的,有人惹我,怎么办
  • have a good day! easy question.
  • question in bluepoint linux
  • simple question
  • a question
  • Question_求Linux入门书籍介绍
  • a foolish question
  • question about authority!!help me
  • 问一个非常easy的question
  • simple question on shell
  • A small question
  • diff question
  • question of mail about red hat


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3