1.簡述 private、 protected、 public、internal 修飾符的訪問權限
答:
private:私有成員, 在類的內部才可以訪問(只能從其聲明上下文中進行訪問)。
protected:保護成員,該類內部和從該類派生的類中可以訪問。
Friend:友元 ,聲明 friend 元素的程序集中的代碼可以訪問該元素,而不能從程序集外部訪問。
Protected Friend:在派生類或同一程序集內都可以訪問。
public:公共成員,完全公開,沒有訪問限制。
internal:在同一命名空間內可以訪問。(很少用)
2.列舉ASP.NET頁面之間傳遞值的幾種方式
答:
1.使用QueryString,如....?id=1;response. Redirect()....
2.使用Session變量
3.使用Server.Transfer
4.使用Application
5.使用Cache
6使用HttpContext的Item屬性
7.使用文件
8.使用數據庫
9.使用Cookie
3.一列數的規則如下: 1、1、2、3、5、8、13、21、34...... 求第30位數是多少,用遞歸算法實現
答:
public class MainClass
{
public static void Main()
{
Console.WriteLine(Foo(30));
}
public static int Foo(int i)
{
if (i <= 0) return 0;
else if(i > 0 && i <= 2) return 1;
else return Foo(i - 1) + Foo(i - 2);
}
}
4.C#中的委托是什么?事件是不是一種委托?
答:
委托是將一種方法作為參數代入到另一種方法。
是,事件是一種特殊的委托。 //比如:onclick事件中的參數就是一種方法。
5.實現多態的過程中overload 重載與override 重寫的區別
答:
overload 重載是方法的名稱相同,參數或參數類型不同,進行多次重載以適應不同的需要。
Override 是進行基類中函數的重寫,實現多態。
6.請編程實現一個冒泡排序算法?
答:
int [] array = new int [*];
int temp = 0 ;
for (int i = 0; i < array.Length - 1; i++){
for (int j = i + 1 ; j < array.Length ; j++){
if (array[j] < array[i]){
temp = array[i] ;
array[i] = array[j] ;
array[j] = temp ;
}
}
}
或者
public static void bubble_sort(int[] x)
{
for (int i = 0; i < x.Length; i++)
{
for (int j = i; j < x.Length; j++)
{
if (x[i] < x[j]) //從大到小排序
{
int temp;
temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
}
}
static void Main(string[] args)
{
int[] huage = { 1, 5, 2, 9, 3, 7, 6,4,8,0};
bubble_sort(huage);
foreach (var a in huage)
{
Console.WriteLine(a );
}
}
7.描述一下C#中索引器的實現過程,是否只能根據數字進行索引
答:
C#通過提供索引器,可以象處理數組一樣處理對象。特別是屬性,每一個元素都以一個get或set方法暴露。索引器不單能索引數字(數組下標),還能索引一些HASHMAP的字符串,所以,通常來說,C#中類的索引器通常只有一個,就是THIS,但也可以有無數個,只要你的參數列表不同就可以了。索引器和返回值無關, 索引器最大的好處是使代碼看上去更自然,更符合實際的思考模式.
微軟官方一個示例:
索引器允許類或結構的實例按照與數組相同的方式進行索引。
索引器類似于屬性,不同之處在于它們的訪問器采用參數。
在下面的示例中,定義了一個泛型類(class SampleCollection<T>),并為其提供了簡單的 get 和 set 訪問器方法(作為分配和檢索值的方法)。Program 類為存儲字符串創建了此類的一個實例。
class SampleCollection<T>
{
private T[] arr = new T[100];
public T this[int i] //注意,定義索引器。this 關鍵字用于定義索引器。
{
get
{
return arr[i]; //訪問器采用參數
}
set
{
arr[i] = value; //訪問器采用參數
}
}
}
// This class shows how client code uses the indexer
class Program
{
static void Main(string[] args)
{
SampleCollection<string> stringCollection = new SampleCollection<string>();
stringCollection[0] = "Hello, World"; //這里 使用索引器進行引用
System.Console.WriteLine(stringCollection[0]);
}
}
索引器使得對象可按照與數組相似的方法進行索引。
get 訪問器返回值。set 訪問器分配值。
this 關鍵字用于定義索引器。
value 關鍵字用于定義由 set 索引器分配的值。
索引器不必根據整數值進行索引,由您決定如何定義特定的查找機制。
索引器可被重載。
索引器可以有多個形參,例如當訪問二維數組時。
8.用.net做B/S結構的系統,您是用幾層結構來開發,每一層之間的關系以及為什么要這樣分層?
答:
使用MVC模式分層
一般為3層:數據訪問層,業務層,表示層。
數據訪問層對數據庫進行增刪查改。
業務層一般分為二層,業務表觀層實現與表示層的溝通,業務規則層實現用戶密碼的安全等。
表示層為了與用戶交互例如用戶添加表單。
9.什么是裝箱和拆箱?
答:
裝箱就是隱式的將一個值型轉換為引用型對象。
拆箱就是將一個引用型對象轉換成任意值型。
比如:
int i=0;
Syste.Object obj=i;
這個過程就是裝箱!就是將 i 裝箱!
比如:
int i=0;
System.Object obj=i;
int j=(int)obj;
這個過程前2句是將 i 裝箱,后一句是將 obj 拆箱!
10.什么是受管制(托管)的代碼?
答:
托管代碼是運行.NET 公共語言運行時CLR的代碼。
unsafe:非托管代碼,不經過CLR運行,程序員自行分配和釋放內存空間。
11.ADO.net中常用的對象有哪些?分別描述一下。
答:
DataSet:數據集。
DataCommand:執行語句命令。
DataAdapter:數據的集合,用語填充。
DataReader:數據只讀器
Connection:數據庫連接對像
Command:數據庫命令
12.什么是Code-Behind技術?
答:代碼后置。
13.在.net中,配件的意思是?
答:程序集。(中間語言,源數據,資源,裝配清單)
14.常用的調用WebService的方法有哪些?
答:
1.使用WSDL.exe命令行工具。
2.使用VS.NET中的Add Web Reference菜單選項
15.在C#中,string str = null 與 string str = “” 請盡量使用文字或圖象說明其中的區別。
答:
string str = null 是不給他分配內存空間,而string str = "" 給它分配長度為空字符串的內存空間。
16.請詳述在C#中類(class)與結構(struct)的異同?
答:
class可以被實例化,屬于引用類型,class可以實現接口和單繼承其他類,還可以作為基類型,是分配在內存的堆上的。
struct屬于值類型,不能作為基類型,但是可以實現接口,是分配在內存的棧上的。
17.寫出一條Sql語句:取出表A中第31到第40記錄(SQLServer,以自動增長的ID作為主鍵,注意:ID可能不是連續的。
答:
解1: select top 10 * from A where id not in (select top 30 id from A)
解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)
18.GC是什么? 為什么要有GC?
答:
GC是垃圾收集器。程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。要請求垃圾收集,可以調用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
19.String s = new String("xyz");創建了幾個String Object?
答:
兩個對象,一個是“xyx”,一個是指向“xyx”的引用對象s。
20.try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后?
答:
會執行,在return前執行。
21.Set里的元素是不能重復的,那么用什么方法來區分重復與否呢? 是用==還是equals()? 它們有何區別?
答:
Set里的元素是不能重復的,那么用iterator()方法來區分重復與否。equals()是判讀兩個Set是否相等。
equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值。
22.談談final, finally, finalize的區別。
答:
final:修飾符(關鍵字),如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載
finally:在異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那么相匹配的 catch 子句就會執行,然后控制就會進入 finally 塊(如果有的話)。
finalize:方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize()方法是在垃圾收集器刪除對象之前對這個對象調用的。
23.如何處理幾十萬條并發數據?
答:
用存儲過程或事務。取得最大標識的時候同時更新..注意主鍵不是自增量方式這種方法并發的時候是不會重復主鍵的..取得最大標識要有一個存儲過程來獲取.
24.進程和線程的區別?
答:
進程是系統進行資源分配和調度的單位;線程是CPU調度和分派的單位,一個進程可以有多個線程,這些線程共享這個進程的資源。
25.堆和棧的區別?
答:
棧:由編譯器自動分配、釋放。在函數體中定義的變量通常在棧上。
堆:一般由程序員分配釋放。用new、malloc等分配內存函數分配得到的就是在堆上。
26.成員變量和成員函數前加static的作用?
答:
它們被稱為常成員變量和常成員函數,又稱為類成員變量和類成員函數。分別用來反映類的狀態。比如類成員變量可以用來統計類實例的數量,類成員函數負責這種統計的動作。
27.請指出GAC的含義?
答:全局程序集緩存。
28.DataReader與Dataset有什么區別?
答
DataReader和DataSet最大的區別在于,DataReader使用時始終占用SqlConnection,在線操作數據庫.任何對SqlConnection的操作都會引發DataReader的異常.因為DataReader每次只在內存中加載一條數據,所以占用的內存是很小的..因為DataReader的特殊性和高性能.所以DataReader是只進的.你讀了第一條后就不能再去讀取第一條了. DataSet則是將數據一次性加載在內存中.拋棄數據庫連接.讀取完畢即放棄數據庫連接.因為DataSet將數據全部加載在內存中.所以比較消耗內存.但是確比DataReader要靈活.可以動態的添加行,列,數據.對數據庫進行回傳更新操作。
29.在c#中using和new這兩個關鍵字有什么意義,請寫出你所知道的意義?using 指令和語句 new 創建實例 new 隱藏基類中方法。
答:
using:引入名稱空間或者使用非托管資源,使用完對象后自動執行實現了IDisposable接口的類的Dispose方法
new:新建實例或者隱藏父類方法
30.什么是虛函數?什么是抽象函數?
答:
虛函數:沒有實現的,可由子類繼承并重寫的函數。Virtual CallSomeOne();
抽象函數:規定其非虛子類必須實現的函數,必須被重寫。public abstract void CallSomeOne();
31.C#中 property 與 attribute的區別,他們各有什么用處,這種機制的好處在哪里?
答:
在C#中有兩個屬性,分別為Property和Attribute,
Property比較簡單,就是我們常用的get和set,主要用于為類中的private和protected變量提供讀取和設置的接口。
Attribute用來說明這個事物的各種特征的一種描述。而Attribute就是干這事的。它允許你將信息與你定義的C#類型相關聯,作為類型的標注。這些信息是任意的,就是說,它不是由語言本身決定的,你可以隨意建立和關聯任何類型的任何信息。你可以作用屬性定義設計時信息和運行時信息,甚至是運行時的行為特征。關鍵在于這些信息不僅可以被用戶取出來作為一種類型的標注,它更可以被編譯器所識別,作為編譯時的一種附屬條件參加程序的編譯。定義屬性:屬性實際上是一個派生自System.Attribute基類的類。System.Attribute類含有幾個用于訪問和檢查自定義屬性的方法。盡管你有權將任何類定義為屬性,但是按照慣例來說,從System.Attribute派生類是有意義的
32.HashMap和Hashtable的區別
答:
HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在于HashMap允許空(null)鍵值(key),由于非線程安全,效率上可能高于Hashtable
33..NET和C#有什么區別
答:
.NET一般指 .NET FrameWork框架,它是一種平臺,一種技術。
C#是一種編程語言,可以基于.NET平臺的應用。
34.啟動一個線程是用run()還是start()?
答:
啟動一個線程是調用start()方法,使線程所代表的虛擬處理機處于可運行狀態,這意味著它可以由JVM調度并執行。這并不意味著線程就會立即運行。
run()方法可以產生必須退出的標志來停止一個線程。
35.數組有沒有length()這個方法? String有沒有length()這個方法?
答:
數組沒有length()這個方法,有length的屬性。String有有length()這個方法。
36.值類型和引用類型的區別?寫出C#的樣例代碼
答:
基于值類型的變量直接包含值。將一個值類型變量賦給另一個值類型變量時,將復制包含的值。這與引用類型變量的賦值不同,引用類型變量的賦值只復制對對象的引用,而不復制對象本身。所有的值類型均隱式派生自 System.ValueType。與引用類型不同,從值類型不可能派生出新的類型。但與引用類型相同的是,結構也可以實現接口。與引用類型不同,值類型不可能包含 null值。然而,可空類型功能允許將 null 賦給值類型。每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。
值類型主要由兩類組成:結構、枚舉,結構分為以下幾類:Numeric(數值)類型、整型、浮點型、decimal、bool、用戶定義的結構。引用類型的變量又稱為對象,可存儲對實際數據的引用。聲明引用類型的關鍵字:class、interface、delegate、內置引用類型:object、string
37.C#中的接口和類有什么異同。
答:
異:不能直接實例化接口。接口不包含方法的實現。接口、類和結構可從多個接口繼承。但是C# 只支持單繼承:類只能從一個基類繼承實現。類定義可在不同的源文件之間進行拆分。
同:接口、類和結構可從多個接口繼承。接口類似于抽象基類:繼承接口的任何非抽象類型都必須實現接口的所有成員。接口可以包含事件、索引器、方法和屬性。一個類可以實現多個接口。
2、在dotnet中類(class)與結構(struct)的異同?
Class可以被實例化,屬于引用類型,是分配在內存的堆上的。類是引用傳遞的。
Struct屬于值類型,是分配在內存的棧上的。結構體是復制傳遞的。加分的回答:Int32、Boolean等都屬于結構體。
3、屬性和public字段的區別是什么?調用set方法為一個屬性設值,然后用get方法讀取出來的值一定是set進去的值嗎?
屬性可以對設值、取值的過程進行非法值控制,比如年齡禁止設值負數,而字段則不能進行這樣的設置。雖然一般情況下get讀取的值就是set設置的值,但是可以讓get讀取的值不是set設置的值的,極端的例子。Public Age{get{return 100;}set{}}。加分的補充回答:用reflector反編譯可以看出,屬性內部本質上就是set_***、get_***方法,
4、使用構造方法能解決:
1)在賦初值時,重復的書寫對象名
2)假如我們有一個屬性,不允許用戶隨意改動.我們一般把這個屬性定義為只讀類型的屬性.
那么這個只讀類型的屬性就不能在實例化后對他賦值了,那么我們如何對他初始化呢?我們
可以通過構造方來進行初始化.
我們定義好一個類,如果沒有寫構造方法,那么編譯器就會自動在這個類中給我們添加一個沒
有參數的構造方法.
一旦我們寫了一個構造方法,那么編譯器就不會再給我們添加這個沒有參數構造方法了.
5、不能在結構中定義析構函數。只能對類使用析構函數。
一個類只能有一個析構函數。
無法繼承或重載析構函數。
無法調用析構函數。它們是被自動調用的。
析構函數既沒有修飾符,也沒有參數。
6、using關鍵字有什么用?什么是IDisposable?
using可以聲明namespace的引入,還可以實現非托管資源的釋放,實現了IDisposiable的類在using中創建,using結束后會自動調用該對象的Dispose方法,釋放資源。加分的補充回答:using其實等價于try……finally,用起來更方便。
7、string str = null 與 string str = “”說明其中的區別。
答:string str = null 是不給他分配內存空間,而string str = \“\” 給它分配長度為空字符串的內存空間。 string str = null沒有string對象,string str = “”有一個字符串對象。
8、誰說字符串不可變?string s = "abc";s="123",s這不是變了嗎
要區分變量名和變量指向的值的區別。程序中可以有很多字符串,然后由字符串變量指向他們,變量可以指向其他的字符串,但是字符串本身沒有變化。字符串不可變性指的是內存中的字符串不可變,而不是變量不變。
string s10 = s1;//s10指向s1指向的字符串,而不是s10指向s1,哪怕s1以后指向了其他內存,那么s10還是指向"hello"
9、字符串替換:string Replace(string oldValue, string newValue)將字符串中的出現oldValue的地方替換為newValue。例子:名字替換。
取子字符串:string Substring(int startIndex),取從位置startIndex開始一直到最后的子字符串;
string Substring(int startIndex, int length),取從位置startIndex開始長度為length的子字符串,如果子字符串的長度不足length則報錯。
bool Contains(string value)判斷字符串中是否含有子串value
bool StartsWith(string value)判斷字符串是否以子串value開始;
bool EndsWith (string value)判斷字符串是否以子串value結束;
int IndexOf(string value):取子串value第一次出現的位置。
LastIndexof
Trim()
TrimEnd()
TrimStrat()
IsNullOrEmpty()
string.Join()
Int IndexOf(string value,int startIndex)
Containts
remove
10、StringBuilder 和 String 的區別?(*)
答:String 在進行運算時(如賦值、拼接等)會產生一個新的實例,而 StringBuilder?則不會。所以在大量字符串拼接或頻繁對某一字符串進行操作時最好使用 StringBuilder,不要使用 String
?如果要操作一個不斷增長的字符串,盡量不用String類,改用StringBuilder類。兩個類的工作原理不同:String類是一種傳統的修改字符串的方式,它確實可以完成把一個字符串添加到另一個字符串上的工作沒錯,但是在.NET框架下,這個操作實在是劃不來。因為系統先是把兩個字符串寫入內存,接著刪除原來的String對象,然后創建一個String對象,并讀取內存中的數據賦給該對象。這一來二去的,耗了不少時間。而使用System.Text命名空間下面的StringBuilder類就不是這樣了,它提供的Append方法,能夠在已有對象的原地進行字符串的修改,簡單而且直接。當然,一般情況下覺察不到這二者效率的差異,但如果你要對某個字符串進行大量的添加操作,那么StringBuilder類所耗費的時間和String類簡直不是一個數量級的。
10、堆和棧的區別
棧是編譯期間就分配好的內存空間,因此你的代碼中必須就棧的大小有明確的定義;局部值類型變量、值類型參數等都在棧內存中。
堆是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小。
11、值類型和引用類型的區別
1.將一個值類型變量賦給另一個值類型變量時,將復制包含的值。引用類型變量的賦值只復制對對象的引用,而不復制對象本身。
2.值類型不可能派生出新的類型:所有的值類型均隱式派生自 System.ValueType。但與引用類型相同的是,結構也可以實現接口。
3.值類型不可能包含 null 值:
4.每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。
(然而,可空類型功能允許將 null 賦給值類型。
)
12、虛方法與重寫
1、方法不能用static修飾
2、方法重寫與基類的簽名必須一致
3、virtual不能與private一起使用
4.虛方法為什么不能加static因為 虛方法是父類,加static,那么就是類調用這個方法,和對象無關了,那子類就調不了,
base.Fun();的目的主要是添加邏輯
常見虛方法:
Equal()
ToString()
GetHashCode()
13、override與重載(overload)的區別
重載是方法的名稱相同。參數或參數類型不同,進行多次重載以適應不同的需要。重載(overload)是面向過程的概念。
Override 是進行基類中函數的重寫。Override是面向對象的概念
14、C#中的接口和類有什么異同。
不同點:
不能直接實例化接口。
接口不包含方法的實現。
接口可以多繼承,類只能單繼承。
類定義可在不同的源文件之間進行拆分。
相同點:
接口、類和結構都可以從多個接口繼承。
接口類似于抽象基類:繼承接口的任何非抽象類型都必須實現接口的所有成員。
接口和類都可以包含事件、索引器、方法和屬性。
C#支持多重繼承么?
類之間不支持,接口之間支持。類對接口叫做實現,不叫繼承。 類是爹、接口是能力,能有多個能力,但不能有多個爹。
15、abstract class和interface有什么區別?
相同點:
都不能被直接實例化,都可以通過繼承實現其抽象方法。
不同點:
接口支持多繼承;抽象類不能實現多繼承。
接口只能定義行為;抽象類既可以定義行為,還可能提供實現。
接口可以用于支持回調(CallBack);抽象類不能實現回調,因為繼承不支持。
接口只包含方法(Method)、屬性(Property)、索引器(Index)、事件(Event)的簽名,但不能定義字段和包含實現的方法;
抽象類可以定義字段、屬性、包含有實現的方法。
接口可以作用于值類型(Struct)和引用類型(Class);抽象類只能作用于引用類型。例如,Struct就可以繼承接口,而不能繼承類。
加分的補充回答:講設計模式的時候SettingsProvider的例子。
16、裝箱與拆箱(*)
將值類型“賦值”給引用類型
對于值類型中的引用成員,保留原數據
效率問題
17、 什么時候用虛方法來實現多態?
什么使用用抽象類來實現多態?
什么時候用接口來實現多態?
多態:
1、“一個接口,多種方法”
同一操作作用于不同的對象,可以有不同的解釋,產生不同的執行結果。
? 多態的三個條件:
a. ? ?繼承的存在(繼承是多態的基礎,沒有繼承就沒有多態).
b. ? ?子類重寫父類的方法(多態下調用子類重寫的方法).
c. ? ?父類引用變量指向子類對象(子類到父類的類型轉換).
重載(overload)和重寫(override)是實現多態的兩種主要方式。
? 2、實現多態:
接口多態性。
繼承多態性。
通過抽象類實現的多態性。
18、所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意的)SQL命令注入到后臺數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊.
?