亚洲国产日韩欧美在线a乱码,国产精品路线1路线2路线,亚洲视频一区,精品国产自,www狠狠,国产情侣激情在线视频免费看,亚洲成年网站在线观看

筆試題目(綜合版樣題)

時(shí)間:2022-10-26 19:09:16 筆試題目 我要投稿
  • 相關(guān)推薦

筆試題目(綜合版樣題)

題記:一年一度的招聘黃金時(shí)間來臨了,本人決定整理C#.Net的資料為本人和園子里的朋友共享!
C#資料(一)
1.靜態(tài)成員和非靜態(tài)成員的區(qū)別?
答:
靜態(tài)變量使用 static 修飾符進(jìn)行聲明,在類被實(shí)例化時(shí)創(chuàng)建,通過類進(jìn)行訪問不帶有 static 修飾符聲明的變量稱做非靜態(tài)變量,在對象被實(shí)例化時(shí)創(chuàng)建,通過對象進(jìn)行訪問一個(gè)類的所有實(shí)例的同一靜態(tài)變量都是同一個(gè)值,同一個(gè)類的不同實(shí)例的同一非靜態(tài)變量可以是不同的值靜態(tài)函數(shù)的實(shí)現(xiàn)里不能使用非靜態(tài)成員,如非靜態(tài)變量、非靜態(tài)函數(shù)等
示例:
using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example01
{
    class Program
    {
        class Class1
        {
            public static String staticStr = "Class";
            public String notstaticStr = "Obj";
        }
        static void Main(string[] args)
        {
            //靜態(tài)變量通過類進(jìn)行訪問,該類所有實(shí)例的同一靜態(tài)變量都是同一個(gè)值
            Console.WriteLine("Class1's staticStr: {0}", Class1.staticStr);
 
            Class1 tmpObj1 = new Class1();
            tmpObj1.notstaticStr = "tmpObj1";
            Class1 tmpObj2 = new Class1();
            tmpObj2.notstaticStr = "tmpObj2";
 
            //非靜態(tài)變量通過對象進(jìn)行訪問,不同對象的同一非靜態(tài)變量可以有不同的值
            Console.WriteLine("tmpObj1's notstaticStr: {0}", tmpObj1.notstaticStr);
            Console.WriteLine("tmpObj2's notstaticStr: {0}", tmpObj2.notstaticStr);
 
            Console.ReadLine();
        }
    }
}

結(jié)果:
Class1's staticStr: Class
tmpObj1's notstaticStr: tmpObj1
tmpObj2's notstaticStr: tmpObj2

筆試題目(綜合版樣題)

2.const 和 static readonly 區(qū)別?

答:const

用 const 修飾符聲明的成員叫常量,是在編譯期初始化并嵌入到客戶端程序

static readonly

用 static readonly 修飾符聲明的成員依然是變量,只不過具有和常量類似的使用方法:通過類進(jìn)行訪問、初始化后不可以修改。但與常量不同的是這種變量是在運(yùn)行期初始化

示例:

測試類:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example02Lib
{
    public class Class1
    {
        public const String strConst = "Const";
        public static readonly String strStaticReadonly = "StaticReadonly";
        //public const String strConst = "Const Changed";
        //public static readonly String strStaticReadonly = "StaticReadonly 
Changed";
    }
}
 
客戶端代碼:
using System;
using System.Collections.Generic;
using System.Text;
using Example02Lib;
 
namespace Example02
{
    class Program
    {
        static void Main(string[] args)
        {
            //修改Example02中Class1的strConst初始值后,只編譯Example02Lib項(xiàng)目
            //然后到資源管理器里把新編譯的Example02Lib.dll拷貝Example02.exe所在的目錄,
執(zhí)行Example02.exe
            //切不可在IDE里直接調(diào)試運(yùn)行因?yàn)檫@會重新編譯整個(gè)解決方案!
 
            //可以看到strConst的輸出沒有改變,而strStaticReadonly的輸出已經(jīng)改變
            //表明Const變量是在編譯期初始化并嵌入到客戶端程序,而StaticReadonly是在運(yùn)行時(shí)初始化的
            Console.WriteLine("strConst : {0}", Class1.strConst);
            Console.WriteLine("strStaticReadonly : {0}", Class1.strStaticReadonly);
 
            Console.ReadLine();
        }
    }
}

結(jié)果:
strConst : Const
strStaticReadonly : StaticReadonly

修改后的示例:

測試類:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example02Lib
{
    public class Class1
    {
        //public const String strConst = "Const";
        //public static readonly String strStaticReadonly = "StaticReadonly";
        public const String strConst = "Const Changed";
        public static readonly String strStaticReadonly = "StaticReadonly Changed";
    }
}

結(jié)果

strConst : Const
strStaticReadonly : StaticReadonly Changed

3.extern 是什么意思?
答:extern 修飾符用于聲明由程序集外部實(shí)現(xiàn)的成員函數(shù)經(jīng)常用于系統(tǒng)API函數(shù)的調(diào)用(通過 DllImport )。注意,和DllImport一起使用時(shí)要加上 static 修飾符也可以用于對于同一程序集不同版本組件的調(diào)用(用 extern 聲明別名)不能與 abstract 修飾符同時(shí)使用

示例:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
 
namespace Example03
{
    class Program
    {
        //注意DllImport是一個(gè)Attribute Property,在System.Runtime.InteropServices命名空間中定義
        //extern與DllImport一起使用時(shí)必須再加上一個(gè)static修飾符
        [DllImport("User32.dll")]

public static extern int MessageBox(int Handle, string Message,

string Caption, int Type);

 
        static int Main()
        {
            string myString;
            Console.Write("Enter your message: ");
            myString = Console.ReadLine();
            return MessageBox(0, myString, "My Message Box", 0);

4.abstract 是什么意思?

答:abstract 修飾符可以用于類、方法、屬性、事件和索引指示器(indexer),表示其為抽象成員.abstract 不可以和 static 、virtual 一起使用聲明為 abstract 成員可以不包括實(shí)現(xiàn)代碼,但只要類中還有未實(shí)現(xiàn)的抽象成員(即抽象類),那么它的對象就不能被實(shí)例化,通常用于強(qiáng)制繼承類必須實(shí)現(xiàn)某一成員

示例:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example04
{
    #region 基類,抽象類
    public abstract class BaseClass
    {
        //抽象屬性,同時(shí)具有g(shù)et和set訪問器表示繼承類必須將該屬性實(shí)現(xiàn)為可讀寫
        public abstract String Attribute
        {
            get;
            set;
        }
 
        //抽象方法,傳入一個(gè)字符串參數(shù)無返回值
        public abstract void Function(String value);
 
        //抽象事件,類型為系統(tǒng)預(yù)定義的代理(delegate):EventHandler
        public abstract event EventHandler Event;
 
        //抽象索引指示器,只具有g(shù)et訪問器表示繼承類必須將該索引指示器實(shí)現(xiàn)為只讀
        public abstract Char this[int Index]
        {
            get;
        }
    }
    #endregion
 
    #region 繼承類
    public class DeriveClass : BaseClass
    {
        private String attribute;
 
        public override String Attribute
        {
            get
            {
                return attribute;
            }
            set
            {
                attribute = value;
            }
        }
        public override void Function(String value)
        {
            attribute = value;
            if (Event != null)
            {
                Event(this, new EventArgs());
            }
        }
        public override event EventHandler Event;
        public override Char this[int Index]
        {
            get
            {
                return attribute[Index];
            }
        }
    }
    #endregion
 
    class Program
    {
        static void OnFunction(object sender, EventArgs e)
        {
            for (int i = 0; i < ((DeriveClass)sender).Attribute.Length; i++)
            {
                Console.WriteLine(((DeriveClass)sender)[i]);
            }
        }
        static void Main(string[] args)
        {
            DeriveClass tmpObj = new DeriveClass();
 
            tmpObj.Attribute = "1234567";
            Console.WriteLine(tmpObj.Attribute);
 
            //將靜態(tài)函數(shù)OnFunction與tmpObj對象的Event事件進(jìn)行關(guān)聯(lián)
            tmpObj.Event += new EventHandler(OnFunction);
 
            tmpObj.Function("7654321");
 
            Console.ReadLine();
        }
    }
}

結(jié)果:
1234567
7
6
5
4
3
2
1

5.internal 修飾符起什么作用?

答:internal 修飾符可以用于類型或成員,使用該修飾符聲明的類型或成員只能在同一程集內(nèi)訪問接口的成員不能使用 internal 修飾符值得注意的是,如果為 internal 成員加上了 protected 修飾符,這時(shí)的訪問級別為 internal 或 protected。只是看字面意思容易弄錯(cuò),許多人認(rèn)為 internal protected 應(yīng)該是“只有同一個(gè)程序集中的子類可以訪問”,但其實(shí)它表示“同一個(gè)程序集中的所有類,以及所有程序集中的子類都可以訪問”

示例

Example05Lib 項(xiàng)目的 Class1

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example05Lib
{
    public class Class1
    {
        internal String strInternal = null;
        public String strPublic;
        internal protected String strInternalProtected = null;
    }
}

結(jié)果
Example05Lib 項(xiàng)目的 Class2 類可以訪問到 Class1 的 strInternal 成員,當(dāng)然也可以訪問到 strInternalProtected 成員,因?yàn)樗麄冊谕粋(gè)程序集里


Example05 項(xiàng)目里的 Class3 類無法訪問到 Class1 的 strInternal 成員,因?yàn)樗鼈儾辉谕粋(gè)程序集里。但卻可以訪問到 strInternalProtected 成員,因?yàn)?Class3 是 Class1 的繼承類


Example05 項(xiàng)目的 Program 類既無法訪問到 Class1 的 strInternal 成員,也無法訪問到 strInternalProtected 成員,因?yàn)樗鼈兗炔辉谕粋(gè)程序集里也不存在繼承關(guān)系


6.sealed 修飾符是干什么的?

答:sealed 修飾符表示密封

用于類時(shí),表示該類不能再被繼承,不能和 abstract 同時(shí)使用,因?yàn)檫@兩個(gè)修飾符在含義上互相排斥

用于方法和屬性時(shí),表示該方法或?qū)傩圆荒茉俦恢貙,必須?override 關(guān)鍵字一起使用,因?yàn)槭褂?sealed 修飾符的方法或?qū)傩钥隙ㄊ腔愔邢鄳?yīng)的虛成員

通常用于實(shí)現(xiàn)第三方類庫時(shí)不想被客戶端繼承,或用于沒有必要再繼承的類以防止濫用繼承造成層次結(jié)構(gòu)體系混亂

恰當(dāng)?shù)睦?sealed 修飾符也可以提高一定的運(yùn)行效率,因?yàn)椴挥每紤]繼承類會重寫該成員

示例:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example06
{
    class Program
    {
        class A
        {
            public virtual void F()
            {
                Console.WriteLine("A.F");
            }
            public virtual void G()
            {
                Console.WriteLine("A.G");
            }
        }
        class B : A
        {
            public sealed override void F()
            {
                Console.WriteLine("B.F");
            }
            public override void G()
            {
                Console.WriteLine("B.G");
            }
        }
        class C : B
        {
            public override void G()
            {
                Console.WriteLine("C.G");
            }
        }
        static void Main(string[] args)
        {
            new A().F();
            new A().G();
            new B().F();
            new B().G();
            new C().F();
            new C().G();
 
            Console.ReadLine();
        }
    }
}

