菜鸟去面试,高高兴兴地去,垂头丧气地回,不想搞程序了。题目如下,给大家看看1. 以下是类的同一个属性的两个不同实现方法,请分析他们对运行效率可能产生的影响方法A:
private StringBuilder _nameAbc = new StringBuilder();
public string NameAbc
{
    get { return _nameAbc.ToString(); }
    set
    {
        _nameAbc.Remove(0, _nameAbc.Length);
        _nameAbc.Append(value);
    }
}
方法B:
private string _nameAbc;
public string NameAbc
{
    get { return _nameAbc; }
    set { _nameAbc = value; }
}------------
我的答案是“A”效率高,因为当对属性频繁赋值时,方法B每次都要销毁一个string对象,建立一个新的string对象,方法A则不会这样。
2. 请在10分钟内设计一个算法并写一段代码,说明如下:
输入:string1, string2,他们的长度相同但内容不固定
输出:string1到string2的不同组合
例如:string1="aa",string2="cc",那么输出应该是:
aa,ab,ac,ba,bb,bc,ca,cb,cc------------
我的答案是...L

解决方案 »

  1.   

    第一题得看情况而定,StringBuilder是需要占用一定内存才能工作的
    第二题怎么来了个b呀
      

  2.   

    1.我选 A .直接引用一个现有的对象只需复制 4 字节长的指针.
    2.
    string sBegin = "aa";
    string sEnd = "cc"; StringBuilder sTmp = new StringBuilder(sBegin); int nLast = sBegin.Length - 1;
    int I = 0; do
    {
    Debug.WriteLine(sTmp); for (I = nLast; I >= 0; --I)
    {
    ++sTmp[I]; if (sTmp[I] > sEnd[I])
    sTmp[I] = sBegin[I];
    else
    break;
    }
    } while (I >= 0);
      

  3.   

    对于第一题,当然是方法B效率更高。
    因为A的ToString不照样产生string么?而set的那个string也是个实例。所以事实上方法A的效率和内存占用方面要比B差一倍左右。
    我们来看一下内部的工作原理,很简单就会明白这个道理我们用这样一段程序来说明:string s = "123";
    a.NameAbc = s;
    Console.WriteLine( a.NameAbc );其中,a是包含上面属性的类的实例。对于方法A,其展开后为:
    string s = "123";
    a._nameAbc.Remove( a._nameAbc.Length );
    a._nameAbc.Append( s );//注意,现在s仍然存在。
    string s1 = a._nameAbc.ToString();//注意:现在多出了一个s1。
    Console.WriteLine( s1 );这道题目考的是对引用类型的理解程度,以及对StringBuilder的工作原理,好题……
      

  4.   

    Sorry 
    1.我选 A .直接引用一个现有的对象只需复制 4 字节长的指针.
    (打错了  A 改为 B)
      

  5.   

    1.看使用频率,使用频率高则A,要是使用次数不多,小于2次我用B。
    2.static void complex(string a,string b)
    {
     foreach(char ch1 in a)
    {
     foreach(char ch2 in b)
    {
      Console.WriteLine("{0},{1}----{1},{0}",ch1,ch2);
     }
     }
    }
      

  6.   

    楼主: 我的答案是“A”效率高,因为当对属性频繁赋值时,方法B每次都要销毁一个string对象,建立一个新的string对象,方法A则不会这样。
    ---------------------------------------------------
    private string _nameAbc;
    public string NameAbc
    {
    get { return _nameAbc; }
    set { _nameAbc = value; }
    }_nameAbc = value ;
    上面这一语句并没有发生什么"拷贝构造"的过程(没有创建新的 String 对象), 而是使 _nameAbc 引用 value 所引用的 String  对象. 当 _nameAbc 改变了引用的对象之后, 只有当 _nameAbc 原来引用的对象没有被程序其他地方的任何变量引用时, 才会发生 String 对象的销毁操作.(注意:
    String 类是 "引用"类型, 而非 "值" 类型.)方法 A:
    _nameAbc.Remove(0, _nameAbc.Length);
    _nameAbc.Append(value);
    该方法每次都需要清除原有数据再进行复制.get { return _nameAbc.ToString(); }//构造一个新的 String 对象并将其返回.
    我认为, 在任何情况下, 方法 B 总是优于 方法 A.(B 效率好, 且可节省内存)
      

  7.   

    new StringBuilder() 和new string() 
    到底哪个更优化啊?看到楼上面这么都的说法,我蒙了请高手指导
      

  8.   

    如果处理的字串长度大于某个值得时候 stringBuilder 好些。如果字符长的长度不太长,就用stirng了。。
      

  9.   

    方法A的NameAbc不能赋null,方法B可以
      

  10.   

    先回答第一题:答案是A
    A使用的是StringBuilder,B使用的是字符串.
    因为: System.String是一种不变的字符串,一旦设定,只要改变任何的一个字符,系统
          需要重组该字串,其销毁和重建在内存中是非常频繁的.
          正因为如此,微软提供了StringBuilder类,该类使用相同的缓冲区操作,因而可
          降低内存配置操作发生的几率,因此自然也会提高效率.
    坦率讲,此题目只是测试程序员对StringBuilder的理解.真正写程序,大多数的东西
    用String绝不会影响到太大的速度问题.这么死的题目,LZ不必太郁闷,只能说出题
    的人只是在考你的知识而已,不是考你的能力.第二题: 思考中...
      

  11.   

    第一道题同意  ttpps() 的说法
     第二道题先顶先.
      

  12.   

    有点晕,怎么答案会是A?
    答案应该是: 
        ////////////////////////////////////////////////////////////////////////
        A和B在使用不频繁的情况下,没有太大的区别,但如果是在频繁使用的情况下,使用A
    将会大幅度地提高运行速度,更有效率。
       ////////////////////////////////////////////////////////////////////////
    此应该为正解
      

  13.   

    第二题
    netpole(往)正解,不用再费神了.
      

  14.   

    同意第一题字符串多的时候用A,效率高,字符串少的话,还是用B
    第二题,该是ASCII码减一,应该是一个递增系列
    比如str1=aa  str2=dc,估计是最小字母与最大字母之间系列的组合
      

  15.   

    -----------------------
    -   编程图片下载站    -
    -   www.stabber.net   -
    -----------------------
      

  16.   

    第一个问题就像再问:
    是byte[]还是byte* 效率高
    要分情况的。
    一般指针效率会高,但不是绝对。
    你那个问题也一样。StringBuilder也不是因为高所以高的,它在时间复杂度上优于string,但在空间复杂度上却不一定比得上string,换句话说,Array和Hashtable也是这个道理,为什么大家都在说Hashtable在数量不多的时候用,快。因为它的工作原理导致了他在数量多的时候,它的短处就多于了长处,StringBuilder也是这个道理。
    一般情况下,我觉得没有人会把属性写成A那样,但是也有二班情况,比如这个属性很长,并且分几次录入。这时候StringBuilder的优势就出来了,相反,如果属性就是 NameAbc="Test",我觉得B好
      

  17.   

    1、其实2者效率基本上相同。对于CLI来说,对象的定义及数据区存在于2个地方,而当频繁使用到StringBuilder时,只会创建一个StringBuilder对象。而对于B来说,String仅仅是做了一个参考引用,实际定义是放在定义的区,所以占用内存来说基本上不会很大。而且,这个时间的消耗来说,比起CLI调度/执行的时间相比确实要小得太多了。
    2、其实是考察一个递归 + 2重循环而已
      

  18.   

    第一题无论频繁与否都应选B
    因为get方法,直接返回String 引用,一个int所点内存空间,
    set 方法,也就是将传入参数的引用赋给private变量引用
    如String a,b;
    a-->a内容
    b-->b内容
    a=b的结果是
    a-->内容销毁,
    a=b值
    a-->b内容
    这里只需b引用(一个int所占空间)赋给a.
      

  19.   

    两到题 都很有深度啊
    说说自己的看法
    1.个人认为如果只是运行时应该是A的效率更高一些(前提是new StringBuilder()已经运行过了,如果没运行过,就看具体情况了)
    string 虽然是引用类型,但是很特殊,它的每次复制和连接都要开辟内存
    2.这个很好玩,不过像不像 一个27进制的加法:)  这么做就相当简单了
      

  20.   

    测试过了,第一题确实 B的效率高,第二题 tpole(往) 的答案正确
      

  21.   

    B的效率要比A高出许多。
    楼主对StringBuilder在哪用效率高的理解有误。在对同一个字符串频繁地进行附加、移除等操作时,用StringBuilder就比用String快出不是一点半点的了。
      

  22.   

    _nameAbc.Append(value);
    注意这一句,用的 append方法,append要比直接用+号连接字符串效率要高