程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> 130道C#面試題

130道C#面試題

編輯:C#基礎知識

C#/.Net/數據庫筆試資料
C#資料(一)
1.靜態成員和非靜態成員的區別?
答:
靜態變量使用 static 修飾符進行聲明,在類被實例化時創建,通過類進行訪問不帶有 static 修飾符聲明的變量稱做非靜態變量,在對象被實例化時創建,通過對象進行訪問一個類的所有實例的同一靜態變量都是同一個值,同一個類的不同實例的同一非靜態變量可以是不同的值靜態函數的實現裡不能使用非靜態成員,如非靜態變量、非靜態函數等
示例:

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)

        {

            //靜態變量通過類進行訪問,該類所有實例的同一靜態變量都是同一個值

            Console.WriteLine("Class1's staticStr: {0}", Class1.staticStr);

 

            Class1 tmpObj1 = new Class1();

            tmpObj1.notstaticStr = "tmpObj1";

            Class1 tmpObj2 = new Class1();

            tmpObj2.notstaticStr = "tmpObj2";

 

            //非靜態變量通過對象進行訪問,不同對象的同一非靜態變量可以有不同的值

            Console.WriteLine("tmpObj1's notstaticStr: {0}", tmpObj1.notstaticStr);

            Console.WriteLine("tmpObj2's notstaticStr: {0}", tmpObj2.notstaticStr);

 

            Console.ReadLine();

        }

    }

}

結果:
Class1's staticStr: Class
tmpObj1's notstaticStr: tmpObj1
tmpObj2's notstaticStr: tmpObj2

2.const 和 static readonly 區別?

答:const

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

static readonly

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

示例:

測試類:

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項目

            //然後到資源管理器裡把新編譯的Example02Lib.dll拷貝Example02.exe所在的目錄,

執行Example02.exe

            //切不可在IDE裡直接調試運行因為這會重新編譯整個解決方案!!

 

            //可以看到strConst的輸出沒有改變,而strStaticReadonly的輸出已經改變

            //表明Const變量是在編譯期初始化並嵌入到客戶端程序,而StaticReadonly是在運行時初始化的

            Console.WriteLine("strConst : {0}", Class1.strConst);

            Console.WriteLine("strStaticReadonly : {0}", Class1.strStaticReadonly);

 

            Console.ReadLine();

        }

    }

}

結果:
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";

    }

}

結果

strConst : Const
strStaticReadonly : StaticReadonly Changed

3.extern 是什麼意思?
答:extern 修飾符用於聲明由程序集外部實現的成員函數經常用於系統API函數的調用(通過 DllImport )。注意,和DllImport一起使用時要加上 static 修飾符也可以用於對於同一程序集不同版本組件的調用(用 extern 聲明別名)不能與 abstract 修飾符同時使用

示例:

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

 

namespace Example03

{

    class Program

    {

        //注意DllImport是一個Attribute Property,在System.Runtime.InteropServices命名空間中定義

        //extern與DllImport一起使用時必須再加上一個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 成員可以不包括實現代碼,但只要類中還有未實現的抽象成員(即抽象類),那麼它的對象就不能被實例化,通常用於強制繼承類必須實現某一成員

示例:

using System;

using System.Collections.Generic;

using System.Text;

 

namespace Example04

{

    #region 基類,抽象類

    public abstract class BaseClass

    {

        //抽象屬性,同時具有get和set訪問器表示繼承類必須將該屬性實現為可讀寫

        public abstract String Attribute

        {

            get;

            set;

        }

 

        //抽象方法,傳入一個字符串參數無返回值

        public abstract void Function(String value);

 

        //抽象事件,類型為系統預定義的代理(delegate):EventHandler

        public abstract event EventHandler Event;

 

        //抽象索引指示器,只具有get訪問器表示繼承類必須將該索引指示器實現為只讀

        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);

 

            //將靜態函數OnFunction與tmpObj對象的Event事件進行關聯

            tmpObj.Event += new EventHandler(OnFunction);

 

            tmpObj.Function("7654321");

 

            Console.ReadLine();

        }

    }

}

結果:
1234567
7
6
5
4
3
2
1

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

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

示例

Example05Lib 項目的 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;

    }

}

結果
Example05Lib 項目的 Class2 類可以訪問到 Class1 的 strInternal 成員,當然也可以訪問到 strInternalProtected 成員,因為他們在同一個程序集裡

 

Example05 項目裡的 Class3 類無法訪問到 Class1 的 strInternal 成員,因為它們不在同一個程序集裡。但卻可以訪問到 strInternalProtected 成員,因為 Class3 是 Class1 的繼承類

 

Example05 項目的 Program 類既無法訪問到 Class1 的 strInternal 成員,也無法訪問到 strInternalProtected 成員,因為它們既不在同一個程序集裡也不存在繼承關系

 


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

答:sealed 修飾符表示密封

用於類時,表示該類不能再被繼承,不能和 abstract 同時使用,因為這兩個修飾符在含義上互相排斥

用於方法和屬性時,表示該方法或屬性不能再被重寫,必須和 override 關鍵字一起使用,因為使用 sealed 修飾符的方法或屬性肯定是基類中相應的虛成員

通常用於實現第三方類庫時不想被客戶端繼承,或用於沒有必要再繼承的類以防止濫用繼承造成層次結構體系混亂

恰當的利用 sealed 修飾符也可以提高一定的運行效率,因為不用考慮繼承類會重寫該成員

示例:

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();

        }

    }

}

結果:
類 B 在繼承類 A 時可以重寫兩個虛函數,如圖所示:

 

由於類 B 中對 F 方法進行了密封, 類 C 在繼承類 B 時只能重寫一個函數,如圖所示:

 

控制台輸出結果,類 C 的方法 F 只能是輸出 類B 中對該方法的實現:

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


7.override 和 overload 的區別?

答:override 表示重寫,用於繼承類對基類中虛成員的實現

overload 表示重載,用於同一個類中同名方法不同參數(包括類型不同或個數不同)的實現

示例:

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();

        }

    }

}

結果:
BaseClass.F
DeriveClass.F
Add for Int: 3
Add for int: 3.3

8.什麼是索引指示器?

答:實現索引指示器(indexer)的類可以象數組那樣使用其實例後的對象,但與數組不同的是索引指示器的參數類型不僅限於int..

簡單來說,其本質就是一個含參數屬性

示例:

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;

            }

        }   

        //實現索引訪問器

        public Point this[int Index]

        {

            get

            {

                return points[Index];

            }

        }

    }

 

    //感謝hewenqi(http://hovertree.com/)的指點

    //索引指示器的實質是含參屬性,參數並不只限於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的標准寫法

                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();

        }

    }

}

結果:
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 操作符是兩個概念

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

new 修飾符只能用於繼承類,一般用於彌補基類設計的不足

new 修飾符和 override 修飾符不可同時用在一個成員上,因為這兩個修飾符在含義上互相排斥

示例:

using System;

using System.Collections.Generic;

using System.Text;

 

namespace Example09

{

    class BaseClass

    {

        //基類設計者聲明了一個PI的公共變量,方便進行運算

        public static double PI = 3.1415;

    }

    class DervieClass : BaseClass

    {

        //繼承類發現該變量的值不能滿足運算精度,於是可以通過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();

        }

    }

}

結果:
3.1415
3.1415926

10.this 關鍵字的含義?

答:this 是一個保留字,僅限於構造函數和方法成員中使用

在類的構造函數中出現表示對正在構造的對象本身的引用,在類的方法中出現表示對調用該方法的對象的引用,在結構的構造上函數中出現表示對正在構造的結構的引用,在結構的方法中出現表示對調用該方法的結果的引用

this 保留字不能用於靜態成員的實現裡,因為這時對象或結構並未實例化..在 C# 系統中,this 實際上是一個常量,所以不能使用 this++ 這樣的運算

this 保留字一般用於限定同名的隱藏成員、將對象本身做為參數、聲明索引訪問器、判斷傳入參數的對象是否為本身

示例:

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)

        {

            //用對象本身實例化自己沒有意義

            if (this != value)

            {

                c = value.C;

            }

        }

        public override string ToString()

        {

            //將對象本身做為參數

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

 

UnitTransClass.C2F(this));

 

        }

 

        //由於好奇,在這做了一個效率測試,想看看到底哪種方式訪問成員變量更快,結論:區別不大。。。

        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)

        {

            //攝氏到華氏的轉換公式

            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();

        }

    }

}

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

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

答:可以

需使用 new 修飾符顯式聲明,表示隱藏了基類中該函數的實現

或增加 override 修飾符,表示抽象重寫了基類中該函數的實現

示例:

    class BaseClass

    {

        public virtual void F()

        {

            Console.WriteLine("BaseClass.F");

        }

    }

    abstract class  DeriveClass1 : BaseClass

    {

        public abstract new void F();

    }

 

    //感謝hewenqi(http://hovertree.com)的指點

    //是他提醒了我還可以用這種方法抽象重寫基類的虛方法

    abstract class DeriveClass2 : BaseClass

    {

        public abstract override void F();

    }

12.密封類可以有虛函數嗎?

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

示例:

    class BaseClass

    {

        public virtual void F()

        {

            Console.WriteLine("BaseClass.F");

        }

    }

    sealed class DeriveClass : BaseClass

    {

        //基類中的虛函數F被隱式的轉化為非虛函數

 

        //密封類中不能再聲明新的虛函數G

        //public virtual void G()

        //{

        //    Console.WriteLine("DeriveClass.G");

        //}

    }

13.什麼是屬性訪問器?