結(jié)果:
類 B 在繼承類 A 時(shí)可以重寫兩個(gè)虛函數(shù),如圖所示:

由于類 B 中對 F 方法進(jìn)行了密封, 類 C 在繼承類 B 時(shí)只能重寫一個(gè)函數(shù),如圖所示:

控制臺輸出結(jié)果,類 C 的方法 F 只能是輸出 類B 中對該方法的實(shí)現(xiàn):

A.F
A.G
B.F
B.G
B.F
C.G


7.override 和 overload 的區(qū)別?

答:override 表示重寫,用于繼承類對基類中虛成員的實(shí)現(xiàn)

overload 表示重載,用于同一個(gè)類中同名方法不同參數(shù)(包括類型不同或個(gè)數(shù)不同)的實(shí)現(xiàn)

示例:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example07
{
    class Program
    {
        class BaseClass
        {
            public virtual void F()
            {
                Console.WriteLine("BaseClass.F");
            }
        }
        class DeriveClass : BaseClass
        {
            public override void F()
            {
                base.F();
                Console.WriteLine("DeriveClass.F");
            }
            public void Add(int Left, int Right)
            {
                Console.WriteLine("Add for Int: {0}", Left + Right);
            }
            public void Add(double Left, double Right)
            {
                Console.WriteLine("Add for int: {0}", Left + Right);
            }
        }
        static void Main(string[] args)
        {
            DeriveClass tmpObj = new DeriveClass();
            tmpObj.F();
            tmpObj.Add(1, 2);
            tmpObj.Add(1.1, 2.2);
 
            Console.ReadLine();
        }
    }
}

結(jié)果:
BaseClass.F
DeriveClass.F
Add for Int: 3
Add for int: 3.3

8.什么是索引指示器?

答:實(shí)現(xiàn)索引指示器(indexer)的類可以象數(shù)組那樣使用其實(shí)例后的對象,但與數(shù)組不同的是索引指示器的參數(shù)類型不僅限于int..

簡單來說,其本質(zhì)就是一個(gè)含參數(shù)屬性

示例:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example08
{
    public class Point
    {
        private double x, y;
        public Point(double X, double Y)
        {
            x = X;
            y = Y;
        }
        //重寫ToString方法方便輸出
        public override string ToString()
        {
            return String.Format("X: {0} , Y: {1}", x, y);
        }
    }
    public class Points
    {
        Point[] points;
        public Points(Point[] Points)
        {
            points = Points;
        }
        public int PointNumber
        {
            get 
            { 
                return points.Length; 
            }
        }    
        //實(shí)現(xiàn)索引訪問器
        public Point this[int Index]
        {
            get
            {
                return points[Index];
            }
        }
    }
 
    //感謝watson hua(http://huazhihao.cnblogs.com/)的指點(diǎn)
    //索引指示器的實(shí)質(zhì)是含參屬性,參數(shù)并不只限于int
    class WeatherOfWeek
    {
        public string this[int Index]
        {
            get
            {
                //注意case段使用return直接返回所以不需要break
                switch (Index)
                {
                    case 0:
                        {
                            return "Today is cloudy!";
                        }
                    case 5:
                        {
                            return "Today is thundershower!";
                        }
                    default:
                        {
                            return "Today is fine!";
                        }
                }
            }
        }
        public string this[string Day]
        {
            get
            {
                string TodayWeather = null;
                //switch的標(biāo)準(zhǔn)寫法
                switch (Day)
                {
                    case "Sunday":
                        {
                            TodayWeather = "Today is cloudy!";
                            break;
                        }
                    case "Friday":
                        {
                            TodayWeather = "Today is thundershower!";
                            break;
                        }
                    default:
                        {
                            TodayWeather = "Today is fine!";
                            break;
                        }
                }
                return TodayWeather;
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Point[] tmpPoints = new Point[10];
            for (int i = 0; i < tmpPoints.Length; i++)
            {
                tmpPoints[i] = new Point(i, Math.Sin(i));
            }
 
            Points tmpObj = new Points(tmpPoints);
            for (int i = 0; i < tmpObj.PointNumber; i++)
            {
                Console.WriteLine(tmpObj[i]);
            }
 
 
            string[] Week = new string[] { "Sunday", "Monday", "Tuesday", 
"Wednesday", "Thursday", "Friday", "Staurday"};
            WeatherOfWeek tmpWeatherOfWeek = new WeatherOfWeek();
            for (int i = 0; i < 6; i++)
            {
                Console.WriteLine(tmpWeatherOfWeek[i]);
            }
            foreach (string tmpDay in Week)
            {
                Console.WriteLine(tmpWeatherOfWeek[tmpDay]);
            }
 
            Console.ReadLine();
        }
    }
}

結(jié)果:
X: 0 , Y: 0
X: 1 , Y: 0.841470984807897
X: 2 , Y: 0.909297426825682
X: 3 , Y: 0.141120008059867
X: 4 , Y: -0.756802495307928
X: 5 , Y: -0.958924274663138
X: 6 , Y: -0.279415498198926
X: 7 , Y: 0.656986598718789
X: 8 , Y: 0.989358246623382
X: 9 , Y: 0.412118485241757
Today is cloudy!
Today is fine!
Today is fine!
Today is fine!
Today is fine!
Today is thundershower!
Today is cloudy!
Today is fine!
Today is fine!
Today is fine!
Today is fine!
Today is thundershower!
Today is fine!

9.new 修飾符是起什么作用?

答:new 修飾符與 new 操作符是兩個(gè)概念

new 修飾符用于聲明類或類的成員,表示隱藏了基類中同名的成員。而new 操作符用于實(shí)例化一個(gè)類型

new 修飾符只能用于繼承類,一般用于彌補(bǔ)基類設(shè)計(jì)的不足

new 修飾符和 override 修飾符不可同時(shí)用在一個(gè)成員上,因?yàn)檫@兩個(gè)修飾符在含義上互相排斥

示例:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example09
{
    class BaseClass
    {
        //基類設(shè)計(jì)者聲明了一個(gè)PI的公共變量,方便進(jìn)行運(yùn)算
        public static double PI = 3.1415;
    }
    class DervieClass : BaseClass
    {
        //繼承類發(fā)現(xiàn)該變量的值不能滿足運(yùn)算精度,于是可以通過new修飾符顯式隱藏基類中的聲明
        public new static double PI = 3.1415926;
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(BaseClass.PI);
            Console.WriteLine(DervieClass.PI);
 
            Console.ReadLine();
        }
    }
}

結(jié)果:
3.1415
3.1415926

10.this 關(guān)鍵字的含義?

答:this 是一個(gè)保留字,僅限于構(gòu)造函數(shù)和方法成員中使用

在類的構(gòu)造函數(shù)中出現(xiàn)表示對正在構(gòu)造的對象本身的引用,在類的方法中出現(xiàn)表示對調(diào)用該方法的對象的引用,在結(jié)構(gòu)的構(gòu)造上函數(shù)中出現(xiàn)表示對正在構(gòu)造的結(jié)構(gòu)的引用,在結(jié)構(gòu)的方法中出現(xiàn)表示對調(diào)用該方法的結(jié)果的引用

this 保留字不能用于靜態(tài)成員的實(shí)現(xiàn)里,因?yàn)檫@時(shí)對象或結(jié)構(gòu)并未實(shí)例化..在 C# 系統(tǒng)中,this 實(shí)際上是一個(gè)常量,所以不能使用 this++ 這樣的運(yùn)算

this 保留字一般用于限定同名的隱藏成員、將對象本身做為參數(shù)、聲明索引訪問器、判斷傳入?yún)?shù)的對象是否為本身

示例:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example10
{
    class Class1
    {
        private double c;
        private string value;
 
        public double C
        {
            get
            {
                return c;
            }
        }
        public Class1(double c)
        {
            //限定同名的隱藏成員
            this.c = c;
        }
        public Class1(Class1 value)
        {
            //用對象本身實(shí)例化自己沒有意義
            if (this != value)
            {
                c = value.C;
            }
        }
        public override string ToString()
        {
            //將對象本身做為參數(shù)

return string.Format("{0} Celsius = {1} Fahrenheit", c,

UnitTransClass.C2F(this));

        }
 
        //由于好奇,在這做了一個(gè)效率測試,想看看到底哪種方式訪問成員變量更快,結(jié)論:區(qū)別不大。。。
        public string Test1()
        {
            long vTickCount = Environment.TickCount;
            for (int i = 0; i < 10000000; i++)
                this.value = i.ToString();
            return string.Format("Have this.: {0} MSEL", Environment.TickCount - vTickCount);
        }
        public string Test2()
        {
            long vTickCount = Environment.TickCount;
            for (int i = 0; i < 10000000; i++)
                value = i.ToString();
            return string.Format("Don't have this.: {0} MSEL", Environment.TickCount - vTickCount);
        }
    }
    class UnitTransClass
    {
        public static double C2F(Class1 value)
        {
            //攝氏到華氏的轉(zhuǎn)換公式
            return 1.8 * value.C + 32;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Class1 tmpObj = new Class1(37.5);
 
            Console.WriteLine(tmpObj);
 
            Console.WriteLine(tmpObj.Test1());
            Console.WriteLine(tmpObj.Test2());
 
            Console.ReadLine();
        }
    }
}

結(jié)果:
37.5 Celsius = 99.5 Fahrenheit
Have this.: 4375 MSEL
Don't have this.: 4406 MSEL

11.可以使用抽象函數(shù)重寫基類中的虛函數(shù)嗎?

答:可以

需使用 new 修飾符顯式聲明,表示隱藏了基類中該函數(shù)的實(shí)現(xiàn)

或增加 override 修飾符,表示抽象重寫了基類中該函數(shù)的實(shí)現(xiàn)

示例:

    class BaseClass
    {
        public virtual void F()
        {
            Console.WriteLine("BaseClass.F");
        }
    }
    abstract class  DeriveClass1 : BaseClass
    {
        public abstract new void F();
    }
 
    //感謝watson hua(http://huazhihao.cnblogs.com/)的指點(diǎn)
    //是他提醒了我還可以用這種方法抽象重寫基類的虛方法
    abstract class DeriveClass2 : BaseClass
    {
        public abstract override void F();
    }

12.密封類可以有虛函數(shù)嗎?

答:可以,基類中的虛函數(shù)將隱式的轉(zhuǎn)化為非虛函數(shù),但密封類本身不能再增加新的虛函數(shù)

示例:

    class BaseClass
    {
        public virtual void F()
        {
            Console.WriteLine("BaseClass.F");
        }
    }
    sealed class DeriveClass : BaseClass
    {
        //基類中的虛函數(shù)F被隱式的轉(zhuǎn)化為非虛函數(shù)
 
        //密封類中不能再聲明新的虛函數(shù)G
        //public virtual void G()
        //{
        //    Console.WriteLine("DeriveClass.G");
        //}
    }

13.什么是屬性訪問器?

答:屬性訪問器(Property Accessor),包括 get 訪問器和 set 訪問器分別用于字段的讀寫操作
其設(shè)計(jì)目的主要是為了實(shí)現(xiàn)面向?qū)ο螅∣O)中的封裝思想。根據(jù)該思想,字段最好設(shè)為private,一個(gè)精巧的類最好不要直接把字段設(shè)為公有提供給客戶調(diào)用端直接訪問
另外要注意屬性本身并不一定和字段相聯(lián)系

14.abstract 可以和 virtual 一起使用嗎?可以和 override 一起使用嗎?

答:abstract 修飾符不可以和 static、virtual 修飾符一起使用

