130道C#面試題

原文引入 http://www.cnblogs.com/temptation/archive/2007/11/16/961930.htmlhtml

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

using System;web

using System.Collections.Generic;正則表達式

using System.Text;算法

 

namespace Example01sql

{數據庫

    class Program編程

    {c#

        class Class1windows

        {

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

            }

        }

    }

 

    //感謝watson hua(http://huazhihao.cnblogs.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();

    }

 

    //感謝watson hua(http://huazhihao.cnblogs.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),負責自動釋放託管資源和內存回收的工做。但在如下兩種狀況須要咱們手工進行資源釋放:1、因爲它沒法對非託管資源進行釋放,因此咱們必須本身提供方法來釋放對象內分配的非託管資源,好比你在對象的實現代碼中使用了一個COM對象;2、你的類在運行是會產生大量實例(象 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#中難以理解的概念和示例代碼.
軟件測試題目
1、   判斷題 (每題2分,20)

一、軟件測試就是爲了驗證軟件功能實現的是否正確,是否完成既定目標的活動,因此軟件測試在軟件工程的後期纔開始具體的工做。 (初級)           ( × )

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

三、測試人員在測試過程當中發現一處問題,若是問題影響不大,而本身又能夠修改,應當即將此問題正確修改,以加快、提升開發的進程。( × )(初級)

四、單元測試一般應該先進行「人工走查」,再以白盒法爲主,輔以黑盒法進行動態測試。

( √ )(中級)

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

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

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

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

九、測試只要作到語句覆蓋和分支覆蓋,就能夠發現程序中的全部錯誤。(X)

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

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

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

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

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

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

二、以測試的形態分測試能夠分爲:(ABC)【中級】

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3、    問答題

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

       答:一、尋找Bug;

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

三、衡量軟件的品質;

四、關注用戶的需求。

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

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

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

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

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

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

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

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

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

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

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

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

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

5)在作軟件自動化測試時較爲方便。

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

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

白盒測試的優勢有:

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

白盒測試的缺點有:

1)程序運行會有不少不一樣的路徑,不可能測試全部的運行路徑;

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

3)系統龐大時,測試開銷會很是大。

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

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

   軟件測試通常分爲單元測試、集成測試和系統測試。

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

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

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

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

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

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

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

4、    設計題

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.什麼叫應用程序域?什麼是受管制的代碼?什麼是強類型系統?什麼是裝箱和拆箱?什麼是重載?CTSCLSCLR分別做何解釋?

 

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.解釋一下UDDIWSDL的意義及其做用。

 

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#能否對內存進行直接的操做?
能夠

維護數據庫的完整性、一致性、你喜歡用觸發器仍是自寫業務邏輯?爲何

觸發器,性能好,事務性

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

新增dataset等,不須要隨時保持鏈接,性能提升

 

ASPNETASP相比,主要有哪些進步?
asp解釋型,aspx編譯型,性能提升,有利於保護源碼

 

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

 

你對XMLHTTPWEBSERVICE 瞭解嗎?簡單描述其特色、做用
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爲止。

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

簡要談一下您對微軟.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. 一列數的規則以下: 112358132134...... 

 求第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(); 
        } 
    }

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

問題: 

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

Windows | Forms | Passport

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

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

4.請談談對正則表達式的見解? 

5ASPNET中共有幾種類型的控件?各有什麼區別? 

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

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

8ASPNETASP相比有什麼優點? 

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

10.請解釋ASPNET中的web頁面與其隱藏類之間的關係? 

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

 

13.當發現不能讀取頁面上的輸入的數據時頗有多是什麼緣由形成的?怎麼解決 

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

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

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

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

18.請解釋ASPNETbutton linkbutton imagebutton hyperlink這四個控件之間的功別 

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

20.若是出現ASPNET中的事件不能觸發可能因爲什麼緣由形成? 

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

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

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

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

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

 

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

 

Q:怎樣理解靜態變量?

 

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

 

Q:若是在一個B/S結構的系統中須要傳遞變量值,可是又不能使用SessionCookieApplication,您有幾種方法進行處理?

 

Q:用.netB/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字段,顯然不能是局部的。

相關文章
相關標籤/搜索