答:屬性訪問器(Property Accessor),包括 get 訪問器和 set 訪問器分別用於字段的讀寫操作
其設計目的主要是為了實現面向對象(OO)中的封裝思想。根據該思想,字段最好設為private,一個精巧的類最好不要直接把字段設為公有提供給客戶調用端直接訪問
另外要注意屬性本身並不一定和字段相聯系

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

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

abstract 修飾符可以和 override 一起使用,參見第11點

示例:

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.接口可以包含哪些成員?

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

 16.類和結構的區別?

答:類:類是引用類型在堆上分配,類的實例進行賦值只是復制了引用,都指向同一段實際對象分配的內存
類有構造和析構函數
類可以繼承和被繼承

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

 示例:根據以上比較,我們可以得出一些輕量級的對象最好使用結構,但數據量大或有復雜處理邏輯對象最好使用類。

如:Geoemtry(GIS 裡的一個概論,在 OGC 標准裡有定義) 最好使用類,而 Geometry 中點的成員最好使用結構

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;

        }

    }

    //結構也可以從接口繼承

    struct Point: IPoint

    {

        private double x, y, z;

        //結構也可以增加構造函數

        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; }

        }

    }

    //在此簡化了點狀Geometry的設計,實際產品中還包含Project(坐標變換)等復雜操作

    class PointGeometry

    {

        private Point value;

       

        public PointGeometry(double X, double Y, double Z)

        {

            value = new Point(X, Y, Z);

        }

        public PointGeometry(Point value)

        {

            //結構的賦值將分配新的內存

            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;

 

            //由於結構是值類型,tmpPG1 和 tmpPG2 的坐標並不一樣

            Console.WriteLine(tmpPG1);

            Console.WriteLine(tmpPG2);

 

            //由於類是引用類型,對tmpPG1坐標修改後影響到了tmpPG3

            PointGeometry tmpPG3 = tmpPG1;

            tmpPG1.X = 7;

            tmpPG1.Y = 8;

            tmpPG1.Z = 9;

            Console.WriteLine(tmpPG1);

            Console.WriteLine(tmpPG3);

 

            Console.ReadLine();

        }

    }

}

結果:
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# 中的接口與類不同,可以使用多繼承,即一個子接口可以有多個父接口。但如果兩個父成員具有同名的成員,就產生了二義性(這也正是 C# 中類取消了多繼承的原因之一),這時在實現時最好使用顯式的聲明

示例:

using System;

using System.Collections.Generic;

using System.Text;

 

namespace Example17

{

    class Program

    {

        //一個完整的接口聲明示例

        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;

            //顯式聲明實現IA接口中的Count屬性

            int IA.Count

            {

                get { return 100; }

                set { count = value; }

            }

            //顯式聲明實現IB接口中的Count方法

            int IB.Count()

            {

                return count * count;

            }

        }

        static void Main(string[] args)

        {

            C tmpObj = new C();

 

            //調用時也要顯式轉換

            Console.WriteLine("Count property: {0}", ((IA)tmpObj).Count);

            Console.WriteLine("Count function: {0}", ((IB)tmpObj).Count());

 

            Console.ReadLine();

        }

    }

}

結果:
Count property: 100
Count function: 10000

18.抽象類和接口的區別?

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

19.別名指示符是什麼?

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

示例:

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;

 

//使用別名指示符解決同名類型的沖突

//在所有命名空間最外層定義,作用域為整個單元文件

using Lib01Class1 = com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01.Class1;

using Lib02Class2 = com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib02.Class1;

 

namespace Example19

{

    namespace Test1

    {

        //Test1Class1在Test1命名空間內定義,作用域僅在Test1之內

        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在這不可以正常使用。

                //因為,在Test2命名空間內不能使用Test1命名空間定義的別名

                //Test1Class1 tmpObj3 = new Test1Class1();

               

                //TestClass2在這可以正常使用

                Test1Class2 tmpObj3 = new Test1Class2();

 

                Console.WriteLine(tmpObj1);

                Console.WriteLine(tmpObj2);

                Console.WriteLine(tmpObj3);

 

                Console.ReadLine();

            }

        }

    }

}


結果:
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 平台在內存管理方面提供了GC(Garbage Collection),負責自動釋放托管資源和內存回收的工作。但在以下兩種情況需要我們手工進行資源釋放:一、由於它無法對非托管資源進行釋放,所以我們必須自己提供方法來釋放對象內分配的非托管資源,比如你在對象的實現代碼中使用了一個COM對象;二、你的類在運行是會產生大量實例(象 GIS 中的Geometry),必須自己手工釋放這些資源以提高程序的運行效率

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

示例:

using System;

using System.Collections.Generic;

using System.Text;

 

namespace Example20

{

    class Program

    {

        class Class1 : IDisposable

        {

            //析構函數,編譯後變成 protected void Finalize(),GC會在回收對象前會調用調用該方法

            ~Class1()

            {

                Dispose(false);

            }

 

            //通過實現該接口,客戶可以顯式地釋放對象,而不需要等待GC來釋放資源,據說那樣會降低效率

            void IDisposable.Dispose()

            {

                Dispose(true);

            }

 

            //將釋放非托管資源設計成一個虛函數,提供在繼承類中釋放基類的資源的能力

            protected virtual void ReleaseUnmanageResources()

            {

                //Do something...

            }

 

            //私有函數用以釋放非托管資源

            private void Dispose(bool disposing)

            {

                ReleaseUnmanageResources();

 

                //為true時表示是客戶顯式調用了釋放函數,需通知GC不要再調用對象的Finalize方法

                //為false時肯定是GC調用了對象的Finalize方法,所以沒有必要再告訴GC你不要調用我的Finalize方法啦

                if (disposing)

                {

                    GC.SuppressFinalize(this);

                }

            }

        }

        static void Main(string[] args)

        {

            //tmpObj1沒有手工釋放資源,就等著GC來慢慢的釋放它吧

            Class1 tmpObj1 = new Class1();

 

            //tmpObj2調用了Dispose方法,傳說比等著GC來釋放它效率要調一些

            //個人認為是因為要逐個對象的查看其元數據,以確認是否實現了Dispose方法吧

            //當然最重要的是我們可以自己確定釋放的時間以節省內存,優化程序運行效率

            Class1 tmpObj2 = new Class1();

            ((IDisposable)tmpObj2).Dispose();

        }

    }

}

21.P/Invoke是什麼?

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

 22.StringBuilder 和 String 的區別?

答:String 在進行運算時(如賦值、拼接等)會產生一個新的實例,而 StringBuilder 則不會。所以在大量字符串拼接或頻繁對某一字符串進行操作時最好使用 StringBuilder,不要使用 String
另外,對於 String 我們不得不多說幾句:
1.它是引用類型,在堆上分配內存
2.運算時會產生一個新的實例
3.String 對象一旦生成不可改變(Immutable)
4.定義相等運算符(== 和 !=)是為了比較 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;

            //看到這個變量名我就生氣,奇怪為什麼大家都使它呢? :)

            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);

            //注意後面的輸出結果,tmpStr1的值改變並未影響到tmpStr2的值

            tmpStr1 = "B";

            Console.WriteLine(tmpStr1);

            Console.WriteLine(tmpStr2);

 

            Console.ReadLine();

        }

    }

}

結果:
String: 375 MSEL
StringBuilder: 16 MSEL
A
A
B
A

23.explicit 和 implicit 的含義?

答:explicit 和 implicit 屬於轉換運算符,如用這兩者可以讓我們自定義的類型支持相互交換

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

示例: 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace Example23

{

    class Program

    {

        //本例靈感來源於大話西游經典台詞“神仙?妖怪?”--主要是我實在想不出什麼好例子了

        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 + ":妖怪想當神仙?再去修煉五百年!");

            }

        }

        static void Main(string[] args)

        {

            Immortal tmpImmortal = new Immortal("紫霞仙子");

            //隱式轉換

            Monster tmpObj1 = tmpImmortal;

            Console.WriteLine(tmpObj1.name);

 

            Monster tmpMonster = new Monster("孫悟空");

            //顯式轉換

            Immortal tmpObj2 = (Immortal)tmpMonster;

            Console.WriteLine(tmpObj2.name);

 

            Console.ReadLine();

        }

    }

}

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

 24.params 有什麼用?

答:params 關鍵字在方法成員的參數列表中使用,為該方法提供了參數個數可變的能力
它在只能出現一次並且不能在其後再有參數定義,之前可以

示例:

using System;

using System.Collections.Generic;

using System.Text;

 

namespace ConsoleApplication1

{

    class App

    {

        //第一個參數必須是整型,但後面的參數個數是可變的。

        //而且由於定的是object數組,所有的數據類型都可以做為參數傳入

        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()

        {

            //可變參數部分傳入了三個參數,都是字符串類型

            UseParams(1, "a", "b", "c");

            //可變參數部分傳入了四個參數,分別為字符串、整數、浮點數和雙精度浮點數數組

            UseParams(2, "d", 100, 33.33, new double[] { 1.1, 2.2 });

 

            Console.ReadLine();

        }

    }

}

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

25.什麼是反射?

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

通過對類型動態實例化後,還可以對其執行操作

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

一般用於插件式框架程序和設計模式的實現,當然反射是一種手段可以充分發揮其能量來完成你想做的任何事情(前面好象見過一位高人用反射調用一個官方類庫中未說明的函數。。。)

示例:

using System;

using System.Collections.Generic;

using System.Text;

 

namespace Example25Lib

{

    public class Class1

    {