abstract 修飾符可以和 override 一起使用,參見第11點(diǎn)

示例:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example14
{
    class BaseClass
    {
        public virtual void F()
        {
            Console.WriteLine("BaseClass.F");
        }
    }
    abstract class DeriveClass1 : BaseClass
    {
        //在這里, abstract是可以和override一起使用的
        public abstract override void F();
    }
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

15.接口可以包含哪些成員?

答:接口可以包含屬性、方法、索引指示器和事件,
但不能包含常量、域、操作符、構(gòu)造函數(shù)和析構(gòu)函數(shù),而且也不能包含任何靜態(tài)成員

 16.類和結(jié)構(gòu)的區(qū)別?

答:類:類是引用類型在堆上分配,類的實(shí)例進(jìn)行賦值只是復(fù)制了引用,都指向同一段實(shí)際對象分配的內(nèi)存
類有構(gòu)造和析構(gòu)函數(shù)
類可以繼承和被繼承

結(jié)構(gòu):
結(jié)構(gòu)是值類型在棧上分配(雖然棧的訪問速度比較堆要快,但棧的資源有限放),結(jié)構(gòu)的賦值將分配產(chǎn)生一個(gè)新的對象。
結(jié)構(gòu)沒有構(gòu)造函數(shù),但可以添加。結(jié)構(gòu)沒有析構(gòu)函數(shù)
結(jié)構(gòu)不可以繼承自另一個(gè)結(jié)構(gòu)或被繼承,但和類一樣可以繼承自接口

 示例:根據(jù)以上比較,我們可以得出一些輕量級的對象最好使用結(jié)構(gòu),但數(shù)據(jù)量大或有復(fù)雜處理邏輯對象最好使用類。

如:Geoemtry(GIS 里的一個(gè)概論,在 OGC 標(biāo)準(zhǔn)里有定義) 最好使用類,而 Geometry 中點(diǎn)的成員最好使用結(jié)構(gòu)

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example16
{
    interface IPoint
    {
        double X
        {
            get;
            set;
        }
        double Y
        {
            get;
            set;
        }
        double Z
        {
            get;
            set;
        }
    }
    //結(jié)構(gòu)也可以從接口繼承
    struct Point: IPoint
    {
        private double x, y, z;
        //結(jié)構(gòu)也可以增加構(gòu)造函數(shù)
        public Point(double X, double Y, double Z)
        {
            this.x = X;
            this.y = Y;
            this.z = Z;
        }
        public double X
        {
            get { return x; }
            set { x = value; }
        }
        public double Y
        {
            get { return x; }
            set { x = value; }
        }
        public double Z
        {
            get { return x; }
            set { x = value; }
        }
    }
    //在此簡化了點(diǎn)狀Geometry的設(shè)計(jì),實(shí)際產(chǎn)品中還包含Project(坐標(biāo)變換)等復(fù)雜操作
    class PointGeometry
    {
        private Point value;
        public PointGeometry(double X, double Y, double Z)
        {
            value = new Point(X, Y, Z);
        }
        public PointGeometry(Point value)
        {
            //結(jié)構(gòu)的賦值將分配新的內(nèi)存
            this.value = value;
        }
        public double X
        {
            get { return value.X; }
            set { this.value.X = value; }
        }
        public double Y
        {
            get { return value.Y; }
            set { this.value.Y = value; }
        }
        public double Z
       {
            get { return value.Z; }
            set { this.value.Z = value; }
        }
        public static PointGeometry operator +(PointGeometry Left, PointGeometry Rigth)
        {
            return new PointGeometry(Left.X + Rigth.X, Left.Y + Rigth.Y, Left.Z + Rigth.Z);
        }
        public override string ToString()
        {
            return string.Format("X: {0}, Y: {1}, Z: {2}", value.X, value.Y, value.Z);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Point tmpPoint = new Point(1, 2, 3);
 
            PointGeometry tmpPG1 = new PointGeometry(tmpPoint);
            PointGeometry tmpPG2 = new PointGeometry(tmpPoint);
            tmpPG2.X = 4;
            tmpPG2.Y = 5;
            tmpPG2.Z = 6;
 
            //由于結(jié)構(gòu)是值類型,tmpPG1 和 tmpPG2 的坐標(biāo)并不一樣
            Console.WriteLine(tmpPG1);
            Console.WriteLine(tmpPG2);
 
            //由于類是引用類型,對tmpPG1坐標(biāo)修改后影響到了tmpPG3
            PointGeometry tmpPG3 = tmpPG1;
            tmpPG1.X = 7;
            tmpPG1.Y = 8;
            tmpPG1.Z = 9;
            Console.WriteLine(tmpPG1);
            Console.WriteLine(tmpPG3);
 
            Console.ReadLine();
        }
    }
}

結(jié)果:
X: 1, Y: 2, Z: 3
X: 4, Y: 5, Z: 6
X: 7, Y: 8, Z: 9
X: 7, Y: 8, Z: 9

17.接口的多繼承會帶來哪些問題?

答:C# 中的接口與類不同,可以使用多繼承,即一個(gè)子接口可以有多個(gè)父接口。但如果兩個(gè)父成員具有同名的成員,就產(chǎn)生了二義性(這也正是 C# 中類取消了多繼承的原因之一),這時(shí)在實(shí)現(xiàn)時(shí)最好使用顯式的聲明

示例:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example17
{
    class Program
    {
        //一個(gè)完整的接口聲明示例
        interface IExample
        {
            //屬性
            string P
            {
                get;
                set;
            }
            //方法
            string F(int Value);
            //事件
            event EventHandler E;
            //索引指示器
            string this[int Index]
            {
                get;
                set;
            }
        }
        interface IA
        {
            int Count { get; set;}
        }
        interface IB
        {
            int Count();
        }
        //IC接口從IA和IB多重繼承
        interface IC : IA, IB
        {
        }
        class C : IC
        {
            private int count = 100;
            //顯式聲明實(shí)現(xiàn)IA接口中的Count屬性
            int IA.Count
            {
                get { return 100; }
                set { count = value; }
            }
            //顯式聲明實(shí)現(xiàn)IB接口中的Count方法
            int IB.Count()
            {
                return count * count;
            }
        }
        static void Main(string[] args)
        {
            C tmpObj = new C();
 
            //調(diào)用時(shí)也要顯式轉(zhuǎn)換
            Console.WriteLine("Count property: {0}", ((IA)tmpObj).Count);
            Console.WriteLine("Count function: {0}", ((IB)tmpObj).Count());
 
            Console.ReadLine();
        }
    }
}

結(jié)果:
Count property: 100
Count function: 10000

18.抽象類和接口的區(qū)別?

答:抽象類(abstract class)可以包含功能定義和實(shí)現(xiàn),接口(interface)只能包含功能定義
抽象類是從一系列相關(guān)對象中抽象出來的概念, 因此反映的是事物的內(nèi)部共性;接口是為了滿足外部調(diào)用而定義的一個(gè)功能約定, 因此反映的是事物的外部特性
分析對象,提煉內(nèi)部共性形成抽象類,用以表示對象本質(zhì),即“是什么”
為外部提供調(diào)用或功能需要擴(kuò)充時(shí)優(yōu)先使用接口

19.別名指示符是什么?

答:通過別名指示符我們可以為某個(gè)類型起一個(gè)別名
主要用于解決兩個(gè)命名空間內(nèi)有同名類型的沖突或避免使用冗余的命名空間
別名指示符在所有命名空間最外層定義,作用域?yàn)檎麄(gè)單元文件。如果定義在某個(gè)命名空間內(nèi),那么它只在直接隸屬的命名空間內(nèi)起作用

示例:

Class1.cs:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01
{
    class Class1
    {
        public override string ToString()
        {
            return "com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01's Class1";
        }
    }
}

Class2.cs:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib02
{
    class Class1
    {
        public override string ToString()
        {
            return "com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib02's Class1";
        }
    }
}

主單元(Program.cs):

using System;
using System.Collections.Generic;
using System.Text;
 
//使用別名指示符解決同名類型的沖突
//在所有命名空間最外層定義,作用域?yàn)檎麄(gè)單元文件
using Lib01Class1 = com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01.Class1;
using Lib02Class2 = com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib02.Class1;
 
namespace Example19
{
    namespace Test1
    {
        //Test1Class1在Test1命名空間內(nèi)定義,作用域僅在Test1之內(nèi)
        using Test1Class1 = com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01.Class1;
 
        class Class1
        {
            //Lib01Class1和Lib02Class2在這可以正常使用
            Lib01Class1 tmpObj1 = new Lib01Class1();
            Lib02Class2 tmpObj2 = new Lib02Class2();
            //TestClass1在這可以正常使用
            Test1Class1 tmpObj3 = new Test1Class1();
        }
    }
    namespace Test2
    {
        using Test1Class2 = com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01.Class1;
 
        class Program
        {
            static void Main(string[] args)
            {
                //Lib01Class1和Lib02Class2在這可以正常使用
                Lib01Class1 tmpObj1 = new Lib01Class1();
                Lib02Class2 tmpObj2 = new Lib02Class2();
 
                //注意這里,TestClass1在這不可以正常使用。
                //因?yàn),在Test2命名空間內(nèi)不能使用Test1命名空間定義的別名
                //Test1Class1 tmpObj3 = new Test1Class1();
                
                //TestClass2在這可以正常使用
                Test1Class2 tmpObj3 = new Test1Class2();
 
                Console.WriteLine(tmpObj1);
                Console.WriteLine(tmpObj2);
                Console.WriteLine(tmpObj3);
 
                Console.ReadLine();
            }
        }
    }
}

結(jié)果:

com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01's Class1
com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib02's Class1
com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01's Class1

20.如何手工釋放資源?

答: .NET 平臺在內(nèi)存管理方面提供了GC(Garbage Collection),負(fù)責(zé)自動(dòng)釋放托管資源和內(nèi)存回收的工作。但在以下兩種情況需要我們手工進(jìn)行資源釋放:一、由于它無法對非托管資源進(jìn)行釋放,所以我們必須自己提供方法來釋放對象內(nèi)分配的非托管資源,比如你在對象的實(shí)現(xiàn)代碼中使用了一個(gè)COM對象;二、你的類在運(yùn)行是會產(chǎn)生大量實(shí)例(象 GIS 中的Geometry),必須自己手工釋放這些資源以提高程序的運(yùn)行效率

最理想的辦法是通過實(shí)現(xiàn)一個(gè)接口顯式的提供給客戶調(diào)用端手工釋放對象,System 命名空間內(nèi)有一個(gè) IDisposable 接口,拿來做這事非常合適,省得我們自己再聲明一個(gè)接口了

示例:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example20
{
    class Program
    {
        class Class1 : IDisposable
        {
            //析構(gòu)函數(shù),編譯后變成 protected void Finalize(),GC會在回收對象前會調(diào)用調(diào)用該方法
            ~Class1()
            {
                Dispose(false);
            }
 
            //通過實(shí)現(xiàn)該接口,客戶可以顯式地釋放對象,而不需要等待GC來釋放資源,據(jù)說那樣會降低效率
            void IDisposable.Dispose()
            {
                Dispose(true);
            }
 
            //將釋放非托管資源設(shè)計(jì)成一個(gè)虛函數(shù),提供在繼承類中釋放基類的資源的能力
            protected virtual void ReleaseUnmanageResources()
            {
                //Do something...
            }
 
            //私有函數(shù)用以釋放非托管資源
            private void Dispose(bool disposing)
            {
                ReleaseUnmanageResources();
 
                //為true時(shí)表示是客戶顯式調(diào)用了釋放函數(shù),需通知GC不要再調(diào)用對象的Finalize方法
                //為false時(shí)肯定是GC調(diào)用了對象的Finalize方法,所以沒有必要再告訴GC你不要調(diào)用我的Finalize方法啦
                if (disposing)
                {
                    GC.SuppressFinalize(this);
                }
            } 
        }
        static void Main(string[] args)
        {
            //tmpObj1沒有手工釋放資源,就等著GC來慢慢的釋放它吧
            Class1 tmpObj1 = new Class1();
 
            //tmpObj2調(diào)用了Dispose方法,傳說比等著GC來釋放它效率要調(diào)一些
            //個(gè)人認(rèn)為是因?yàn)橐饌(gè)對象的查看其元數(shù)據(jù),以確認(rèn)是否實(shí)現(xiàn)了Dispose方法吧
            //當(dāng)然最重要的是我們可以自己確定釋放的時(shí)間以節(jié)省內(nèi)存,優(yōu)化程序運(yùn)行效率
            Class1 tmpObj2 = new Class1();
            ((IDisposable)tmpObj2).Dispose();
        }
    }
}

21.P/Invoke是什么?

答:在受控代碼與非受控代碼進(jìn)行交互時(shí)會產(chǎn)生一個(gè)事務(wù)(transition) ,這通常發(fā)生在使用平臺調(diào)用服務(wù)(Platform Invocation Services),即P/Invoke
如調(diào)用系統(tǒng)的 API 或與 COM 對象打交道,通過 System.Runtime.InteropServices 命名空間
雖然使用 Interop 非常方便,但據(jù)估計(jì)每次調(diào)用事務(wù)都要執(zhí)行 10 到 40 條指令,算起來開銷也不少,所以我們要盡量少調(diào)用事務(wù).如果非用不可,建議本著一次調(diào)用執(zhí)行多個(gè)動(dòng)作,而不是多次調(diào)用每次只執(zhí)行少量動(dòng)作的原則

 22.StringBuilder 和 String 的區(qū)別?

答:String 在進(jìn)行運(yùn)算時(shí)(如賦值、拼接等)會產(chǎn)生一個(gè)新的實(shí)例,而 StringBuilder 則不會。所以在大量字符串拼接或頻繁對某一字符串進(jìn)行操作時(shí)最好使用 StringBuilder,不要使用 String
另外,對于 String 我們不得不多說幾句:
1.它是引用類型,在堆上分配內(nèi)存
2.運(yùn)算時(shí)會產(chǎn)生一個(gè)新的實(shí)例
3.String 對象一旦生成不可改變(Immutable)
4.定義相等運(yùn)算符(==!=)是為了比較 String 對象(而不是引用)的值

示例:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example22
{
    class Program
    {
        static void Main(string[] args)
        {
            const int cycle = 10000;
 
            long vTickCount = Environment.TickCount;
            String str = null;
            for (int i = 0; i < cycle; i++)
                str += i.ToString();
            Console.WriteLine("String: {0} MSEL", Environment.TickCount - vTickCount);
 
            vTickCount = Environment.TickCount;
            //看到這個(gè)變量名我就生氣,奇怪為什么大家都使它呢? :)
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < cycle; i++)
                sb.Append(i);
            Console.WriteLine("StringBuilder: {0} MSEL", Environment.TickCount - vTickCount);
 
            string tmpStr1 = "A";
            string tmpStr2 = tmpStr1;
            Console.WriteLine(tmpStr1);
            Console.WriteLine(tmpStr2);
            //注意后面的輸出結(jié)果,tmpStr1的值改變并未影響到tmpStr2的值
            tmpStr1 = "B";
            Console.WriteLine(tmpStr1);
            Console.WriteLine(tmpStr2);
 
            Console.ReadLine();
        }
    }
}

結(jié)果:
String: 375 MSEL
StringBuilder: 16 MSEL
A
A
B
A

23.explicit 和 implicit 的含義?

答:explicit 和 implicit 屬于轉(zhuǎn)換運(yùn)算符,如用這兩者可以讓我們自定義的類型支持相互交換

explicti 表示顯式轉(zhuǎn)換,如從 A -> B 必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換(B = (B)A)
implicit 表示隱式轉(zhuǎn)換,如從 B -> A 只需直接賦值(A = B)
隱式轉(zhuǎn)換可以讓我們的代碼看上去更漂亮、更簡潔易懂,所以最好多使用 implicit 運(yùn)算符。不過!如果對象本身在轉(zhuǎn)換時(shí)會損失一些信息(如精度),那么我們只能使用 explicit 運(yùn)算符,以便在編譯期就能警告客戶調(diào)用端

示例: 

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example23
{
    class Program
    {
        //本例靈感來源于大話西游經(jīng)典臺詞“神仙?妖怪?”--主要是我實(shí)在想不出什么好例子了
        class Immortal
        {
            public string name;
            public Immortal(string Name)
            {
                name = Name;
            }
            public static implicit operator Monster(Immortal value)
            {
                return new Monster(value.name + ":神仙變妖怪?偷偷下凡即可。。。");
            }
        }
        class Monster
        {
            public string name;
            public Monster(string Name)
            {
                name = Name;
            }
            public static explicit operator Immortal(Monster value)
            {
                return new Immortal(value.name + ":妖怪想當(dāng)神仙?再去修煉五百年!");
            }
        }
        static void Main(string[] args)
        {
            Immortal tmpImmortal = new Immortal("紫霞仙子");
            //隱式轉(zhuǎn)換
            Monster tmpObj1 = tmpImmortal;
            Console.WriteLine(tmpObj1.name);
 
            Monster tmpMonster = new Monster("孫悟空");
            //顯式轉(zhuǎn)換
            Immortal tmpObj2 = (Immortal)tmpMonster;
            Console.WriteLine(tmpObj2.name);
 
            Console.ReadLine();
        }
    }
}

結(jié)果:
紫霞仙子:神仙變妖怪?偷偷下凡即可。。。
孫悟空:妖怪想當(dāng)神仙?再去修煉五百年!

 24.params 有什么用?

答:params 關(guān)鍵字在方法成員的參數(shù)列表中使用,為該方法提供了參數(shù)個(gè)數(shù)可變的能力
它在只能出現(xiàn)一次并且不能在其后再有參數(shù)定義,之前可以

示例:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace ConsoleApplication1
{
    class App
    {
        //第一個(gè)參數(shù)必須是整型,但后面的參數(shù)個(gè)數(shù)是可變的。
        //而且由于定的是object數(shù)組,所有的數(shù)據(jù)類型都可以做為參數(shù)傳入
        public static void UseParams(int id, params object[] list)
        {
            Console.WriteLine(id);
            for (int i = 0; i < list.Length; i++)
            {
                Console.WriteLine(list[i]);
            }
        }
 
        static void Main()
        {
            //可變參數(shù)部分傳入了三個(gè)參數(shù),都是字符串類型
            UseParams(1, "a", "b", "c");
            //可變參數(shù)部分傳入了四個(gè)參數(shù),分別為字符串、整數(shù)、浮點(diǎn)數(shù)和雙精度浮點(diǎn)數(shù)數(shù)組
            UseParams(2, "d", 100, 33.33, new double[] { 1.1, 2.2 });
 
            Console.ReadLine();
        }
    }
}

結(jié)果:
1
a
b
c
2
d
100
33.33
System.Double[]

25.什么是反射?

答:反射,Reflection,通過它我們可以在運(yùn)行時(shí)獲得各種信息,如程序集、模塊、類型、字段、屬性、方法和事件

通過對類型動(dòng)態(tài)實(shí)例化后,還可以對其執(zhí)行操作

簡單來說就是用string可以在runtime為所欲為的東西,實(shí)際上就是一個(gè).net framework內(nèi)建的萬能工廠

一般用于插件式框架程序和設(shè)計(jì)模式的實(shí)現(xiàn),當(dāng)然反射是一種手段可以充分發(fā)揮其能量來完成你想做的任何事情(前面好象見過一位高人用反射調(diào)用一個(gè)官方類庫中未說明的函數(shù)。。。)

示例:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example25Lib
{
    public class Class1
    {
        private string name;
        private int age;
 
        //如果顯式的聲明了無參數(shù)構(gòu)造函數(shù),客戶端只需要用程序集的CreateInstance即可實(shí)例化該類
        //在此特意不實(shí)現(xiàn),以便在客戶調(diào)用端體現(xiàn)構(gòu)造函數(shù)的反射實(shí)現(xiàn)
        //public Class1()
        //{
        //}
        public Class1(string Name, int Age)
        {
            name = Name;
            age = Age;
        }
        public void ChangeName(string NewName)
        {
            name = NewName;
        }
        public void ChangeAge(int NewAge)
        {
            age = NewAge;
        }
        public override string ToString()
        {
            return string.Format("Name: {0}, Age: {1}", name, age);
        }
    }
}

反射實(shí)例化對象并調(diào)用其方法,屬性和事件的反射調(diào)用略去

using System;
using System.Collections.Generic;
using System.Text;
 
//注意添加該反射的命名空間
using System.Reflection;
 
namespace Example25
{
    class Program
    {
        static void Main(string[] args)
        {
            //加載程序集
            Assembly tmpAss = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "Example25Lib.dll");
 
            //遍歷程序集內(nèi)所有的類型,并實(shí)例化
            Type[] tmpTypes = tmpAss.GetTypes();
            foreach (Type tmpType in tmpTypes)
            {
                //獲取第一個(gè)類型的構(gòu)造函數(shù)信息
                ConstructorInfo[] tmpConsInfos = tmpType.GetConstructors();
                foreach (ConstructorInfo tmpConsInfo in tmpConsInfos)
                {
                    //為構(gòu)造函數(shù)生成調(diào)用的參數(shù)集合
                    ParameterInfo[] tmpParamInfos = tmpConsInfo.GetParameters(); 
                    object[] tmpParams = new object[tmpParamInfos.Length];
                    for (int i = 0; i < tmpParamInfos.Length; i++)
                    {
                        tmpParams[i] = tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);
                        if (tmpParamInfos[i].ParameterType.FullName == "System.String")
                        {
                            tmpParams[i] = "Clark";
                        }
                    }
 
                    //實(shí)例化對象
                    object tmpObj = tmpConsInfo.Invoke(tmpParams);
                    Console.WriteLine(tmpObj);
 
                    //獲取所有方法并執(zhí)行
                    foreach (MethodInfo tmpMethod in tmpType.GetMethods())
                    {
                        //為方法的調(diào)用創(chuàng)建參數(shù)集合
                        tmpParamInfos = tmpMethod.GetParameters();
                        tmpParams = new object[tmpParamInfos.Length];
                        for (int i = 0; i < tmpParamInfos.Length; i++)
                        {

tmpParams[i] = tmpAss.CreateInstance

    (tmpParamInfos[i].ParameterType.FullName);

                            if (tmpParamInfos[i].ParameterType.FullName == "System.String")
                            {
                                tmpParams[i] = "Clark Zheng";
                            }
                            if (tmpParamInfos[i].ParameterType.FullName == "System.Int32")
                            {
                                tmpParams[i] = 27;
                            }
                        }
                        tmpMethod.Invoke(tmpObj, tmpParams);
                    }
 
                    //調(diào)用完方法后再次打印對象,比較結(jié)果
                    Console.WriteLine(tmpObj);
                }
            }
 