        private string name;

        private int age;

 

        //如果顯式的聲明了無參數構造函數,客戶端只需要用程序集的CreateInstance即可實例化該類

        //在此特意不實現,以便在客戶調用端體現構造函數的反射實現

        //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);

        }

    }

}

反射實例化對象並調用其方法,屬性和事件的反射調用略去

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");

 

            //遍歷程序集內所有的類型,並實例化

            Type[] tmpTypes = tmpAss.GetTypes();

            foreach (Type tmpType in tmpTypes)

            {

                //獲取第一個類型的構造函數信息

                ConstructorInfo[] tmpConsInfos = tmpType.GetConstructors();

                foreach (ConstructorInfo tmpConsInfo in tmpConsInfos)

                {

                    //為構造函數生成調用的參數集合

                    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";

                        }

                    }

 

                    //實例化對象

                    object tmpObj = tmpConsInfo.Invoke(tmpParams);

                    Console.WriteLine(tmpObj);

 

                    //獲取所有方法並執行

                    foreach (MethodInfo tmpMethod in tmpType.GetMethods())

                    {

                        //為方法的調用創建參數集合

                        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);

                    }

 

                    //調用完方法後再次打印對象,比較結果

                    Console.WriteLine(tmpObj);

                }

            }

 

            Console.ReadLine();

        }

    }

}

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

1、軟件測試就是為了驗證軟件功能實現的是否正確,是否完成既定目標的活動,所以軟件測試在軟件工程的後期才開始具體的工作。 (初級)           ( × )

2、發現錯誤多的模塊,殘留在模塊中的錯誤也多。( √ ) (初級)

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

4、單元測試通常應該先進行“人工走查”,再以白盒法為主,輔以黑盒法進行動態測試。

( √ )(中級)

5、功能測試是系統測試的主要內容,檢查系統的功能、性能是否與需求規格說明相同。( √ )(中級)

6、軟件質量管理即QM由QA和QC構成,軟件測試屬於QC的核心工作內容。(√)(高級)

7、軟件測試只能發現錯誤,但不能保證測試後的軟件沒有錯誤。(√)

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

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

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

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

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

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

D、質量標准化的趨勢     E、軟件工程的需要    F、CMM過程的一部分

G、方便與客戶進一步溝通為後期的實施打好基礎

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

A、建構性測試           B、系統測試          C、專項測試

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

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

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

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

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

A、使測試工作順利進行  B、使項目參與人員溝通更舒暢  C、使測試工作更加系統化

D、軟件工程以及軟件過程的需要    E、軟件過程規范化的要求   F、控制軟件質量

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

A、開始-結束          B、開始-開始                C、結束-開始

D、結束-結束          E、開始-實施-結束          F、結束-審核-開始

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

A、測試                B、跟蹤                      C、監督

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

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

A、軟件質量無法控制         B、問題無法量化         C、重復問題接連產生

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

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

A、幫助測試尋找問題        B、協助問題的診斷      C、節省測試時間

D、提高Bug的發現率   E、更好的控制缺陷提高軟件質量   F、更好的協助開發人員

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

A、分析                       B、設計                   C、編碼

D、測試                       E、需求調研                F、實施

10、PSP是指個人軟件過程 ,是一種可用於( A )、( B )和( C )個人軟件工作方式的自我改善過程。【高級】

A、控制                       B、管理                    C、改進

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

三、    問答題

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

       答:1、尋找Bug;

2、避免軟件開發過程中的缺陷;

3、衡量軟件的品質;

4、關注用戶的需求。

總的目標是:確保軟件的質量。

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

答:一條Bug記錄最基本應包含:編號、Bug所屬模塊、Bug描述、Bug級別、發現日期、發現人、修改日期、修改人、修改方法、回歸結果等等;要有效的發現Bug需參考需求以及詳細設計等前期文檔設計出高效的測試用例,然後嚴格執行測試用例,對發現的問題要充分確認肯定,然後再向外發布如此才能提高提交Bug的質量。

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

答:1、窗體的標題欄中為空,沒有給出標題。

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

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

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

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

答:黑盒測試的優點有:
1)比較簡單,不需要了解程序內部的代碼及實現;

2)與軟件的內部實現無關;

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

4)基於軟件開發文檔,所以也能知道軟件實現了文檔中的哪些功能;

5)在做軟件自動化測試時較為方便。

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

2)自動化測試的復用性較低。

白盒測試的優點有:

幫助軟件測試人員增大代碼的覆蓋率,提高代碼的質量,發現代碼中隱藏的問題。

白盒測試的缺點有:

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

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

3)系統龐大時,測試開銷會非常大。

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

答:軟件測試是一個為了尋找軟件中的錯誤而運行軟件的過程,一個成功的測試是指找到了迄今為止尚未發現的錯誤的測試。

   軟件測試一般分為單元測試、集成測試和系統測試。

6、 根據自己的理解什麼是測試用例和測試規程,設計一個測試用例應當從哪幾方面考慮?(中級)(10分)

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

    測試規程就是詳細的對測試用例設計方法、測試方法、測試工具、測試環境和測試數據進行描述的文檔,還可以包括能把某個或某一組測試用例應用到被測軟件上完成某項測試的一系列的操作步驟。

設計測試用例應當從以下幾方面考慮:邊界值,等價類劃分,有效/無效值等。

7、     什麼是軟件質量保證?軟件質量保證人員與開發人員的關系如何?(高級)    (10分)

    答:軟件質量保證就是通過確保軟件過程的質量,來保證軟件產品的質量。

     軟件質量保證人員和開發人員之間具有管理上的嚴格的獨立性,兩個小組的管理員都不能越權管理另一組,但都可以向更高層的管理者匯報軟件開發中的問題

四、    設計題

1).輸入三個整數,判斷三個整數能否構成一個三角形,請用黑盒測試方法中的一種設計出相應的測試用例並詳細說明所使用的黑盒測試方法。(中高級)  (15分)


.NET工程(三)

1.面向對象的思想主要包括什麼?

繼承多態封裝

●封裝:用抽象的數據類型將數據和基於數據的操作封裝在一起,數據被保護在抽象數據類型內部。

●繼承:子類擁有父類的所有數據和操作。

●多態:一個程序中同名的不同方法共存的情況。

有兩種形式的多態–重載與重寫。

 

2.什麼是ASP.NET中的用戶控件

用戶控件就是.ascx擴展名的東西喽,可以拖到不同的頁面中調用,以節省代碼.比如登陸可能在多個頁面上有,就可以做成用戶控件,但是有一個問題就是用戶控件拖到不同級別的目錄下後裡面的圖片等的相對路徑會變得不准確,需要自已寫方法調整.

問這樣的問題,一般是迷惑你.因為新手還是分不清楚用戶控件和服務器控件(也稱自定義控件)..用戶控件一般用在內容多為靜態,或者少許會改變的情況下..用的比較大..類似ASP中的include..但是功能要強大的多..

在C#中,string str = null 與 string str = “”的區別。
答:string str = null 是不給他分配內存空間,而string str = "" 給它分配長度為空字符串的內存空間
請詳述在dotnet中類(class)與結構(struct)的異同
Class可以被實例化,屬於引用類型,是分配在內存的堆上的,Struct屬於值類型,是分配在內存的棧上的.

DataReader和DataSet的異同
DataReader和DataSet最大的區別在於,DataReader使用時始終占用SqlConnection,在線操作數據庫..任何對SqlConnection的操作都會引發DataReader的異常..因為DataReader每次只在內存中加載一條數據,所以占用的內存是很小的..因為DataReader的特殊性和高性能.所以DataReader是只進的..你讀了第一條後就不能再去讀取第一條了..
DataSet則是將數據一次性加載在內存中.拋棄數據庫連接..讀取完畢即放棄數據庫連接..因為DataSet將數據全部加載在內存中.所以比較消耗內存...但是確比DataReader要靈活..可以動態的添加行,列,數據.對數據庫進行回傳更新操作.

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

接口和類都是類,不同的事,接口只包含方法或屬性的聲明,不包含具體實現方法的代碼,接口可以實現多繼承,而類只能是單繼承,繼承接口的類必須實現接口中聲明的方法或屬性。接口主要定義一種規范,統一調用方法,在大型項目中接口正發揮日益重要的作用

類是方法功能的實現和集合,接口是規范類.約束類.
接口,是可以多繼承,類只有單繼承.接口強調了你必須實現,而沒有具本實現的方法和虛類有點相似

Override與重載有什麼區別?
一個是重寫父類函數,一個是同一個函數的幾種形式

觸發器的作用

觸發器可以查詢其它表,而且可以包含復雜的 SQL 語句。它們主要用於強制復雜的業務規則或要求。觸發器還有助於強制引用完整性,以便在添加、更新或刪除表中的行時保留表之間已定義的關系。
保證數據庫操作變更能接到通知

<%# %> 和 <% %> 有什麼區別?
<%# %>表示綁定的數據源
<% %>是服務器端代碼塊

常見的設計模式

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



3.什麼叫應用程序域?什麼是受管制的代碼?什麼是強類型系統?什麼是裝箱和拆箱?什麼是重載?CTS、CLS和CLR分別作何解釋?

 

4.列舉一下你所了解的XML技術及其應用

 

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

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

 

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

 

7.如何理解委托?

 

C# 中的委托類似於 C 或 C++ 中的函數指針。使用委托使程序員可以將方法引用封裝在委托對象內。然後可以將該委托對象傳遞給可調用所引用方法的代碼,而不必在編譯時知道將調用哪個方法。與 C 或 C++ 中的函數指針不同,委托是面向對象、類型安全的,並且是安全的。

 

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

 

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

 