            Console.ReadLine();
        }
    }
}

結(jié)果:
Name: Clark, Age: 0
Name: Clark Zheng, Age: 27
總結(jié):通過以上我們可以理解C#中難以理解的概念和示例代碼.
軟件測試題目
一、   判斷題 (每題2分,20)

1、軟件測試就是為了驗(yàn)證軟件功能實(shí)現(xiàn)的是否正確,是否完成既定目標(biāo)的活動(dòng),所以軟件測試在軟件工程的后期才開始具體的工作。 (初級)           ×

2、發(fā)現(xiàn)錯(cuò)誤多的模塊,殘留在模塊中的錯(cuò)誤也多。( ) (初級)

3、測試人員在測試過程中發(fā)現(xiàn)一處問題,如果問題影響不大,而自己又可以修改,應(yīng)立即將此問題正確修改,以加快、提高開發(fā)的進(jìn)程。( × )(初級)

4、單元測試通常應(yīng)該先進(jìn)行人工走查,再以白盒法為主,輔以黑盒法進(jìn)行動(dòng)態(tài)測試。

)(中級)

5、功能測試是系統(tǒng)測試的主要內(nèi)容,檢查系統(tǒng)的功能、性能是否與需求規(guī)格說明相同。( )(中級)

6、軟件質(zhì)量管理即QMQAQC構(gòu)成,軟件測試屬于QC的核心工作內(nèi)容。(√)(高級)

7、軟件測試只能發(fā)現(xiàn)錯(cuò)誤,但不能保證測試后的軟件沒有錯(cuò)誤。(√)

8、軟件就是程序。(X)

9、測試只要做到語句覆蓋和分支覆蓋,就可以發(fā)現(xiàn)程序中的所有錯(cuò)誤。(X)

10、I18N測試是指對產(chǎn)品做出具有國際性的規(guī)劃,而L10N測試則是指對軟件做出符合本地需求更改工作。(√)【高級】

.NET工程(三)

1.面向?qū)ο蟮乃枷胫饕ㄊ裁矗?/span>

繼承多態(tài)封裝

封裝:用抽象的數(shù)據(jù)類型將數(shù)據(jù)和基于數(shù)據(jù)的操作封裝在一起,數(shù)據(jù)被保護(hù)在抽象數(shù)據(jù)類型內(nèi)部。

繼承:子類擁有父類的所有數(shù)據(jù)和操作。

多態(tài):一個(gè)程序中同名的不同方法共存的情況。

有兩種形式的多態(tài)–重載與重寫。

 

2.什么是ASP.net中的用戶控件

用戶控件就是.ascx擴(kuò)展名的東西嘍,可以拖到不同的頁面中調(diào)用,以節(jié)省代碼.比如登陸可能在多個(gè)頁面上有,就可以做成用戶控件,但是有一個(gè)問題就是用戶控件拖到不同級別的目錄下后里面的圖片等的相對路徑會變得不準(zhǔn)確,需要自已寫方法調(diào)整.

問這樣的問題,一般是迷惑你.因?yàn)樾率诌是分不清楚用戶控件和服務(wù)器控件(也稱自定義控件)..用戶控件一般用在內(nèi)容多為靜態(tài),或者少許會改變的情況下..用的比較大..類似ASP中的include..但是功能要強(qiáng)大的多..

C#中,string str = null string str = “”的區(qū)別。
答:string str = null 是不給他分配內(nèi)存空間,string str = "" 給它分配長度為空字符串的內(nèi)存空間
請?jiān)斒鲈?/span>dotnet中類(class)與結(jié)構(gòu)(struct)的異同
Class可以被實(shí)例化,屬于引用類型,是分配在內(nèi)存的堆上的,Struct屬于值類型,是分配在內(nèi)存的棧上的.

DataReader和DataSet的異同
DataReader和DataSet最大的區(qū)別在于,DataReader使用時(shí)始終占用SqlConnection,在線操作數(shù)據(jù)庫..任何對SqlConnection的操作都會引發(fā)DataReader的異常..因?yàn)镈ataReader每次只在內(nèi)存中加載一條數(shù)據(jù),所以占用的內(nèi)存是很小的..因?yàn)镈ataReader的特殊性和高性能.所以DataReader是只進(jìn)的..你讀了第一條后就不能再去讀取第一條了..
DataSet則是將數(shù)據(jù)一次性加載在內(nèi)存中.拋棄數(shù)據(jù)庫連接..讀取完畢即放棄數(shù)據(jù)庫連接..因?yàn)镈ataSet將數(shù)據(jù)全部加載在內(nèi)存中.所以比較消耗內(nèi)存...但是確比DataReader要靈活..可以動(dòng)態(tài)的添加行,列,數(shù)據(jù).對數(shù)據(jù)庫進(jìn)行回傳更新操作.

8.C#中的接口和類有什么異同。

接口和類都是類,不同的事,接口只包含方法或?qū)傩缘穆暶,不包含具體實(shí)現(xiàn)方法的代碼,接口可以實(shí)現(xiàn)多繼承,而類只能是單繼承,繼承接口的類必須實(shí)現(xiàn)接口中聲明的方法或?qū)傩。接口主要定義一種規(guī)范,統(tǒng)一調(diào)用方法,在大型項(xiàng)目中接口正發(fā)揮日益重要的作用

類是方法功能的實(shí)現(xiàn)和集合,接口是規(guī)范類.約束類.
接口,是可以多繼承,類只有單繼承.接口強(qiáng)調(diào)了你必須實(shí)現(xiàn),而沒有具本實(shí)現(xiàn)的方法和虛類有點(diǎn)相似

Override與重載有什么區(qū)別?
一個(gè)是重寫父類函數(shù),一個(gè)是同一個(gè)函數(shù)的幾種形式

觸發(fā)器的作用

觸發(fā)器可以查詢其它表,而且可以包含復(fù)雜的 SQL 語句。它們主要用于強(qiáng)制復(fù)雜的業(yè)務(wù)規(guī)則或要求。觸發(fā)器還有助于強(qiáng)制引用完整性,以便在添加、更新或刪除表中的行時(shí)保留表之間已定義的關(guān)系。
保證數(shù)據(jù)庫操作變更能接到通知

<%# %> 和 <% %> 有什么區(qū)別?
<%# %>表示綁定的數(shù)據(jù)源
<% %>是服務(wù)器端代碼塊

常見的設(shè)計(jì)模式

抽象工廠模式、適配器模式、外觀模式 command命令模式,橋接模式,組合模式,裝飾模式,狀態(tài)模式,備忘錄模式等。
??軟件設(shè)計(jì)模式太多,就我的理解簡單說一下最常見的MVC模式。
??MVC模式是1996年由Buschmann提出的:
??模型(Model):就是封裝數(shù)據(jù)和所有基于對這些數(shù)據(jù)的操作。
??視圖(View):就是封裝的是對數(shù)據(jù)顯示,即用戶界面。
??控制器(Control):就是封裝外界作用于模型的操作和對數(shù)據(jù)流向的控制等。

??

3.什么叫應(yīng)用程序域?什么是受管制的代碼?什么是強(qiáng)類型系統(tǒng)?什么是裝箱和拆箱?什么是重載?CTS、CLSCLR分別作何解釋?

 

4.列舉一下你所了解的XML技術(shù)及其應(yīng)用

 

5.值類型和引用類型的區(qū)別?寫出C#的樣例代碼。

dotnet中有兩大類數(shù)據(jù)類型,即值類型和引用類型,值類型存貯在棧中,而引用類型存貯在動(dòng)態(tài)的堆中,棧是先進(jìn)先出的有系統(tǒng)管理的空間,而堆是由應(yīng)用程序控制的可隨時(shí)申請和釋放該空間,在Donnet中一般情況下有垃圾收集器處理,他們的不同導(dǎo)致在編程上的不同。
       
例:                     StringBuilder a=new StringBuilder();//StringBuilder的一個(gè)首地址傳給a
                                     StringBuilder b=a;//
StringBuilder的一個(gè)首地址傳給b
                                      b.Append("mxh");
                                      Console.WriteLine(a);
                                       a=null;
                                       Console.WriteLine(b);
              
輸出結(jié)果:mxh
                                   mxh
       "a=null"
的意思是:a的引用置為空但此時(shí)StringBuilder的堆空間并沒有被釋放,因此在此之后,輸出b時(shí),仍然可以輸出mxh  

 

6.ADO.net中常用的對象有哪些?分別描述一下。

 

7.如何理解委托?

 

C# 中的委托類似于 C C++ 中的函數(shù)指針。使用委托使程序員可以將方法引用封裝在委托對象內(nèi)。然后可以將該委托對象傳遞給可調(diào)用所引用方法的代碼,而不必在編譯時(shí)知道將調(diào)用哪個(gè)方法。與 C C++ 中的函數(shù)指針不同,委托是面向?qū)ο、類型安全的,并且是安全的?/span>

 

9.。net中讀寫數(shù)據(jù)庫需要用到哪些類?他們的作用

 

10.UDP連接和TCP連接的異同。

 

11.ASP.net的身份驗(yàn)證方式有哪些?分別是什么原理?

window驗(yàn)證:為每個(gè)用戶開啟window帳號,驗(yàn)證其身份.安全性較高.
forms
驗(yàn)證:為每個(gè)登陸用戶寫入一個(gè)身份驗(yàn)證票據(jù)..web使用最廣的驗(yàn)證方式..靈活方便.

 

12.進(jìn)程和線程分別怎么理解?

 

13.什么是code-Behind技術(shù)。

新建一個(gè)VS.NET下的項(xiàng)目..看到ASPX,RESXCS三個(gè)后綴的文件了嗎??這個(gè)就是代碼分離.實(shí)現(xiàn)了HTML代碼和服務(wù)器代碼分離.方便代碼編寫和整理.

 

14.活動(dòng)目錄的作用。

活動(dòng)目錄是window2000的最重要的功能.可以將用戶信息全部集成起來,登陸以后可以訪問多個(gè)不同的網(wǎng)絡(luò)服務(wù)..

.

15..net中讀寫XML的類都?xì)w屬于哪些命名空間?

System.XML

 

16.解釋一下UDDIWSDL的意義及其作用。

 

17.什么是SOAP,有哪些應(yīng)用。

simple object access protocal,簡單對象接受協(xié)議.xml為基本編碼結(jié)構(gòu),建立在已有通信協(xié)議上(http,不過據(jù)說ms在搞最底層的架構(gòu)在tcp/ip上的soap)的一種規(guī)范
是微軟大力推廣的Web Service使用的協(xié)議..

 

18.如何部署一個(gè)ASP.net頁面。

 

19.如何理解.net中的垃圾回收機(jī)制。

 

如果發(fā)現(xiàn)內(nèi)存不夠,則垃圾回收器,將全部對象作為無效對象(被回收對象),然后先將全局變量,static,處于活動(dòng)中的局部變量,以及當(dāng)前CG指針指向的對象放入一個(gè)表中.然后
會搜索新列表中的對象所引用的對象.加入列表中,其他沒有被加入列表的對象都會被回收.

 

20.常用的調(diào)用webservice方法有哪些?

我一般用的是WSDL..或者web引用..

 

21列舉一下你所了解的XML技術(shù)及其應(yīng)用
.xml可以用來做網(wǎng)頁(xslt) xml可以當(dāng)作數(shù)據(jù)庫 xml可以用來保存對象的系列化
xml用于配置,用于保存靜態(tài)數(shù)據(jù)類型.接觸XML最多的是web Services..config

 

 C# property attribute的區(qū)別,他們各有什么用處,這種機(jī)制的好處在哪里?
一個(gè)是屬性,用于存取類的字段,一個(gè)是特性,用來標(biāo)識類,方法等的附加性質(zhì)

 

C#可否對內(nèi)存進(jìn)行直接的操作?
可以

維護(hù)數(shù)據(jù)庫的完整性、一致性、你喜歡用觸發(fā)器還是自寫業(yè)務(wù)邏輯?為什么

觸發(fā)器,性能好,事務(wù)性

ADO。NET相對于ADO等主要有什么改進(jìn)?

新增dataset等,不需要隨時(shí)保持連接,性能提高

 

ASP。NETASP相比,主要有哪些進(jìn)步?
asp解釋型,aspx編譯型,性能提高,有利于保護(hù)源碼

 

C#中的委托是什么?事件是不是一種委托?
委托是一種安全的函數(shù)指針,事件是一種消息機(jī)制

 

你對XMLHTTP、WEBSERVICE 了解嗎?簡單描述其特點(diǎn)、作用
xmlhttp可以主動(dòng)獲取遠(yuǎn)端web代碼,類似HttpWebRequest

接口和抽象類有什么區(qū)別?你選擇使用接口和抽象類的依據(jù)是什么?
接口用于規(guī)范,抽象類用于共性。

存儲過程和函數(shù)的區(qū)別
存儲過程是編譯好的存儲在數(shù)據(jù)庫的操作,函數(shù)不用說了.

事務(wù)是什么?
具有原子性特點(diǎn)

游標(biāo)的作用?如何知道游標(biāo)已經(jīng)到了最后?
指示當(dāng)前記錄的位置,檢查NULL

觸發(fā)器分為事前觸發(fā)和事后觸發(fā),這兩種觸發(fā)有和區(qū)別。語句級觸發(fā)和行級觸發(fā)有何區(qū)別。
一個(gè)是操作前,一個(gè)是操作后

請說明在.net中常用的幾種頁面間傳遞參數(shù)的方法,并說出他們的優(yōu)缺點(diǎn)。
session(viewstate) 簡單,但易丟失
application 全局
cookie 簡單,但可能不支持,可能被偽造
input type="hidden" 簡單,可能被偽造
url參數(shù) 簡單,顯示于地址欄,長度有限
數(shù)據(jù)庫 穩(wěn)定,安全,但性能相對弱

請說明.net中的錯(cuò)誤處理機(jī)制,并舉例
try catch final

請說出強(qiáng)名的含義
具有自己的key,可以在GAC為公用

請列出c#中幾種循環(huán)的方法,并指出他們的不同
for wile foreach

請指出.net中所有類型的基類
object

請指出GAC的含義
全局程序集緩存

值類型與引用類型有什么區(qū)別?
值和指針的區(qū)別

怎樣理解靜態(tài)變量?
所有實(shí)例公用一個(gè)的變量

向服務(wù)器發(fā)送請求有幾種方式?
get post

如果在一個(gè)B/S結(jié)構(gòu)的系統(tǒng)中需要傳遞變量值,但是又不能使用Session、Cookie、Application,您有幾種方法進(jìn)行處理?
input type=""
url
數(shù)據(jù)庫

用.net做B/S結(jié)構(gòu)的系統(tǒng),您是用幾層結(jié)構(gòu)來開發(fā),每一層之間的關(guān)系以及為什么要這樣分層?
三層,表現(xiàn),邏輯,數(shù)據(jù), 安全性,維護(hù)性

軟件開發(fā)過程一般有幾個(gè)階段?每個(gè)階段的作用?
需求分析,架構(gòu)設(shè)計(jì),代碼編寫,QA,部署

通過超鏈接怎樣傳遞中文參數(shù)?
URLEncode URLDecode

請編程遍歷頁面上所有TextBox控件并給它賦值為string.Empty
foreach

有哪幾種方法可以實(shí)現(xiàn)一個(gè)類存取另外一個(gè)類的成員函數(shù)及屬性,并請舉列來加以說明和分析.
同一個(gè)名稱控件直接,或者反射

如果需記錄類的實(shí)例個(gè)數(shù),該如何實(shí)現(xiàn),請寫一個(gè)簡單的類于以證明.
const static int classNum=0;
classNum++;

A類是B類的基類,并且都有自己的構(gòu)造,析構(gòu)函數(shù),請舉例證明B類從實(shí)例化到消亡過程中構(gòu)造,析構(gòu)函數(shù)的執(zhí)行過程.
構(gòu)造先父后子,析夠反之

需要實(shí)現(xiàn)對一個(gè)字符串的處理,首先將該字符串首尾的空格去掉,如果字符串中間還有連續(xù)空格的話,僅保留一個(gè)空格,即允許字符串中間有多個(gè)空格,但連續(xù)的空格數(shù)不可超過一個(gè).
string inputStr=" xx xx ";
inputStr=Regex.Replace(inputStr.Trim()," *"," ");

在c#中using和new這兩個(gè)關(guān)鍵字有什么意義,請寫出你所知道的意義?

using 指令 和語句 new 創(chuàng)建實(shí)例 new 隱藏基類中方法
using 引入名稱空間或者使用非托管資源
new 新建實(shí)例或者隱藏父類方法

談?wù)勵(lì)惡徒Y(jié)構(gòu)的區(qū)別
類是引用類型、結(jié)構(gòu)是值類型

什么叫做SQL注入,如何防止?請舉例說明。
利用sql關(guān)鍵字對網(wǎng)站進(jìn)行攻擊。過濾關(guān)鍵字'等

下面這段代碼輸出什么?為什么?
int i=5;
int j=5;
if (Object.ReferenceEquals(i,j))
Console.WriteLine("Equal");
else
Console.WriteLine("Not Equal");

寫一個(gè)實(shí)現(xiàn)對一段字符串翻轉(zhuǎn)的方法,附加一些條件,如其中包括“,”、“.”,對其設(shè)計(jì)測試用例
inputStr=inputStr.ToCharArray().Reverse().ToString();

什么是反射?
動(dòng)態(tài)獲取程序集信息

用Singleton如何寫設(shè)計(jì)模式
static屬性里面new ,構(gòu)造函數(shù)private

C#中的垃圾回收機(jī)制是怎樣的?
三個(gè)generation,當(dāng)每個(gè)generation內(nèi)存滿了的時(shí)候檢查引用,無引用就回收內(nèi)存

什么是Application Pool?
Web應(yīng)用,類似Thread Pool,提高并發(fā)性能

鏈表和數(shù)組的區(qū)別,各有什么優(yōu)缺點(diǎn).
一個(gè)可以動(dòng)態(tài)增長,一個(gè)固定(VB中可以Redim),性能數(shù)組教好

什么是友元函數(shù)?
friendly聲明,可以訪問protect級別方法

什么是虛函數(shù)?
可以被重寫

什么是抽象函數(shù)?
必須被重寫

什么是內(nèi)存泄漏,怎樣最簡單的方法判斷被存泄漏 ?
C++,C中忘了釋放內(nèi)存,內(nèi)存不會再次分配

1SQL Server的兩種索引是何形式?索引的作用?索引的優(yōu)缺點(diǎn)?
cluster和非cluster,加速查找,占用額外控件,維護(hù)索引耗費(fèi)時(shí)間

什么是XML?
可擴(kuò)展標(biāo)記語言,可以做配置文件,可以傳輸數(shù)據(jù),可以存儲數(shù)據(jù)

簡述 private、 protected、 public、 internal 修飾符的訪問權(quán)限。
private : 私有成員, 在類的內(nèi)部才可以訪問。
protected : 保護(hù)成員,該類內(nèi)部和繼承類中可以訪問。
public : 公共成員,完全公開,沒有訪問限制。
internal: 在同一命名空間內(nèi)可以訪問。

進(jìn)程和線程的區(qū)別

進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的單位;線程是CPU調(diào)度和分派的單位,一個(gè)進(jìn)程可以有多個(gè)線程,這些線程共享這個(gè)進(jìn)程的資源。

成員變量和成員函數(shù)前加static的作用

它們被稱為常成員變量和常成員函數(shù),又稱為類成員變量和類成員函數(shù)。分別用來反映類的狀態(tài)。比如類成員變量可以用來統(tǒng)計(jì)類實(shí)例的數(shù)量,類成員函數(shù)負(fù)責(zé)這種統(tǒng)計(jì)的動(dòng)作。

malloc和new的區(qū)別

new是C++的關(guān)鍵字。malloc在分配內(nèi)存時(shí)必須按給出的字節(jié)分配,new可以按照對象的大小自動(dòng)分配,并且能調(diào)用構(gòu)造函數(shù)?梢哉fnew是對象的對象,而malloc不是。本質(zhì)上new分配內(nèi)存時(shí),還會在實(shí)際內(nèi)存塊的前后加上附加信息,所以new所使用的內(nèi)存大小比malloc多。

堆和棧的區(qū)別

棧:由編譯器自動(dòng)分配、釋放。在函數(shù)體中定義的變量通常在棧上。
堆:一般由程序員分配釋放。用new、malloc等分配內(nèi)存函數(shù)分配得到的就是在堆上。
棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),而堆則是C/C++函數(shù)庫提供的。
棧是系統(tǒng)提供的功能,特點(diǎn)是快速高效,缺點(diǎn)是有限制,數(shù)據(jù)不靈活;而棧是函數(shù)庫提供的功能,特點(diǎn)是靈活方便,數(shù)據(jù)適應(yīng)面廣泛,但是效率有一定降低。棧是系統(tǒng)數(shù)據(jù)結(jié)構(gòu),對于進(jìn)程/線程是唯一的;堆是函數(shù)庫內(nèi)部數(shù)據(jù)結(jié)構(gòu),不一定唯一。不同堆分配的內(nèi)存無法互相操作。?臻g分靜態(tài)分配和動(dòng)態(tài)分配兩種。靜態(tài)分配是編譯器完成的,比如自動(dòng)變量(auto)的分配。動(dòng)態(tài)分配由alloca函數(shù)完成。棧的動(dòng)態(tài)分配無需釋放(是自動(dòng)的),也就沒有釋放函數(shù)。為可移植的程序起見,棧的動(dòng)態(tài)分配操作是不被鼓勵(lì)的!堆空間的分配總是動(dòng)態(tài)的,雖然程序結(jié)束時(shí)所有的數(shù)據(jù)空間都會被釋放回系統(tǒng),但是精確的申請內(nèi)存/釋放內(nèi)存匹配是良好程序的基本要素。

在.Net中,類System.Web.UI.Page 可以被繼承么?
可以

你覺得ASP.NET 2.0(VS2005)和你以前使用的開發(fā)工具(.Net 1.0或其他)有什么最大的區(qū)別?你在以前的平臺上使用的哪些開發(fā)思想(pattern / architecture)可

1 ASP.NET 2.0 把一些代碼進(jìn)行了封裝打包,所以相比1.0相同功能減少了很多代碼.
2 同時(shí)支持代碼分離和頁面嵌入服務(wù)器端代碼兩種模式,以前1.0版本,.NET提示幫助只有在分離的代碼文件,無法在頁面嵌入服務(wù)器端代碼獲得幫助提示,
3 代碼和設(shè)計(jì)界面切換的時(shí)候,2.0支持光標(biāo)定位.這個(gè)我比較喜歡
4 在綁定數(shù)據(jù),做表的分頁.UPDATE,DELETE,等操作都可以可視化操作,方便了初學(xué)者
5, 在ASP.NET中增加了40多個(gè)新的控件,減少了工作量

.net的錯(cuò)誤處理機(jī)制是什么
.net錯(cuò)誤處理機(jī)制采用try->catch->finally結(jié)構(gòu),發(fā)生錯(cuò)誤時(shí),層層上拋,直到找到匹配的Catch為止。

重載與覆蓋的區(qū)別
1、方法的覆蓋是子類和父類之間的關(guān)系,是垂直關(guān)系;方法的重載是同一個(gè)類中方法之間的關(guān)系,是水平關(guān)系。
2、覆蓋只能由一個(gè)方法,或只能由一對方法產(chǎn)生關(guān)系;方法的重載是多個(gè)方法之間的關(guān)系。
3、覆蓋要求參數(shù)列表相同;重載要求參數(shù)列表不同。
4、覆蓋關(guān)系中,調(diào)用那個(gè)方法體,是根據(jù)對象的類型(對象對應(yīng)存儲空間類型)來決定;重載關(guān)系,是根據(jù)調(diào)用時(shí)的實(shí)參表與形參表來選擇方法體的。

簡要談一下您對微軟.NET 構(gòu)架下remoting和webservice兩項(xiàng)技術(shù)的理解以及實(shí)際中的應(yīng)用。
WS主要是可利用HTTP,穿透防火墻。而Remoting可以利用TCP/IP,二進(jìn)制傳送提高效率。

C#中的委托是什么?事件是不是一種委托?
委托是一種安全的函數(shù)指針,事件是一種消息機(jī)制

new有幾種用法
第一種:new Class();
第二種:覆蓋方法
public new XXXX(){}
第三種:new 約束指定泛型類聲明中的任何類型參數(shù)都必須有公共的無參數(shù)構(gòu)造函數(shù)。
如何把一個(gè)array復(fù)制到arrayList里
foreach( object o in array )arrayList.Add(o);
datagrid.datasouse可以連接什么數(shù)據(jù)源
dataset,datatable,dataview , IList
概述反射和序列化
反射:程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝程序集、模塊和類型的對象。您可以使用反射動(dòng)態(tài)地創(chuàng)建類型的實(shí)例,將類型綁定到現(xiàn)有對象,或從現(xiàn)有對象中獲取類型。然后,可以調(diào)用類型的方法或訪問其字段和屬性
序列化:序列化是將對象轉(zhuǎn)換為容易傳輸?shù)母袷降倪^程。例如,可以序列化一個(gè)對象,然后使用 HTTP 通過 Internet 在客戶端和服務(wù)器之間傳輸該對象。在另一端,反序列化將從該流重新構(gòu)造對象。
概述o/r mapping 的原理>
利用反射,配置 將類于數(shù)據(jù)庫表映射
用sealed修飾的類有什么特點(diǎn)
sealed 修飾符用于防止從所修飾的類派生出其它類。如果一個(gè)密封類被指定為其他類的基類,則會發(fā)生編譯時(shí)錯(cuò)誤。
密封類不能同時(shí)為抽象類。
sealed 修飾符主要用于防止非有意的派生,但是它還能促使某些運(yùn)行時(shí)優(yōu)化。具體說來,由于密封類永遠(yuǎn)不會有任何派生類,所以對密封類的實(shí)例的虛擬函數(shù)成員的調(diào)用可以轉(zhuǎn)換為非虛擬調(diào)用來處理。

什么叫應(yīng)用程序域?什么是受管制的代碼?什么是強(qiáng)類型系統(tǒng)?什么是裝箱和拆箱?什么是重載?CTS、CLS和CLR分別作何解釋?
答:裝箱就是把值類型轉(zhuǎn)成引用類型,從MS IL角度看好像是boxing,沒記錯(cuò)的話是把值從堆棧轉(zhuǎn)到堆中.拆箱相反,重載就是指一個(gè)方法名同,參數(shù)個(gè)數(shù)不同,返回值可以相同的方法.CLR是通用語言運(yùn)行時(shí),其它的不清楚.
如何理解委托?
答:據(jù)說相當(dāng)于函數(shù)指針,定義了委托就可以在不調(diào)用原方法名稱的情況下調(diào)用那個(gè)方法.
委托具有以下特點(diǎn):
委托類似于 C++ 函數(shù)指針,但它是類型安全的。
委托允許將方法作為參數(shù)進(jìn)行傳遞。
委托可用于定義回調(diào)方法。
委托可以鏈接在一起;例如,可以對一個(gè)事件調(diào)用多個(gè)方法。
方法不需要與委托簽名精確匹配。有關(guān)更多信息,請參見協(xié)變和逆變。
C# 2.0 版引入了匿名方法的概念,此類方法允許將代碼塊作為參數(shù)傳遞,以代替單獨(dú)定義的方法。
UDP連接和TCP連接的異同。
前者只管傳,不管數(shù)據(jù)到不到,無須建立連接.后者保證傳輸?shù)臄?shù)據(jù)準(zhǔn)確,須要連結(jié).
進(jìn)程和線程分別怎么理解?
進(jìn)程是老子,線程是兒子,沒有老子就沒有兒子,一個(gè)老子可以有多個(gè)兒子.一個(gè)兒子可以成為別人的兒子,一個(gè)老子也可以為別的老子生兒子.
什么是SOAP,有哪些應(yīng)用。
答:SOAP(Simple Object Access Protocol )簡單對象訪問協(xié)議是在分散或分布式的環(huán)境中交換信息并執(zhí)行遠(yuǎn)程過程調(diào)用的協(xié)議,是一個(gè)基于XML的協(xié)議。使用SOAP,不用考慮任何特定的傳輸協(xié)議(最常用的還是HTTP協(xié)議),可以允許任何類型的對象或代碼,在任何平臺上,以任何一直語言相互通信。這種相互通信采用的是XML格式的消息.

1. 填空: (1)面向?qū)ο蟮恼Z言具有___繼承性、封裝性、多態(tài)性。

(2)能用foreach遍歷訪問的對象需要實(shí)現(xiàn) IEnumerable接口或聲明GetEnumerator 方法的類型

      (3)列舉ADO.net中的五個(gè)主要對象

CommandConnection、DataSet、DataAdapter、DataReader。

 

2. 不定項(xiàng)選擇

 

(1) 以下敘述正確的是: 

 

      A. 接口中可以有虛方法。     B. 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。 

      C. 接口不能被實(shí)例化。       D. 接口中可以包含已實(shí)現(xiàn)的方法。 

 

 (2) 從數(shù)據(jù)庫讀取記錄,你可能用到的方法有:

 

      A. ExecuteNonQuery            B. ExecuteScalar

 

      C. Fill                        D. ExecuteReader

 

3. 簡述 private、 protected、 public、 internal 修飾符的訪問權(quán)限。

 

 

4. 寫出一條Sql語句:取出表A中第31到第40記錄(SQLServer, 以自動(dòng)增長的ID作為主鍵注意:ID

可能不是連續(xù)的。) 

 

 

5 .列舉ASP.NET 頁面之間傳遞值的幾種方式。 

 

三種比較常見的方式,一種是可以通過用QueryString來傳送相應(yīng)的值,再一種是通過session變量來傳送相應(yīng)的值,還有就是通過Server.Transfer方法來實(shí)現(xiàn)

 

(1)queryString  
  (2)session  
  (3)cookie  
  (4)server.transfer  
  (5)hidden   control/view   state  
  (6)static   member.  
  (7)cache  
  (8)application  
  (9)DataBase  
  (10)xml   or   other   Files  
  (11)XMLHTTP   or   Hidden   iFrame/frame  
  (12)Context.user.identity  
   
 
我正在做一個(gè)通用提示葉面,所有葉面出現(xiàn)問題都要,傳遞幾個(gè)變量字符串到同一個(gè)葉面 hitMsg.aspx 變量字符串包括提示語言,即將跳轉(zhuǎn)的葉面,跳轉(zhuǎn)時(shí)間。在1-11種方案中哪個(gè)更好些?  
  (1)queryString
的毛病是無法傳遞很長字符串,比如系統(tǒng)錯(cuò)誤信息往往就一整個(gè)屏幕。  
  (2)session
的毛病是不能過多使用,依賴Cookie,容易丟失。  
  (3)cookie
的毛病是依賴客戶端設(shè)置,不可靠。  
  (4)server.transfer
的毛病是接收葉面要為發(fā)送葉面準(zhǔn)備好,只能定制專門一個(gè)葉面接受定制好的葉面。  
 
不能是一個(gè)葉面接受任何葉面。  
  (5)hidden   control/view   state
只能傳遞本頁。除非特殊制作。  
  (6)static   member.
無法保證線程安全,可能會此處栽瓜他處得豆。  
  (7)cache
不適合使用一次就扔的變量。  
  (8)application
全局的,開銷大。  
  (9)DataBase
全局固化的,開銷更大,除非做日志跟蹤。  
  (10)xml   or   other   Files
全局固化的,開銷大,除非做日志跟蹤。  
  (11)XMLHTTP   or   Hidden   iFrame/frame
,做這個(gè)過于煩瑣。  
  (12)Context
這個(gè)占用了用戶id,不適合做這個(gè)。 

 

6. 寫出程序的輸出結(jié)果 

 

class Class1 { 

       private string str = "Class1.str"; 

       private int i = 0; 

       static void StringConvert(string str) { 

           str = "string being converted."; 

       } 

       static void StringConvert(Class1 c) { 

           c.str = "string being converted."; 

       } 

       static void Add(int i) { 

           i++; 

       } 

       static void AddWithRef(ref int i) { 

           i++; 

       } 

       static void Main() { 

           int i1 = 10; 

           int i2 = 20; 

           string str = "str"; 

           Class1 c = new Class1(); 

           Add(i1); 

           AddWithRef(ref i2); 

           Add(c.i); 

           StringConvert(str);         

           StringConvert(c); 

           Console.WriteLine(i1); 

           Console.WriteLine(i2); 

           Console.WriteLine(c.i); 

           Console.WriteLine(str); 

           Console.WriteLine(c.str); 

       }  

    } 

 

 

7.寫出程序的輸出結(jié)果 

 

public abstract class A  

        public A()  

       { 

            Console.WriteLine('A'); 

        } 

        public virtual void Fun()  

       { 

            Console.WriteLine("A.Fun()"); 

        } 

 

public class B: A  

        public B() 

       { 

            Console.WriteLine('B'); 

        } 

 

        public new void Fun()  

       { 

            Console.WriteLine("B.Fun()"); 

        } 

 

        public static void Main()  

       { 

           A a = new B(); 

           a.Fun(); 

        } 

 

 

8.      寫出程序的輸出結(jié)果: 

public class A  

        public virtual void Fun1(int i) 

       { 

           Console.WriteLine(i); 

        } 

 

        public void Fun2(A a)   

       { 

            a.Fun1(1); 

            Fun1(5); 

        } 

 

 

public class B : A  

        public override void Fun1(int i)    

       { 

            base.Fun1 (i + 1); 

        } 

 

        public static void Main()   

       { 

            B b = new B(); 

            A a = new A(); 

            a.Fun2(b); 

            b.Fun2(a);          

        } 

 

 

 