11.ASP.net的身份驗證方式有哪些?分別是什麼原理?

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

 

12.進程和線程分別怎麼理解?

 

13.什麼是code-Behind技術。

新建一個VS.NET下的項目..看到ASPX,RESX和CS三個後綴的文件了嗎??這個就是代碼分離.實現了HTML代碼和服務器代碼分離.方便代碼編寫和整理.

 

14.活動目錄的作用。

活動目錄是window2000的最重要的功能.可以將用戶信息全部集成起來,登陸以後可以訪問多個不同的網絡服務..

.

15..net中讀寫XML的類都歸屬於哪些命名空間?

System.XML類

 

16.解釋一下UDDI、WSDL的意義及其作用。

 

17.什麼是SOAP,有哪些應用。

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

 

18.如何部署一個ASP.net頁面。

 

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

 

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

 

20.常用的調用webservice方法有哪些?

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

 

21列舉一下你所了解的XML技術及其應用
.xml可以用來做網頁(xslt) xml可以當作數據庫 xml可以用來保存對象的系列化
xml用於配置,用於保存靜態數據類型.接觸XML最多的是web Services..和config

 

 C#中 property 與 attribute的區別,他們各有什麼用處,這種機制的好處在哪裡?
一個是屬性,用於存取類的字段,一個是特性,用來標識類,方法等的附加性質

 

C#可否對內存進行直接的操作?
可以

維護數據庫的完整性、一致性、你喜歡用觸發器還是自寫業務邏輯?為什麼

觸發器,性能好,事務性

ADO。NET相對於ADO等主要有什麼改進?

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

 

ASP。NET與ASP相比,主要有哪些進步?
asp解釋型,aspx編譯型,性能提高,有利於保護源碼

 

C#中的委托是什麼?事件是不是一種委托?
委托是一種安全的函數指針,事件是一種消息機制

 

你對XMLHTTP、WEBSERVICE 了解嗎?簡單描述其特點、作用
xmlhttp可以主動獲取遠端web代碼,類似HttpWebRequest

接口和抽象類有什麼區別?你選擇使用接口和抽象類的依據是什麼?
接口用於規范,抽象類用於共性。

存儲過程和函數的區別
存儲過程是編譯好的存儲在數據庫的操作,函數不用說了.

事務是什麼?
具有原子性特點

游標的作用?如何知道游標已經到了最後?
指示當前記錄的位置,檢查NULL

觸發器分為事前觸發和事後觸發,這兩種觸發有和區別。語句級觸發和行級觸發有何區別。
一個是操作前,一個是操作後

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

請說明.net中的錯誤處理機制,並舉例
try catch final

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

請列出c#中幾種循環的方法,並指出他們的不同
for wile foreach

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

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

值類型與引用類型有什麼區別?
值和指針的區別

怎樣理解靜態變量?
所有實例公用一個的變量

向服務器發送請求有幾種方式?
get post

如果在一個B/S結構的系統中需要傳遞變量值,但是又不能使用Session、Cookie、Application,您有幾種方法進行處理?
input type=""
url
數據庫

用.net做B/S結構的系統,您是用幾層結構來開發,每一層之間的關系以及為什麼要這樣分層?
三層,表現,邏輯,數據, 安全性,維護性

軟件開發過程一般有幾個階段?每個階段的作用?
需求分析,架構設計,代碼編寫,QA,部署

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

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

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

如果需記錄類的實例個數,該如何實現,請寫一個簡單的類於以證明.
const static int classNum=0;
classNum++;

A類是B類的基類,並且都有自己的構造,析構函數,請舉例證明B類從實例化到消亡過程中構造,析構函數的執行過程.
構造先父後子,析夠反之

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

在c#中using和new這兩個關鍵字有什麼意義,請寫出你所知道的意義?

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

談談類和結構的區別?
類是引用類型、結構是值類型

什麼叫做SQL注入,如何防止?請舉例說明。
利用sql關鍵字對網站進行攻擊。過濾關鍵字'等

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

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

什麼是反射?
動態獲取程序集信息

用Singleton如何寫設計模式
static屬性裡面new ,構造函數private

C#中的垃圾回收機制是怎樣的?
三個generation,當每個generation內存滿了的時候檢查引用,無引用就回收內存

什麼是Application Pool?
Web應用,類似Thread Pool,提高並發性能

鏈表和數組的區別,各有什麼優缺點.
一個可以動態增長,一個固定(VB中可以Redim),性能數組教好

什麼是友元函數?
friendly聲明,可以訪問protect級別方法

什麼是虛函數?
可以被重寫

什麼是抽象函數?
必須被重寫

什麼是內存洩漏,怎樣最簡單的方法判斷被存洩漏 ?
C++,C中忘了釋放內存,內存不會再次分配

1SQL Server的兩種索引是何形式?索引的作用?索引的優缺點?
cluster和非cluster,加速查找,占用額外控件,維護索引耗費時間

什麼是XML?
可擴展標記語言,可以做配置文件,可以傳輸數據,可以存儲數據

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

進程和線程的區別

進程是系統進行資源分配和調度的單位;線程是CPU調度和分派的單位,一個進程可以有多個線程,這些線程共享這個進程的資源。

成員變量和成員函數前加static的作用

它們被稱為常成員變量和常成員函數,又稱為類成員變量和類成員函數。分別用來反映類的狀態。比如類成員變量可以用來統計類實例的數量,類成員函數負責這種統計的動作。

malloc和new的區別

new是C++的關鍵字。malloc在分配內存時必須按給出的字節分配,new可以按照對象的大小自動分配,並且能調用構造函數。可以說new是對象的對象,而malloc不是。本質上new分配內存時,還會在實際內存塊的前後加上附加信息,所以new所使用的內存大小比malloc多。

堆和棧的區別

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

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

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

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

.net的錯誤處理機制是什麼
.net錯誤處理機制采用try->catch->finally結構,發生錯誤時,層層上拋,直到找到匹配的Catch為止。

重載與覆蓋的區別
1、方法的覆蓋是子類和父類之間的關系,是垂直關系;方法的重載是同一個類中方法之間的關系,是水平關系。
2、覆蓋只能由一個方法,或只能由一對方法產生關系;方法的重載是多個方法之間的關系。
3、覆蓋要求參數列表相同;重載要求參數列表不同。
4、覆蓋關系中,調用那個方法體,是根據對象的類型(對象對應存儲空間類型)來決定;重載關系,是根據調用時的實參表與形參表來選擇方法體的。

簡要談一下您對微軟.NET 構架下remoting和webservice兩項技術的理解以及實際中的應用。
WS主要是可利用HTTP,穿透防火牆。而Remoting可以利用TCP/IP,二進制傳送提高效率。

C#中的委托是什麼?事件是不是一種委托?
委托是一種安全的函數指針,事件是一種消息機制

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

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

1. 填空: (1)面向對象的語言具有___繼承性、封裝性、多態性。

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

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

Command、Connection、DataSet、DataAdapter、DataReader。

 

2. 不定項選擇:

 

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

 

      A. 接口中可以有虛方法。     B. 一個類可以實現多個接口。 

      C. 接口不能被實例化。       D. 接口中可以包含已實現的方法。 

 

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

 

      A. ExecuteNonQuery            B. ExecuteScalar

 

      C. Fill                        D. ExecuteReader

 

3. 簡述 private、 protected、 public、 internal 修飾符的訪問權限。

 

 

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

可能不是連續的。) 

 

 

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

 

三種比較常見的方式,一種是可以通過用QueryString來傳送相應的值,再一種是通過session變量來傳送相應的值,還有就是通過Server.Transfer方法來實現

 