9. 一列數(shù)的規(guī)則如下: 1、12、35、8、1321、34...... 

 求第30位數(shù)是多少,用遞歸算法實(shí)現(xiàn)。(C#語言)

-------------------------------------------

a0   =   0,a1   =   1,An   =   An-1   +   An-2(n>=2)  
  int[]   iArray   =   new   int[31];  
  iArray[0]   =   0;  
  iArray[1]   =   1;  
   
  for   (int   i   =   2;   i   <=   30;   i++)  
  {  
        iArray[i]   =   iArray[i   -   1]   +   iArray[i   -   2];  
  }  
   ---------------
參考答案二---------------------------------

  int   i=0,ii=1,s=1,num=0;  
  while(num<=30)  
  {  
  s=i+ii;  
  Response.Write(i+"+"+ii+"="+s+"<br>");  
  if(s==1)  
  {  
  i=1;  
  }  
  else  
  {  
  i=s-i;  
  }  
  ii=s;  
  num++;  
  }

========================

 

10. 程序設(shè)計(jì): 貓大叫一聲,所有的老鼠都開始逃跑,主人被驚醒。(C#語言

 

要求: 1.要有聯(lián)動(dòng)性,老鼠和主人的行為是被動(dòng)的。

 

2.考慮可擴(kuò)展性,貓的叫聲可能引起其他聯(lián)動(dòng)效應(yīng)。 

三個(gè)類,,老鼠和主人

 

public sealed class Cat

{

   // 貓叫時(shí)引發(fā)的事件

   public event EventHandler Calling;

 

   public void Call()

   {

       Console.WrietLine("貓叫了...");

       if(Calling != null) // 檢查是否有事件注冊

           Calling(this, EventArgs.Empty); // 調(diào)用事件注冊的方法。

   }

}

// 老鼠,提供一個(gè)方法表示逃跑

public sealed calss Mouse

{

    public void Escape(object sender, EventArgs e)

    {

         Console.WriteLine("老鼠逃跑了...");

    }

}

 

// 主人,發(fā)生貓叫的時(shí)候驚醒

public sealed class Master

{

    public void Wakened(object sender, EventArgs e)

    {

        Console.WriteLine("主人驚醒了...);

    }

}

// 用于測試的執(zhí)行方法

// 程序入口點(diǎn)

public static Program

{

    public static int Main(string[] args)

    {

        // 建立貓

        Cat cat = new Cat();

        // 建立老鼠

        Mouse mouse = new Mouse();

        // 建立主人

        Master master = new Master();

     

        // 注冊事件

        cat.Calling += new EventHandler(mouse.Escape);

        cat.Calling += new EventHandler(master.Wakened);

 

 

二、    選擇題 (每題2分   20 )

1、 進(jìn)行軟件質(zhì)量管理的重要性有:(ABCD)【中級】

A、維護(hù)降低成本         B、法律上的要求      C、市場競爭的需要

D、質(zhì)量標(biāo)準(zhǔn)化的趨勢     E、軟件工程的需要    F、CMM過程的一部分

G、方便與客戶進(jìn)一步溝通為后期的實(shí)施打好基礎(chǔ)

2、以測試的形態(tài)分測試可以分為:(ABC)【中級】

A、建構(gòu)性測試           B、系統(tǒng)測試          C、專項(xiàng)測試

D、單元測試             E、組件測試          F、集成測試

3、選出屬于黑盒測試方法的選項(xiàng)(ABC)【初級】

A、測試用例覆蓋         B、輸入覆蓋          C、輸出覆蓋

D、分支覆蓋             E、語句覆蓋           F、條件覆蓋

4、編寫測試計(jì)劃的目的是:(ABC)【中級】

A、使測試工作順利進(jìn)行 B、使項(xiàng)目參與人員溝通更舒暢 C、使測試工作更加系統(tǒng)化

D、軟件工程以及軟件過程的需要    E、軟件過程規(guī)范化的要求   F、控制軟件質(zhì)量

5、依存關(guān)系有4種分別是:(ABCD)【高級】

A、開始-結(jié)束          B、開始-開始                C、結(jié)束-開始

D、結(jié)束-結(jié)束          E、開始-實(shí)施-結(jié)束          F、結(jié)束-審核-開始

6、軟件質(zhì)量管理(QM)應(yīng)有質(zhì)量保證(QA)和質(zhì)量控制(QC)組成,下面的選項(xiàng)屬于QC得是:(ABC)【高級】

A、測試                B、跟蹤                      C、監(jiān)督

D、制定計(jì)劃            E、需求審查                  F、程序代碼審查

7、實(shí)施缺陷跟蹤的目的是:(ABCD)【中級】

A、軟件質(zhì)量無法控制         B、問題無法量化         C、重復(fù)問題接連產(chǎn)生

D、解決問題的知識無法保留 E、確保缺陷得到解決 F、使問題形成完整的閉環(huán)處理

8、使用軟件測試工具的目的:(ABC)【中級】

A、幫助測試尋找問題        B、協(xié)助問題的診斷      C、節(jié)省測試時(shí)間

D、提高Bug的發(fā)現(xiàn)率   E、更好的控制缺陷提高軟件質(zhì)量   F、更好的協(xié)助開發(fā)人員

9、典型的瀑布模型的四個(gè)階段是:(ABCD)【高級】

A、分析                       B、設(shè)計(jì)                   C、編碼

D、測試                       E、需求調(diào)研                F、實(shí)施

10、PSP是指個(gè)人軟件過程 ,是一種可用于( A )、( B )和( C )個(gè)人軟件工作方式的自我改善過程!靖呒墶

A、控制                       B、管理                    C、改進(jìn)

D、高效                       E、充分                    F、適宜

三、    問答題

1、測試人員在軟件開發(fā)過程中的任務(wù)是什么?(初級)(5分)

       答:1、尋找Bug

2、避免軟件開發(fā)過程中的缺陷;

3、衡量軟件的品質(zhì);

4、關(guān)注用戶的需求。

總的目標(biāo)是:確保軟件的質(zhì)量。

2、在您以往的工作中,一條軟件缺陷(或者叫Bug)記錄都包含了哪些內(nèi)容?如何提交高質(zhì)量的軟件缺陷(Bug)記錄?(初級)(6分)

答:一條Bug記錄最基本應(yīng)包含:編號、Bug所屬模塊、Bug描述、Bug級別、發(fā)現(xiàn)日期、發(fā)現(xiàn)人、修改日期、修改人、修改方法、回歸結(jié)果等等;要有效的發(fā)現(xiàn)Bug需參考需求以及詳細(xì)設(shè)計(jì)等前期文檔設(shè)計(jì)出高效的測試用例,然后嚴(yán)格執(zhí)行測試用例,對發(fā)現(xiàn)的問題要充分確認(rèn)肯定,然后再向外發(fā)布如此才能提高提交Bug的質(zhì)量。

3、界面測試題及設(shè)計(jì)題。請找出下面界面中所存在的問題并分別列出;用黑盒測試的任何一種方法設(shè)計(jì)出此登陸窗體的測試用例。(中級)(6分)
            

答:1、窗體的標(biāo)題欄中為空,沒有給出標(biāo)題。

    2、用戶名和密碼控件的字體不一致并且沒有對齊。

    3、文本框的大小不一致沒有對其。

    4、確定和取消按鈕控件的大小不一致。

4、黑盒測試和白盒測試是軟件測試的兩種基本方法,請分別說明各自的優(yōu)點(diǎn)和缺點(diǎn)!(中級)(5分)

答:黑盒測試的優(yōu)點(diǎn)有
1)比較簡單,不需要了解程序內(nèi)部的代碼及實(shí)現(xiàn);

2)與軟件的內(nèi)部實(shí)現(xiàn)無關(guān);

3)從用戶角度出發(fā),能很容易的知道用戶會用到哪些功能,會遇到哪些問題;

4)基于軟件開發(fā)文檔,所以也能知道軟件實(shí)現(xiàn)了文檔中的哪些功能;

5)在做軟件自動(dòng)化測試時(shí)較為方便。

黑盒測試的缺點(diǎn)有:
1)不可能覆蓋所有的代碼,覆蓋率較低,大概只能達(dá)到總代碼量的30%;

2)自動(dòng)化測試的復(fù)用性較低。

白盒測試的優(yōu)點(diǎn)有:

幫助軟件測試人員增大代碼的覆蓋率,提高代碼的質(zhì)量,發(fā)現(xiàn)代碼中隱藏的問題。

白盒測試的缺點(diǎn)有:

1)程序運(yùn)行會有很多不同的路徑,不可能測試所有的運(yùn)行路徑;

2)測試基于代碼,只能測試開發(fā)人員做的對不對,而不能知道設(shè)計(jì)的正確與否,可能會漏掉一些功能需求;

3)系統(tǒng)龐大時(shí),測試開銷會非常大。

5、根據(jù)自己的理解回答什么是軟件測試,軟件測試分為哪幾個(gè)階段。(初級)(5分)

答:軟件測試是一個(gè)為了尋找軟件中的錯(cuò)誤而運(yùn)行軟件的過程,一個(gè)成功的測試是指找到了迄今為止尚未發(fā)現(xiàn)的錯(cuò)誤的測試。

   軟件測試一般分為單元測試、集成測試和系統(tǒng)測試。

6、根據(jù)自己的理解什么是測試用例和測試規(guī)程,設(shè)計(jì)一個(gè)測試用例應(yīng)當(dāng)從哪幾方面考慮?(中級)(10分)

答:狹義的講,一個(gè)測試用例就是測試人員用以測試被測軟件的某個(gè)特性或特性組合的一組數(shù)據(jù)。這組數(shù)據(jù)可能是從用戶處得來的實(shí)際的一組數(shù)據(jù),也可能是測試人員專門設(shè)計(jì)出來的測試軟件某些功能的一組數(shù)據(jù)。

    測試規(guī)程就是詳細(xì)的對測試用例設(shè)計(jì)方法、測試方法、測試工具、測試環(huán)境和測試數(shù)據(jù)進(jìn)行描述的文檔,還可以包括能把某個(gè)或某一組測試用例應(yīng)用到被測軟件上完成某項(xiàng)測試的一系列的操作步驟。

設(shè)計(jì)測試用例應(yīng)當(dāng)從以下幾方面考慮:邊界值,等價(jià)類劃分,有效/無效值等。

7、     什么是軟件質(zhì)量保證?軟件質(zhì)量保證人員與開發(fā)人員的關(guān)系如何?(高級)    (10分)

       答:軟件質(zhì)量保證就是通過確保軟件過程的質(zhì)量,來保證軟件產(chǎn)品的質(zhì)量。

    軟件質(zhì)量保證人員和開發(fā)人員之間具有管理上的嚴(yán)格的獨(dú)立性,兩個(gè)小組的管理員都不能越權(quán)管理另一組,但都可以向更高層的管理者匯報(bào)軟件開發(fā)中的問題

四、    設(shè)計(jì)題

1).輸入三個(gè)整數(shù),判斷三個(gè)整數(shù)能否構(gòu)成一個(gè)三角形,請用黑盒測試方法中的一種設(shè)計(jì)出相應(yīng)的測試用例并詳細(xì)說明所使用的黑盒測試方法。(中高級) (15分)

【筆試題目(綜合版樣題)】相關(guān)文章:

OPPO筆試真題分享,筆試題目分享11-21

JAVA筆試題目之邏輯題02-25

AutoCAD筆試題目真題和答案12-20

面試筆試題目規(guī)律題及答案08-01

筆試題目11-06

中國銀行考試回憶版,筆試題目分享08-10

測試綜合素質(zhì)面試筆試題目及答案03-02

職稱英語樣題(綜合類)10-28

Google筆試題目12-14

城管筆試題目06-05