(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   
    
  我正在做一個通用提示葉面,所有葉面出現問題都要,傳遞幾個變量字符串到同一個葉面 hitMsg.aspx 變量字符串包括提示語言,即將跳轉的葉面,跳轉時間。在1-11種方案中哪個更好些?   
  (1)queryString的毛病是無法傳遞很長字符串,比如系統錯誤信息往往就一整個屏幕。   
  (2)session的毛病是不能過多使用,依賴Cookie,容易丟失。   
  (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這個占用了用戶id,不適合做這個。 

 

6. 寫出程序的輸出結果 

 

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.寫出程序的輸出結果 

 

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.      寫出程序的輸出結果: 

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. 一列數的規則如下: 1、1、2、3、5、8、13、21、34...... 

 求第30位數是多少,用遞歸算法實現。(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. 程序設計: 貓大叫一聲,所有的老鼠都開始逃跑,主人被驚醒。(C#語言) 

 

要求: 1.要有聯動性,老鼠和主人的行為是被動的。

 

2.考慮可擴展性,貓的叫聲可能引起其他聯動效應。 

三個類,貓,老鼠和主人

 

public sealed class Cat

{

   // 貓叫時引發的事件

   public event EventHandler Calling;

 

   public void Call()

   {

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

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

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

   }

}

// 老鼠,提供一個方法表示逃跑

public sealed calss Mouse

{

    public void Escape(object sender, EventArgs e)

    {

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

    }

}

 

// 主人,發生貓叫的時候驚醒

public sealed class Master

{

    public void Wakened(object sender, EventArgs e)

    {

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

    }

}

// 用於測試的執行方法

// 程序入口點

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);

 

        // 貓開始叫

        cat.Call();

    }

}

 

要點:1. 聯動效果,運行代碼只要執行Cat.Cryed()方法。2. 對老鼠和主人進行抽象 
評分標准: <1>.構造出Cat、Mouse、Master三個類,並能使程序運行(2分) 
                 <2>從Mouse和Master中提取抽象(5分) 
                 <3>聯動效應,只要執行Cat.Cryed()就可以使老鼠逃跑,主人驚醒。(3分)


    public interface Observer 
    { 
        void Response();    //觀察者的響應,如是老鼠見到貓的反映 
    } 
    public interface Subject 
    { 
        void AimAt(Observer obs);  //針對哪些觀察者,這裡指貓的要撲捉的對象---老鼠 
    } 
    public class Mouse : Observer 
    { 
        private string name; 
        public Mouse(string name, Subject subj) 
        {           
            this.name = name; 
            subj.AimAt(this); 
        } 
        
        public void Response() 
        { 
            Console.WriteLine(name + " attempt to escape!"); 
        } 
    } 
    public class Master : Observer 
    {   
        public Master(Subject subj) 
        {           
            subj.AimAt(this); 
        } 
        
        public void Response() 
        { 
            Console.WriteLine("Host waken!"); 
        }  
    } 
  
    public class Cat : Subject 
    { 
        private ArrayList observers; 
        public Cat() 
        {   
            this.observers = new ArrayList(); 
        } 
        public void AimAt(Observer obs) 
        { 
            this.observers.Add(obs); 
        } 
        public void Cry() 
        { 
            Console.WriteLine("Cat cryed!"); 
            foreach (Observer obs in this.observers) 
            { 
                obs.Response(); 
            } 
        } 
    } 
    class MainClass 
    {       
        static void Main(string[] args) 
        { 
            Cat cat = new Cat(); 
            Mouse mouse1 = new Mouse("mouse1", cat); 
            Mouse mouse2 = new Mouse("mouse2", cat); 
            Master master = new Master(cat); 
            cat.Cry(); 
        } 
    }

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

問題: 

1.ASP.NET中的身份驗證有那些?你當前項目采用什麼方式驗證請解釋 

Windows | Forms | Passport

2.什麼是WEB控件?使用WEB控件有那些優勢? 

3.請解釋ASP。NET中以什麼方式進行數據驗證? 

4.請談談對正則表達式的看法? 

5.ASP。NET中共有幾種類型的控件?各有什麼區別? 

6.WEB控件可以激法服務端事件,請談談服務端事件是怎麼發生並解釋其原理?自動傳回是什麼?為什麼要使用自動傳回。 

7.WEB控件及HTML服務端控件能否調用客戶端方法?如果能,請解釋如何調用? 

8.ASP。NET與ASP相比有什麼優勢? 

9.請解釋web.config文件中的重要節點 

10.請解釋ASP。NET中的web頁面與其隱藏類之間的關系? 

11.什麼是viewstate,能否禁用?是否所用控件都可以禁用? 

 

13.當發現不能讀取頁面上的輸入的數據時很有可能是什麼原因造成的?怎麼解決 

14.請解釋一個WEB頁面中代碼執行次序。 

15.請解釋什麼是上下文對象,在什麼情況下要使用上下文對象 

16.請解釋轉發與跳轉的區別? 

17.請解釋ASP.NET中不同頁面之間數據傳遞有那些方式? 

18.請解釋ASP。NET中button linkbutton imagebutton 及hyperlink這四個控件之間的功別 

19.請解釋一下。NET多層應用程序中層與層之間以那幾種方式進行數據傳遞。並解釋你自己的項目中采用那種方式進行。 

20.如果出現ASP。NET中的事件不能觸發可能由於什麼原因造成? 

21.如果需要在datagride控件中的某一列中添加下拉列表框並綁定數據怎麼解決? 

22.請解釋asp.net中的數據綁定與傳統數據綁定有什麼區別? 

23.請解釋.net采用委托實現的事件模型與Java中采用接口實現的事件模型有什麼區別,以圖示方式解釋。 

24.請解釋接口的顯式實現有什麼意義? 

Q:您在什麼情況下會用到虛方法?它與接口有什麼不同?

 

Q:值類型與引用類型有什麼區別?

 

Q:怎樣理解靜態變量?

 

Q:向服務器發送請求有幾種方式?

 

Q:如果在一個B/S結構的系統中需要傳遞變量值,但是又不能使用Session、Cookie、Application,您有幾種方法進行處理?

 

Q:用.net做B/S結構的系統,您是用幾層結構來開發,每一層之間的關系以及為什麼要這樣分層?

 

Q:軟件開發過程一般有幾個階段?每個階段的作用?

 

需求分析,概要設計,詳細設計,軟件編碼,軟件測試

一,可行性分析   
  二,需求分析   
  三,實施和編碼   
  四,測試   
  五,維護 

 

Q:微軟推出了一系列的Application Block,請舉出您所知道的Application Block並說明其作用?

 

Q:請列舉一些您用到過的設計模式以及在什麼情況下使用該模式?

 

Q:您對WebService的體會?

 

以下幾道題目如果您不會,請較為詳細的描述您的解決思路和方法

 

Q:通過超鏈接怎樣傳遞中文參數?

 

Q:請編程遍歷頁面上所有TextBox控件並給它賦值為string.Empty?

For(i=0;i<this.control.count;i++)

If(control is TextBox)

{

         (control   as   TextBox).Text   =   string.Empty;  

}

Q:請編程實現一個冒泡排序算法?

using System;

namespace BubbleSorter

{

 public class BubbleSorter

 {

 public void Sort(int [] list)

 {

   int i,j,temp;

   bool done=false;

   j=1;

   while((j<list.Length)&&(!done))

   {

    done=true;

    for(i=0;i<list.Length-j;i++)

    {

     if(list[i]>list[i+1])

     {

      done=false;

      temp=list[i];

      list[i]=list[i+1];

      list[i+1]=temp;

     }

    }

    j++;

   }

 }

 }

 public class MainClass

 {

 public static void Main()

 {

   int[] iArrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47};

   BubbleSorter sh=new BubbleSorter();

   sh.Sort(iArrary);

   for(int m=0;m<iArrary.Length;m++)

    Console.Write("{0} ",iArrary[m]);

   Console.WriteLine();

 }

 }

}


.NET技術(四)

[.NET(C#)]
把attribute翻譯成特性,用來標識類,方法
把property翻譯為屬性,性質,用於存取類的字段
把markup翻譯成標記,tag還是翻譯成標簽比較好

[.NET(C#)]
.NET Framework的核心是其運行庫的執行環境。
稱為公共語言運行庫(CLR)或.NET運行庫.
通常將在CLR的控制下運行的代碼稱為托管代碼(managed code).
在CLR執行開發的源代碼之前,需要編譯它們為中間語言(IL),CLR再把IL編譯為平台專用的代碼。

程序集(assembly)是包含編譯好的,面向.NET Framework的代碼的邏輯單元.
可執行代碼和庫代碼使用相同的程序集結構.
程序集的一個重要特性是它們包含的元數據描述了對應代碼中定義的類型和方法.

[.NET(C#)]
ASP頁面有時顯示比較慢,因為服務器端代碼是解釋性的不是編譯的.
由於ASP代碼不是結構化的所以難於維護,加上ASP不支持錯誤處理和語法檢查。
而ASP.NET頁面是結構化的。每個頁面都是一個繼承了.NET類System.Web.UI.Page的類。
另外ASP.NET的後台編碼功能允許進一步采用結構化的方式.
頁面請求是和WEB服務器在編譯後高速緩存ASP.NET頁面。

[.NET(C#)]
覆蓋(override)和重載(overload):
覆蓋是指子類重新定義父類的虛函數的做法。
重載,是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。
其實,重載的概念並不屬於“面向對象編程”,
重載的實現是:編譯器根據函數不同的參數表,對同名函數的名稱做修飾
然後這些同名函數就成了不同的函數(至少對於編譯器來說是這樣的)。
如,有兩個同名函數:function    func(p:integer):integer;    和function  func(p:string):integer;。
那麼編譯器做過修飾後的函數名稱可能是這樣的:int_func、str_func。
對於這兩個函數的調用,在編譯器間就已經確定了,是靜態的(記住:是靜態)。
也就是說,它們的地址在編譯期就綁定了(早綁定),
因此,重載和多態無關!真正和多態相關的是“覆蓋”。
當子類重新定義了父類的虛函數後,父類指針根據賦給它的不同的子類指針,動態(記住:是動態!)的調用屬於子類的該函數,
這樣的函數調用在編譯期間是無法確定的(調用的子類的虛函數的地址無法給出)。
因此,這樣的函數地址是在運行期綁定的(晚邦定)。
結論就是:重載只是一種語言特性,與多態無關,與面向對象也無關!

[.NET(C#)]
C#中ref和out的區別:
方法參數上的 out 方法參數關鍵字使方法引用傳遞到方法的同一個變量。
當控制傳遞回調用方法時,在方法中對參數所做的任何更改都將反映在該變量中。 
當希望方法返回多個值時,聲明 out 方法非常有用。
使用 out 參數的方法仍然可以返回一個值。一個方法可以有一個以上的 out 參數。 
若要使用 out 參數,必須將參數作為 out 參數顯式傳遞到方法。out 參數的值不會傳遞到 out 參數。 
不必初始化作為 out 參數傳遞的變量。然而,必須在方法返回之前為 out 參數賦值。 
屬性不是變量,不能作為 out 參數傳遞。

方法參數上的 ref 方法參數關鍵字使方法引用傳遞到方法的同一個變量。
當控制傳遞回調用方法時,在方法中對參數所做的任何更改都將反映在該變量中。 
若要使用 ref 參數,必須將參數作為 ref 參數顯式傳遞到方法。
ref 參數的值被傳遞到 ref 參數。 傳遞到 ref 參數的參數必須最先初始化。
將此方法與 out 參數相比,後者的參數在傳遞到 out 參數之前不必顯式初始化。 
屬性不是變量,不能作為 ref 參數傳遞。

兩者都是按地址傳遞的,使用後都將改變原來的數值。
ref可以把參數的數值傳遞進函數,但是out是要把參數清空
就是說你無法把一個數值從out傳遞進去的,out進去後,參數的數值為空,所以你必須初始化一次。
兩個的區別:ref是有進有出,out是只出不進。

[.NET(C#)]
ADO和ADO.NET的區別:
ADO使用OLE DB接口並基於微軟的COM技術
而ADO.NET擁有自己的ADO.NET接口並且基於微軟的.NET體系架構。
ADO以Recordset存儲,而ADO.NET則以DataSet表示。
Recordset看起來更像單表,如果讓Recordset以多表的方式表示就必須在SQL中進行多表連接。
反之,DataSet可以是多個表的集合。ADO 的運作是一種在線方式,這意味著不論是浏覽或更新數據都必須是實時的。
ADO.NET則使用離線方式,在訪問數據的時候ADO.NET會利用XML制作數據的一份幅本
ADO.NET的數據庫連接也只有在這段時間需要在線。
  
由於ADO使用COM技術,這就要求所使用的數據類型必須符合COM規范
而ADO.NET基於XML格式,數據類型更為豐富並且不需要再做COM編排導致的數據類型轉換,從而提高了整體性能。
ADO.NET為.NET構架提供了優化的數據訪問模型,和基於COM的ADO是完全兩樣的數據訪問方式。

ado.net與ado存在著比較大的差異:
1.ado.net遵循更通用的原則,不那麼專門面向數據庫。
ado.net集合了所有允許數據處理的類。這些類表示具有典型數據庫功能(如索引,排序和視圖)的數據容器對象。
盡管ado.net是.net數據庫應用程序的權威解決方案
但從總體設計上看,它不像ado數據模型那樣以數據庫為中心,這是ado.net的一大特點。
2.目前,ado.net提供了兩種數據庫訪問類庫:一種用於sql server 7.0 或更高版本
另一種用於其他所有您可能已經安裝的ole db提供程序。
在這兩種情況下,您分別使用不同的類,但遵循相似的命名規則。
除前綴,名稱都是相同的。前一種情況前綴為sql,後一種情況則是oledb。
同時,.net框架還提供了odbc .net的數據訪問模式。
odbc .net data provider是 .net 框架的增強組件,它可以訪問原始的 odbc 驅動程序
就像 ole db .net data provider 可以訪問原始的 ole db providers 一樣。
目前它僅在下列驅動程序中測試過:
microsoft sql odbc driver,microsoft odbc driver for Oracle,microsoft jet odbc driver。
3.ado.net提供了兩個隊形來處理從數據源中抽取數據,它們是dataset和datareader對象。
前者是記錄在內存中的緩存,您可以從任何方向隨意訪問和修改。
後者是高度優化的對象,專為以僅向前方式滾動只讀記錄而設計。
4.ado.net統一了數據容器類編程接口,無論您打算編寫何種應用程序,windows窗體,web窗體還是web服務
都可以通過同一組類來處理數據。
不管在後端的數據源數sql server數據庫,ole db,xml文件還是一個數組
您都可以通過相同的方法和屬性來滾動和處理它們的內容。
5.在ado中,xml只不過是輸入和輸出格式。
然而在ado.net中,xml是一種數據格式,提供了操作,組織,共享和傳遞數據的手段。

ADO。NET相對於ADO等主要有什麼改進?
1:ado.net不依賴於ole db提供程序,而是使用.net托管提供的程序,
2:不使用com
3:不在支持動態游標和服務器端游 
4:,可以斷開connection而保留當前數據集可用 
5:強類型轉換 
6:xml支持

[.NET(C#)]
new 關鍵字用法
(1)new  運算符  用於創建對象和調用構造函數。
(2)new  修飾符  用於向基類成員隱藏繼承成員。
(3)new  約束  用於在泛型聲明中約束可能用作類型參數的參數的類型。
 指定泛型類聲明中的任何類型參數都必須有公共的無參數構造函數。

[.NET(C#)]
C#中,string str = null 與 string str ="",說明區別。
string str =""初始化對象分配空間
而string str=null初始化對象

[.NET(C#)]
DataGrid的Datasouse可以連接什麼數據源
DataTable DataView  DataSet  DataViewManager 任何實現IListSource接口的組件  任何實現IList接口的組件

[.NET(C#)]
概述反射和序列化
反射:公共語言運行庫加載器管理應用程序域。
 這種管理包括將每個程序集加載到相應的應用程序域以及控制每個程序集中類型層次結構的內存布局。
 程序集包含模塊,而模塊包含類型,類型又包含成員。
 反射則提供了封裝程序集、模塊和類型的對象。
 您可以使用反射動態地創建類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。
 然後,可以調用類型的方法或訪問其字段和屬性。

序列化:序列化是將對象狀態轉換為可保持或傳輸的格式的過程。
 與序列化相對的是反序列化,它將流轉換為對象。
 這兩個過程結合起來,可以輕松地存儲和傳輸數據。

[.NET(C#)]
可訪問性級別有哪幾種
 public 訪問不受限制。
 protected 訪問僅限於包含類或從包含類派生的類型。
 internal 訪問僅限於當前程序集。
 protected internal 訪問僅限於從包含類派生的當前程序集或類型。
 private 訪問僅限於包含類型。

[.NET(C#)]
O/R Mapping 的原理:利用反射,配置將對象和數據庫表映射。

[.NET(C#)]
sealed 修飾符有什麼特點?
sealed 修飾符表示密封,用於類時,表示該類不能再被繼承
不能和 abstract 同時使用,因為這兩個修飾符在含義上互相排斥
用於方法和屬性時,表示該方法或屬性不能再被繼承,必須和 override 關鍵字一起使用
因為使用 sealed 修飾符的方法或屬性肯定是基類中相應的虛成員
通常用於實現第三方類庫時不想被客戶端繼承,或用於沒有必要再繼承的類以防止濫用繼承造成層次結構體系混亂
恰當的利用 sealed 修飾符也可以提高一定的運行效率,因為不用考慮繼承類會重寫該成員

[.NET(C#)]
詳述.NET裡class和struct的異同
結構與類共享幾乎所有相同的語法,但結構比類受到的限制更多:
盡管結構的靜態字段可以初始化,結構實例字段聲明還是不能使用初始值設定項。
結構不能聲明默認構造函數(沒有參數的構造函數)或析構函數。
結構的副本由編譯器自動創建和銷毀,因此不需要使用默認構造函數和析構函數。
實際上,編譯器通過為所有字段賦予默認值(參見默認值表)來實現默認構造函數。
結構不能從類或其他結構繼承。
結構是值類型 -- 如果從結構創建一個對象並將該對象賦給某個變量,變量則包含結構的全部值。
復制包含結構的變量時,將復制所有數據,對新副本所做的任何修改都不會改變舊副本的數據。
由於結構不使用引用,因此結構沒有標識 -- 具有相同數據的兩個值類型實例是無法區分的。
C# 中的所有值類型本質上都繼承自 ValueType,後者繼承自 Object。
編譯器可以在一個稱為裝箱的過程中將值類型轉換為引用類型。

結構具有以下特點:
結構是值類型,而類是引用類型。
向方法傳遞結構時,結構是通過傳值方式傳遞的,而不是作為引用傳遞的。
與類不同,結構的實例化可以不使用 new 運算符。
結構可以聲明構造函數,但它們必須帶參數。
一個結構不能從另一個結構或類繼承,而且不能作為一個類的基。
所有結構都直接繼承自 System.ValueType,後者繼承自 System.Object。
結構可以實現接口。
在結構中初始化實例字段是錯誤的。

類與結構的差別 
1. 值類型與引用類型 
結構是值類型:值類型在堆棧上分配地址,所有的基類型都是結構類型
例如:int 對應System.int32 結構,string 對應 system.string 結構 ,通過使用結構可以創建更多的值類型 
類是引用類型:引用類型在堆上分配地址 堆棧的執行效率要比堆的執行效率高
可是堆棧的資源有限,不適合處理大的邏輯復雜的對象。
所以結構處理作為基類型對待的小對象,而類處理某個商業邏輯 
因為結構是值類型所以結構之間的賦值可以創建新的結構,而類是引用類型,類之間的賦值只是復制引用 注: 
1.雖然結構與類的類型不一樣,可是他們的基類型都是對象(object),c#中所有類型的基類型都是object 
2.雖然結構的初始化也使用了New 操作符可是結構對象依然分配在堆棧上而不是堆上
 如果不使用“新建”(new),那麼在初始化所有字段之前,字段將保持未賦值狀態,且對象不可用 
2.繼承性 
結構:不能從另外一個結構或者類繼承,本身也不能被繼承
 雖然結構沒有明確的用sealed聲明,可是結構是隱式的sealed . 
類:完全可擴展的,除非顯示的聲明sealed 否則類可以繼承其他類和接口,自身也能被繼承 
注:雖然結構不能被繼承 可是結構能夠繼承接口,方法和類繼承接口一樣 
例如:結構實現接口 
interface IImage
{
 void Paint();
}
struct Picture : IImage
{
 public void Paint()
 {
  // painting code goes here
 }
 private int x, y, z; // other struct members
}

3.內部結構: 
結構: 
沒有默認的構造函數,但是可以添加構造函數 
沒有析構函數 
沒有 abstract 和 sealed(因為不能繼承) 
不能有protected 修飾符 
可以不使用new 初始化 
在結構中初始化實例字段是錯誤的 
類: 
有默認的構造函數 
有析構函數 
可以使用 abstract 和 sealed 
有protected 修飾符 
必須使用new 初始化

[.NET(C#)]
如何選擇結構還是類 
1. 堆棧的空間有限,對於大量的邏輯的對象,創建類要比創建結構好一些 
2. 結構表示如點、矩形和顏色這樣的輕量對象
 例如,如果聲明一個含有 1000 個點對象的數組,則將為引用每個對象分配附加的內存。
 在此情況下,結構的成本較低。 
3. 在表現抽象和多級別的對象層次時,類是最好的選擇
4. 大多數情況下該類型只是一些數據時,結構時最佳的選擇

[.NET(C#)]
abstract class和interface有什麼區別?
答:聲明方法的存在而不去實現它的類被叫做抽像類(abstract class)
它用於要創建一個體現某些基本行為的類,並為該類聲明方法,但不能在該類中實現該類的情況。
不能創建abstract 類的實例。
然而可以創建一個變量,其類型是一個抽像類,並讓它指向具體子類的一個實例。
不能有抽像構造函數或抽像靜態方法。
Abstract 類的子類為它們父類中的所有抽像方法提供實現,否則它們也是抽像類。
取而代之,在子類中實現該方法。
知道其行為的其它類可以在類中實現這些方法。

接口(interface)是抽像類的變體。
在接口中,所有方法都是抽像的。
多繼承性可通過實現這樣的接口而獲得。
接口中的所有方法都是抽像的,沒有一個有程序體。
接口只可以定義static final成員變量。
接口的實現與子類相似,除了該實現類不能從接口定義中繼承行為。

當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。
然後,它可以在實現了該接口的類的任何對像上調用接口的方法。
由於有抽像類,它允許使用接口名作為引用變量的類型。通常的動態聯編將生效。
引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口。

接口可以繼承接口。
抽像類可以實現(implements)接口
抽像類是否可繼承實體類(concrete class),但前提是實體類必須有明確的構造函數。

[.NET(C#)]
什麼叫應用程序域?什麼是托管代碼?什麼是強類型系統?
什麼是裝箱和拆箱?什麼是重載?CTS、CLS和CLR分別作何解釋?

應用程序域:
應用程序域為安全性、可靠性、版本控制以及卸載程序集提供了隔離邊界。
應用程序域通常由運行庫宿主創建,運行庫宿主負責在運行應用程序之前引導公共語言運行庫。
應用程序域提供了一個更安全、用途更廣的處理單元,公共語言運行庫可使用該單元提供應用程序之間的隔離。
應用程序域可以理解為一種輕量級進程。起到安全的作用。占用資源小。

托管代碼:
使用基於公共語言運行庫的語言編譯器開發的代碼稱為托管代碼;托管代碼具有許多優點,
例如:跨語言集成、跨語言異常處理、增強的安全性、版本控制和部署支持、簡化的組件交互模型、調試和分析服務等。

裝箱和拆箱:
從值類型接口轉換到引用類型:裝箱。
從引用類型轉換到值類型:拆箱。
裝箱和拆箱使值類型能夠被視為對象。
對值類型裝箱將把該值類型打包到 Object 引用類型的一個實例中。
這使得值類型可以存儲於垃圾回收堆中。
拆箱將從對象中提取值類型。

重載:
每個類型成員都有一個唯一的簽名。
方法簽名由方法名稱和一個參數列表(方法的參數的順序和類型)組成。
只要簽名不同,就可以在一種類型內定義具有相同名稱的多種方法。
當定義兩種或多種具有相同名稱的方法時,就稱作重載。

CTS通用類型系統 (common type system) :
一種確定公共語言運行庫如何定義、使用和管理類型的規范。

CLR公共語言運行庫:
.NET Framework 提供了一個稱為公共語言運行庫的運行時環境.
它運行代碼並提供使開發過程更輕松的服務。

CLS公共語言規范:
要和其他對象完全交互,而不管這些對象是以何種語言實現的.
對象必須只向調用方公開那些它們必須與之互用的所有語言的通用功能。
為此定義了公共語言規范 (CLS),它是許多應用程序所需的一套基本語言功能。

強類型:
C# 是強類型語言;因此每個變量和對象都必須具有聲明類型。

[.NET(C#)]
值類型和引用類型的區別? 
基於值類型的變量直接包含值。
將一個值類型變量賦給另一個值類型變量時,將復制包含的值。
這與引用類型變量的賦值不同,引用類型變量的賦值只復制對對象的引用,而不復制對象本身。

所有的值類型均隱式派生自 System.ValueType。
與引用類型不同,從值類型不可能派生出新的類型。但與引用類型相同的是,結構也可以實現接口。
與引用類型不同,值類型不可能包含 null 值。然而,可空類型功能允許將 null 賦給值類型。 
每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。
值類型主要由兩類組成:結構、枚舉
結構分為以下幾類:
Numeric(數值)類型、整型、浮點型、decimal、bool、用戶定義的結構。
引用類型的變量又稱為對象,可存儲對實際數據的引用。
聲明引用類型的關鍵字:class、interface、delegate、內置引用類型: object、string

                     值類型                    引用類型
 
內存分配地點      分配在棧中                   分配在堆中
效率           效率高,不需要地址轉換          效率低,需要進行地址轉換
內存回收        使用完後,立即回收              使用完後,不是立即回收,等待GC回收
賦值操作         進行復制,創建一個同值新對象    只是對原有對象的引用
函數參數與返回值  是對象的復制                  是原有對象的引用,並不產生新的對象
類型擴展   不易擴展    容易擴展,方便與類型擴展

[.NET(C#)]
如何理解委托
委托類似於 C++ 函數指針,但它是類型安全的。
委托允許將方法作為參數進行傳遞。
委托可用於定義回調方法。
委托可以鏈接在一起;例如,可以對一個事件調用多個方法。
方法不需要與委托簽名精確匹配。有關更多信息,請參見協變和逆變。
C# 2.0 版引入了匿名方法的概念,此類方法允許將代碼塊作為參數傳遞,以代替單獨定義的方法。

[.NET(C#)]
C#中的接口和類有什麼異同。
異:
不能直接實例化接口。
接口不包含方法的實現。
接口、類和結構可從多個接口繼承。
但是C# 只支持單繼承:類只能從一個基類繼承實現。
類定義可在不同的源文件之間進行拆分。

同:
接口、類和結構可從多個接口繼承。
接口類似於抽象基類:繼承接口的任何非抽象類型都必須實現接口的所有成員。
接口可以包含事件、索引器、方法和屬性。
一個類可以實現多個接口。

[.NET(C#)]
ASP.net的身份驗證方式有哪些
Windows 身份驗證提供程序
提供有關如何將 Windows 身份驗證與 Microsoft Internet 信息服務 (IIS) 身份驗證
結合使用來確保 ASP.NET 應用程序安全的信息。

Forms 身份驗證提供程序 
提供有關如何使用您自己的代碼創建應用程序特定的登錄窗體並執行身份驗證的信息。
使用 Forms 身份驗證的一種簡便方法是使用 ASP.NET 成員資格和 ASP.NET 登錄控件
它們一起提供了一種只需少量或無需代碼就可以收集、驗證和管理用戶憑據的方法。

Passport 身份驗證提供程序 
提供有關由 Microsoft 提供的集中身份驗證服務的信息,該服務為成員站點提供單一登錄和核心配置

[.NET(C#)]
活動目錄的作用
Active Directory存儲了有關網絡對象的信息,並且讓管理員和用戶能夠輕松地查找和使用這些信息。
Active Directory使用了一種結構化的數據存儲方式,並以此作為基礎對目錄信息進行合乎邏輯的分層組織。

[.NET(C#)]
解釋一下UDDI、WSDL的意義及其作用
UDDI:統一描述、發現和集成協議(UDDI, Universal Description, Discovery and Integration)
是一套基於Web的、分布式的、為Web服務提供的信息注冊中心的實現標准規范,
同時也包含一組使企業能將自身提供的Web服務注冊以使得別的企業能夠發現的訪問協議的實現標准。
UDDI 提供了一組基於標准的規范用於描述和發現服務,還提供了一組基於因特網的實現。

WSDL:WSDL描述Web服務的公共接口。
這是一個基於XML的關於如何與Web服務通訊和使用的服務描述;
服務 URL 和命名空間 
網絡服務的類型
(可能還包括 SOAP 的函數調用,正像我所說過的,WSDL 足夠自如地去描述網絡服務的廣泛內容) 
有效函數列表 
每個函數的參數 
每個參數的類型 
每個函數的返回值及其數據類型

[.NET(C#)]
什麼是SOAP,有哪些應用。
答:SOAP(Simple Object Access Protocol )簡單對象訪問協議
是在分散或分布式的環境中交換信息並執行遠程過程調用的協議,是一個基於XML的協議。
使用SOAP,不用考慮任何特定的傳輸協議(最常用的還是HTTP協議)
可以允許任何類型的對象或代碼,在任何平台上,以任何一直語言相互通信。
這種相互通信采用的是XML格式的消息。

SOAP也被稱作XMLP,為兩個程序交換信息提供了一種標准的工作機制。
在各類機構之間通過電子方式相互協作的情況下完全有必要為此制定相應的標准。

SOAP描述了把消息捆綁為XML的工作方式。
它還說明了發送消息的發送方、消息的內容和地址以及發送消息的時間。
SOAP是Web Service的基本通信協議。
SOAP規范還定義了怎樣用XML來描述程序數據(Program Data),怎樣執行RPC(Remote Procedure Call)。
大多數SOAP解決方案都支持RPC-style應用程序。
SOAP還支持 Document-style應用程序(SOAP消息只包含XML文本信息)。

最後SOAP規范還定義了HTTP消息是怎樣傳輸SOAP消息的。
MSMQ、SMTP、TCP/IP都可以做SOAP的傳輸協議。 

SOAP 是一種輕量級協議,用於在分散型、分布式環境中交換結構化信息。
 SOAP 利用 XML 技術定義一種可擴展的消息處理框架,它提供了一種可通過多種底層協議進行交換的消息結構。 
這種框架的設計思想是要獨立於任何一種特定的編程模型和其他特定實現的語義。

SOAP 定義了一種方法以便將 XML 消息從 A 點傳送到 B 點。 
為此,它提供了一種基於 XML 且具有以下特性的消息處理框架: 
1) 可擴展
2) 可通過多種底層網絡協議使用
3) 獨立於編程模型。

[.NET(C#)]
如何部署一個ASP.net頁面
VS 2005和VS 2003都有發布機制。
2003可以發布然後再復制部署。
VS2005基本上可以直接部署到對應位置。

[.NET(C#)]
GC是什麼? 為什麼要有GC?
答:GC是垃圾收集器。
程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。
要請求垃圾收集,可以調用下面的方法之一: 
System.gc()
Runtime.getRuntime().gc()
不過在C#中不能直接實現Finalize方法,而是在析構函數中調用基類的Finalize()方法

[.NET(C#)]
如何理解.net中的垃圾回收機制
.NET Framework 的垃圾回收器管理應用程序的內存分配和釋放。
每次您使用 new 運算符創建對象時,運行庫都從托管堆為該對象分配內存。
只要托管堆中有地址空間可用,運行庫就會繼續為新對象分配空間。
但是,內存不是無限大的。最終,垃圾回收器必須執行回收以釋放一些內存。
垃圾回收器優化引擎根據正在進行的分配情況確定執行回收的最佳時間。
當垃圾回收器執行回收時,它檢查托管堆中不再被應用程序使用的對象並執行必要的操作來回收它們占用的內存。

[.NET(C#)]
列舉ASP.NET 頁面之間傳遞值的幾種方式。 並說出他們的優缺點。
答. 1).使用QueryString, 如....?id=1; response. Redirect().... 
    2).使用Session變量 
    3).使用Server.Transfer

session(viewstate)  簡單,但易丟失
application   全局
cookie    簡單,但可能不支持,可能被偽造
input ttype="hidden"  簡單,可能被偽造
url   參數 簡單,顯示於地址欄,長度有限數據庫 穩定,安全,但性能相對弱

[.NET(C#)]
C#中索引器的實現過程,可以用任何類型進行索引?(比如數字)

[.NET(C#)]
CTS、CLS、CLR分別作何解釋?
CTS:通用語言系統。
CLS:通用語言規范。
CLR:公共語言運行庫。

[.NET(C#)]
.net中讀寫數據庫需要用到那些類?他們的作用?
DataSet: 數據存儲器。
DataCommand: 執行語句命令。
DataAdapter: 數據的集合,用語填充。

[.NET(C#)]
在.net中,配件的意思是:程序集。(中間語言,源數據,資源,裝配清單)

[.NET(C#)]
常用的調用WebService的方法有哪些?
答:1.使用WSDL.exe命令行工具。
    2.使用VS.NET中的Add Web Reference菜單選項

[.NET(C#)]
微軟.NET 構架下remoting和webservice兩項技術的理解以及實際中的應用。
.net Remoting 的工作原理是:服務器端向客戶端發送一個進程編號,一個程序域編號,以確定對象的位置。
WS主要是可利用HTTP,穿透防火牆。而Remoting可以利用TCP/IP,二進制傳送提高效率。
remoting是.net中用來跨越machine,process,appdomain進行方法調用的技術
對於三成結構的程序,就可以使用remoting技術來構建.
它是分布應用的基礎技術.相當於以前的DCOM 
Web Service是一種構建應用程序的普通模型
並能在所有支持internet網通訊的操作系統上實施。
Web Service令基於組件的開發和web的結合達到最佳

[.NET(C#)]
啟動一個線程是用run()還是start()?
答:啟動一個線程是調用start()方法,使線程所代表的虛擬處理機處於可運行狀態。
這意味著它可以由JVM調度並執行。
這並不意味著線程就會立即運行。
run()方法可以產生必須退出的標志來停止一個線程。

[.NET(C#)]
構造器Constructor是否可被override?
構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。

[.NET(C#)]
abstract的method不可同時是static,不可同時是native,不可同時是synchronized

[.NET(C#)]
final, finally, finalize的區別。
final: 修飾符(關鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。
 因此 一個類不能既被聲明為 abstract的,又被聲明為final的。
 將變量或方法聲明為final,可以保證它們在使用中不被改變。
 被聲明為final的變量必須在聲明時給定初值,而在以後的引用中只能讀取,不可修改。
 被聲明為 final的方法也同樣只能使用,不能重載
finally: 在異常處理時提供 finally 塊來執行任何清除操作。
  如果拋出一個異常,那麼相匹配的 catch 子句就會執行.
  然後控制就會進入 finally 塊(如果有的話)。
finalize: 方法名。
  Java 技術允許使用 finalize() 方法在垃圾收集器將對像從內存中清除出去之前做必要的清理工作。
  這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。
  它是在 Object 類中定義的 ,因此所有的類都繼承了它。
  子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。
  finalize() 方法是在垃圾收集器刪除對像之前對這個對象調用的。

[.NET(C#)]
進程和線程的區別:
進程是系統進行資源分配和調度的單位;
線程是CPU調度和分派的單位.
一個進程可以有多個線程,這些線程共享這個進程的資源。

[.NET(C#)]
堆和棧的區別:
棧:由編譯器自動分配、釋放。在函數體中定義的變量通常在棧上。
堆:一般由程序員分配釋放。用new、malloc等分配內存函數分配得到的就是在堆上。

[.NET(C#)]
成員變量和成員函數前加static的作用:
它們被稱為常成員變量和常成員函數,又稱為類成員變量和類成員函數。
分別用來反映類的狀態。
比如類成員變量可以用來統計類實例的數量,類成員函數負責這種統計的動作。

[.NET(C#)]
在c#中using和new這兩個關鍵字有什麼意義:
using  引入名稱空間或者使用非托管資源
new  新建實例或者隱藏父類方法

[.NET(C#)]
XML即可擴展標記語言。
eXtensible Markup Language.標記是指計算機所能理解的信息符號
通過此種標記,計算機之間可以處理包含各種信息的文章等。
如何定義這些標記,即可以選擇國際通用的標記語言
比如HTML,也可以使用象XML這樣由相關人士自由決定的標記語言,這就是語言的可擴展性。
XML是從SGML中簡化修改出來的。它主要用到的有XML、XSL和XPath等。

[.NET(C#)]
什麼是code-Behind技術。
答:ASPX,RESX和CS三個後綴的文件,這個就是代碼分離.
實現了HTML代碼和服務器代碼分離.方便代碼編寫和整理.

[.NET(C#)]
XML 與 HTML 的主要區別
1. XML是區分大小寫字母的,HTML不區分。 
2. 在HTML中,如果上下文清楚地顯示出段落或者列表鍵在何處結尾,
 那麼你可以省略</p>或者</li>之類的結束 標記。
 在XML中,絕對不能省略掉結束標記。 
3. 在XML中,擁有單個標記而沒有匹配的結束標記的元素必須用一個 / 字符作為結尾。
 這樣分析器就知道不用 查找結束標記了。 
4. 在XML中,屬性值必須分裝在引號中。在HTML中,引號是可用可不用的。 
5. 在HTML中,可以擁有不帶值的屬性名。在XML中,所有的屬性都必須帶有相應的值。

[.NET(C#)]
.net的錯誤處理機制是什麼?
答:.net錯誤處理機制采用try->catch->finally結構.
發生錯誤時,層層上拋,直到找到匹配的Catch為止。

[.NET(C#)]
Static Nested Class 和 Inner Class的不同:
Static Nested Class是被聲明為靜態(static)的內部類,它可以不依賴於外部類實例被實例化。
而通常的內部類需要在外部類實例化後才能實例化。

[.NET(C#)]
error和exception有什麼區別:
error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。
不可能指望程序能處理這樣的情況。
exception 表示一種設計或實現問題。
也就是說,它表示如果程序運行正常,從不會發生的情況。

[.NET(C#)]
UDP連接和TCP連接的異同:
前者只管傳,不管數據到不到,無須建立連接.後者保證傳輸的數據准確,須要連結.

[.NET(C#)]
C#中所有對象共同的基類是:System.Object. 

[.NET(C#)]
System.String 和System.StringBuilder有什麼區別? 
System.String是不可變的字符串。String類是final類故不可以繼承。
System.StringBuilder存放了一個可變的字符串,並提供一些對這個字符串修改的方法。

[.NET(C#)]
const和readonly有什麼區別? 
const  可以用於局部常量
readonly 實際是類的initonly字段,顯然不能是局部的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved