private:私有成员,在类的内部才能访问
protected:保护成员,在该类内部和继承本类的子类中可以访问
public:公共成员,完全公开,没有访问限制
internal:在当前程序集中可以访问
Connection:链接对象 用于与特定的数据源建立链接
Command:命令对象 主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令
DataReader:数据流对象 一个向前的只读数据流
DataAdapter:适配器对象 主要是在数据源以及DataSet 之间执行数据传输的工作,它可以透过Command 对象下达命令后,并将取得的数据放入DataSet 对象中。
DataSet:数据集对象 这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,放在内存中。相当于内存中的一张表或多张表
1.使用QueryString, 如....?id=1; response. Redirect()....
2.Application 对象 服务器上
存储: Application["name"]="张三":
获取: string name=Application["name"].ToString();
3.Session 对象 服务器上
存储: Session["name"]="张三":
获取:string Session["name"].ToString();
4.Cookie:是个字符串 存在在客户端上
存值:
HttpCookie cookie=new HttpCookie(string name,string value)
cookie.Expires.AddDay(7); //Expires 过期时间
Response.Cookies.Add(cookie);
获取:
HttpCookie cookie=Request.Cookies[string name];
string s=cookie.Value;
或
string s=Request.Cookies[string name].value;
5.Server.Tranfer //地址栏上不会显示target.aspx,而response. Redirect() 会在地址栏上显示target.aspx
Server.Transfer( "target.aspx?param1=1111¶m2=2222 ")
接收页面: string str = Request[ "param1 "]
1, 运算符 用于创建对象和调用构造函数。
Class cl=new Class();
int i=new int();
i=0;
2,修饰符 可以显式隐藏从基类继承的成员。
●若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。
●要想访问被隐藏的基类的成员变量、属性或方法,办法就是将子类造型为父类,然后通过基类访问被隐藏的成员变量、属性或方法。
3,约束 约束指定泛型类声明中的 任何类型参数 都必须有公共的无参数构造函数。
Class ItemFactory
ItemFactory
sealed 修饰符用于防止从所修饰的类派生出其它类。(不能继承) 如果一个密封类被指定为其他类的基类,则会发生编译时错误。
6、请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
// 1,如果没指定是那里面的Controls ,需要遍历两边
foreach(Control item in Controls)
{
foreach(Control con in item.Controls)
{
TextBox tb=con as TextBox;//把con作为TextBox控件
if(tb!=null)
tb.Text=String.Empty;
}
}
//2,指定是Form里面的Controls 一遍即可
foreach(Control item in this.Form.Controls)
{
TextBox tb=item as TextBox;//把con作为TextBox控件
if(tb!=null)
tb.Text=String.Empty;
}
7、在.net中,配件的意思是?
程序集(Assembly)。(中间语言,源数据,资源,装配清单)
8、装箱和拆箱
.net包含一个特殊的Object类,可以接受任意的数据类型的值
装箱:从值类型接口转换到引用类型。
拆箱:从引用类型转换到值类型。
object obj = null;//引用类型
obj = 1;//装箱,boxing。把值类型包装为引用类型。
int i1 = (int)obj;//拆箱。unboxing
1.用户界面表示层(UI);2.业务逻辑层(BLL);3.数据访问层(DAL); 目的即为了“高内聚,低耦合”的思想。
1,表现层(UI):调用业务逻辑层(BLL)里面的方法来呈现数据给用户看 实质:具体解决做什么的问题
2,业务逻辑层(BLL) :主要针对具体的问题的操作 实质:负责处理U层的问题
3,数据访问层(DAL) :对数据的操作具体为BLL层提供服务 实质:就是对数据库的类容的增,删,改,查 封装的SQLHelper类
4,实体层(Model) :原始数据 实质:完成数据库与实体类对应的功能,一个类是一张表,一个属性是一个字段
三层结构是N层结构的一种,一般来说,层次之间是向下依赖的,下层代码未确定其接口(契约)前上层代码是无法开发的,下层代码接口(契约)的变化将使上层的代码一起变化。
优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。
缺点: 增加成本。
需要实现IEnumerable接口或声明GetEnumerator方法的类型
GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。
GC只能处理托管内存资源的释放,对于非托管资源则不能使用GC进行回收,必须由程序员手工回收,一个例子就是FileStream或者SqlConnection需要程序员调用Dispose进行资源的回收。
要请求垃圾收集,可以调用下面的方法:GC.Collection()一般不需要手动调用GC.Collection()。
任何集合类都实现了IEnumerable接口,所以任何集合类对象都有一个GetEnumerator()方法,该方法可以返回一个实现了 IEnumerator接口的对象,这个返回的IEnumerator对象既不是集合类对象,也不是集合的元素类对象,它是一个独立的类对象。通过这个对象,可以遍历访问集合类对象中的每一个元素对象
我们经常用的foreach即是一种语法糖,实际上还是调用Enumerator里面的Current和MoveNext实现的遍历功能。
List
Stack
Dictionary
HashSet
SortedList
将ASP.NET程序需要呈现的一个网页分为*.aspx和*.cs这两个文件,即代码分离技术,实现了HTML代码和服务器逻辑代码的分离,这样更方便于代码编写、整理及调试。
1,引用命名空间 using System.Text;
2,为命名空间或类型创建别名 为了避免出现名称冲突,可以通过设定别名来解决.
3,using 语句
using语句允许程序员指定使用资源的对象应当何时释放资源.using语句中使用的对象必须实现IDisposable接口.此接口提供了Dispose方法,该方法将释放此对象的资源
a, using语句只能用于实现了IDisposable接口的类型,
b,using语句适用于清理单个非托管资源的情况,而多个非托管对象的清理最好以try-finaly来实现
在程序编译阶段,编译器会自动将using语句生成try-finally语句,并在finally块中调用对象的Dispose方法,来清理资源.所以,using语句等效于try-finally语句
IDisposable接口定义一种释放分配的非托管资源的方法,GC只对托管对象释放内存,而对非托管对象资源不能操作。
String类型数据每次重新赋值都是开辟一个新的内存空间新的数据放在里面,变量的引用重新指向新空间中的的地址,原来的数值还在内存中并没有变化通过CG回收。
s不指向原来那个对象了,而指向了另一个 String对象,内容为"123",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用
常用的类:StreamReader、WebClient、Dictionary
常用的接口:IDisposable、IEnumerable、IDbConnection、IComparable、ICollection、 IList、IDictionary
value,它的类型和属性所声名的类型相同。
不支持。可以用接口来实现。
System.Object
22、通过超链接怎样传递中文参数?
用URL编码,通过QueryString传递,用urlencode编码 用urldecode解码。
aspx传aspx
//请求URL中对中文编码
string Name = "中文参数";
Response.Redirect("B.aspx?Name="+Server.UrlEncode(Name)) ;
//接收端进行解码
string Name = Request.QueryString["Name"];
Response.Write(Server.UrlDecode(Name)) ;
23、AJAX解决什么问题?如何使用AJAX?AJAX有什么问题需要注意?项目中哪里用到了AJAX?
AJAX解决的问题就是“无刷新更新页面”
1,创建异步对象
var xmlHttp=new XMLHttpRequest();
或 var xmlHttp=new ActiveXObject("Microsoft.XMLHTTP")
2,加载要获取的服务器页面
xmlHttp.open(Method,URL)
3,判断异步调用的状态onreadystatechange事件中判断xmlHttp.readyState和xmlHttp.Status
4,发送异步请求
xmlHttp.send();
AJAX最重要的问题是无法跨域请求(www.rupeng.com →so.rupeng.com),也就是无法在页面中向和当前域名不同的页面发送请求,可以使用在当前页面所在的域的服务端做代理页面的方式解决。
24、开放式问题:你经常访问的技术类的网站是什么?
博客园和CSDN
25、你对.net的GC的理解
GC是.Net的垃圾收集器,可以进行内存资源的回收,程序员无需关心资源的回收,当一个对象没有任何引用的时候就可以被回收了。一个对象可以被回收并不意味着一定会被立即回收,GC会选择时机进行回收。可以调用GC.Collect()让GC立即回收。GC不能回收非托管资源,对于非托管资源一般都实现了IDisposable接口,然后使用using关键字进行资源的回收。
26、请你简单的说明数据库建立索引的优缺点
使用索引可以加快数据的查询速度,不过由于数据插入过程中会建索引,所以会降低数据的插入、更新速度,索引还会占磁盘空间。
27、Session有什么重大BUG,微软提出了什么方法加以解决?(常考)
是iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件。
28、说说在软件设计中你遇到的以空间换时间的例子?
Cache、索引、简繁转换用Dictionary。谈Cache(缓存)、索引这些例子。用额外的磁盘、内存空间的消耗来提高执行速度
29、asp.net中的错误机制。(常考)
.NET提供了四种错误处理机制,它们有一定的优先级顺序:
Page_Error事件 > ErrorPage属性 > Application_Error事件 >
要让ErrorPage属性能够发挥作用,
Application_Error事件在 Global.asax中
30、有一个10个数的数组,计算其中不重复数字的个数。{3,5,9,8,10,5,3,7,6,4}
HashSet
int x = 0;
int[] list = { 3, 5, 9, 8, 10, 5, 3 };
HashSet<int> set = new HashSet<int>();
for (int i = 0; i < list.Length; i++)
{
set.Add(list[i]);
}
foreach (int item in set)
{
x++;
}
Console.WriteLine(x);
Console.ReadLine();
31、下面是一个由*号组成的4行倒三角形图案。要求:1、输入倒三角形的行数,行数的取值3-21之间,对于非法的行数,要求抛出提示“非法行数!”;2、在屏幕上打印这个指定了行数的倒三角形。
*******
*****
***
*
aa:
Console.Clear();
Console.WriteLine("请输入倒三角形的行数: 行数的取值在3-21之间");
int i=int.Parse(Console.ReadLine());
if (i<3||i>21)
{
Console.WriteLine(" 非法行数 !!");
Console.ReadLine();
goto aa;
}
int x = i;
for ( ; i >0; i--)
{
for (int j = 0; j < x-i; j++)
{
Console.Write(" ");
}
for (int k =2*i-1; k >0; k--)
{
Console.Write("*");
}
Console.WriteLine();
}
Console.WriteLine();
32、下面的程序执行结果是什么?
class Person
{ public int Age { get; set; }
}
int i1 = 20;
int i2 = i1;
i1++;
Console.WriteLine(i2); //值类型
Person p1 = new Person();
p1.Age = 20;
Person p2 = p1;
p1.Age++;
Console.WriteLine(p2.Age); //引用类型 引用的是地址 p2和p指向的是同一个地址
20 、21
33、下面程序的执行结果是什么?
public struct Point
{
public int x;
public int y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
}
Point p1 = new Point(100, 100);
Point p2 = p1;
p1.x = 200;
Console.WriteLine("{0},{1}", p1.x, p2.x); //struct 是值类型 copy的值
200,100
34、不用JQuery等框架实现AJAX无刷新登录。(常考)
1,创建异步对象
var xmlHttp=new XMLHttpRequest();
或 var xmlHttp=new ActiveXObject("Microsoft.XMLHTTP")
2,加载要获取的服务器页面
xmlHttp.open(Method,URL)
3,判断异步调用的状态
3,判断异步调用的状态onreadystatechange事件中判断xmlHttp.readyState和xmlHttp.Status
4,发送异步请求
xmlHttp.send();
35、Http状态码各是什么意思。
成功2×× 成功处理了请求的状态码。
200 成功
重定向3×× 每次请求中使用重定向不要超过 5 次。
客户端错误4×× 表示请求可能出错,妨碍了服务器的处理。
404 找不到请求的网页。服务器上不存在的网页经常会返回此代码
服务器错误5×× 表示服务器在处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。
500 服务器遇到错误,无法完成请求
36、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的代码会不会被执行,什么时候被执行?
int Get(){ int i=1;
try{ retun i; }
finlly{ i++; }
}
结果为1 而不是2
在执行return语句时,已经把返回的结果准备好了,(这个值改不了)
这时转到finally语句去执行,再返回结果
总结:
try{}中的return执行后在没有返回数据时先去执行finally{}中的代码,然后再返回。所以说finally{}在return中间执行。
37、一个数组:1,1,2,3,5,8,13,21...+m,求第30位数是多少?用递归实现;(常考!!!,提示:搜索斐波那契数列)
斐波那契数列百度百科
斐波那契数列指的是这样一个数列:0、1、1、2、3、5、8、13、21、……
在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)
static void Main(string[] args)
{
//会一直调自己,一直调到i为1
Console.WriteLine(Foo(30));
Console.ReadLine();
}
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);
}
38、产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。(要求使用两种方法)
1,
List<int> myList = new List<int>();
Random ran = new Random();
while (myList.Count<100)
{
int num = ran.Next(1, 101);
if (!myList.Contains(num))
{
myList.Add(num);
}
}
foreach (int item in myList)
{
Console.WriteLine(item);
}
Console.WriteLine(myList.Count);
Console.ReadLine();
2,
HashSet<int> myList = new HashSet<int>();
Random ran = new Random();
while (myList.Count<100)
{
int num = ran.Next(1, 101);
myList.Add(num);
}
foreach (int item in myList)
{
Console.WriteLine(item);
}
Console.WriteLine(myList.Count);
Console.ReadLine();
39、冒泡排序数组(背也要背下来,50%必考!)
int[] myList = new int[] { 5, 9, 1, 10, 7, 6, 4, 3, 8, 2, 7 };
for (int i = 0; i < myList.Length-1; i++)
{
for (int j = 0; j < myList.Length-1; j++)
{
if (myList[j]>myList[j+1])
{
int temp = myList[j]; //中间变量用来做交换
myList[j] = myList[j + 1];
myList[j + 1] = temp;
}
}
}
foreach (int item in myList)
{
Console.WriteLine(item);
}
Console.ReadLine();
40、C#中的委托是什么?事件是不是一种委托?事件和委托的关系。
委托可以理解为指向一个函数的指针。
委托和事件没有可比性,因为委托是类型,事件是对象,下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的内部是用委托实现的。因为对于事件来讲,外部只能“注册自己+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件是用来阉割委托实例的,类比用一个自定义类阉割List。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能= 。加分的补充回答:事件内部就是一个private的委托和add、remove两个方法。
41、override与重载(overload)的区别
重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要。重载(overload)是面向过程的概念。Override 是进行基类中函数的重写。Override是面向
对象的概念
42、属性和public字段的区别是什么?
公共字段只是类用public修饰符所公开的简单公共变量,而属性则是对字段的封装。
属性可以对设值、取值的过程进行非法值控制,比如年龄禁止设值负数,而字段则不能进行这样的设置。
43、CTS、CLS、CLR分别作何解释(重要)把英文全称背过来。
CTS:Common Type System 通用系统类型。Int32、Int16→int、String→string、Boolean→bool
CLS:Common Language Specification 通用语言规范。不同语言语法的不同。
CLR:Common Language Runtime 公共语言运行时,就是.Net提供的那些 类。
44、C#和.Net的关系
.net是一个运行平台,C#只是用于编写运行在该平台上的一种语言
.net是框架,C#是语言
45、在dotnet中类(class)与结构(struct)的异同?
Class可以被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递的。
Struct属于值类型,是分配在内存的栈上的。结构体是复制传递的。Int32、Boolean等都属于结构体。
46、堆和栈的区别?
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
47、值类型和引用类型的区别?
1.将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
2.值类型不可能派生出新的类型:所有的值类型均隐式派生自 System.ValueType。但与引用类型相同的是,结构也可以实现接口。
3.值类型不可能包含 null 值:然而,可空类型功能允许将 null 赋给值类型。
4.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值
48、C#中的接口和类有什么异同。
不同点:
不能直接实例化接口。
接口不包含方法的实现。
接口可以多继承,类只能单继承。
类定义可在不同的源文件之间进行拆分。用partial 修饰
相同点:
接口、类和结构都可以从多个接口继承。
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
接口和类都可以包含事件、索引器、方法和属性。
49、abstract class和interface有什么区别?
同点:
都不能被直接实例化,都可以通过继承实现其抽象方法。
不同点:
接口支持多继承;抽象类不能实现多继承。
接口只能定义行为;抽象类既可以定义行为,还可能提供实现。
接口可以用于支持回调(CallBack);抽象类不能实现回调,因为继承不支持。
接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。
接口可以作用于值类型(Struct)和引用类型(Class);抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。
50、XML 与 HTML 的主要区别
1. XML是区分大小写字母的,HTML不区分。
2. 在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略
或者之类的结束 标记。在XML中,绝对不能省略掉结束标记。HTML:
XML:
3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为结尾。这样分析器就知道不用 查找结束标记了。
4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。
5. 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。
XML是用来存储和传输数据的
HTML是用来显示数据的
51、string str = null 与 string str =””说明其中的区别
sring str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间。
string str = null没有string对象,string str = “”有一个字符串对象。
52、StringBuilder 和 String 的区别?
String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不会。所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String
如果要操作一个不断增长的字符串,尽量不用String类,改用StringBuilder类.
String类是一种传统的修改字符串的方式,因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象
而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。
53、请叙述属性与索引器的区别。 (重要)
属性 索引器
通过名称标识。 通过签名标识。
通过简单名称或成员访问来访问。 通过元素访问来访问。
可以为静态成员或实例成员。 必须为实例成员。
属性的 get 访问器没有参数。 索引器的 get 访问器具有与索引器相同的形参表。
属性的 set 访问器包含隐式 value 参数。 除了 value 参数外,索引器的 set 访问器还具有与索引器相同的形参表。
54、请解释ASP。NET中的web页面与其隐藏类之间的关系?
个ASP.NET页面一般都对应一个隐藏类,一般都在ASP.NET页面的声明中指定了隐藏类例如一个页面Tst1.aspx的页面声明如下
<%@ Page language="c#" Codebehind="Tst1.aspx.cs" AutoEventWireup="false" Inherits="T1.Tst1" %>
Codebehind="Tst1.aspx.cs" 表明经编译此页面时使用哪一个代码文件,Inherits="T1.Tst1" 表用运行时使用哪一个隐藏类
55、DataReader和DataSet的异同?
DataReader使用时始终占用SqlConnection,在线操作数据库每次只在内存中加载一条数据,所以占用的内存是很小的是只进的、 只读的
DataSet则是将数据一次性加载在内存中.抛弃数据库连接..读取完毕即放弃数据库连接(非连接模式)
DataSet将数据全部加载在内存中.所以比较消耗内存...但是确比DataReader要灵活..可以动态的添加行,列,数据.
对数据库进行 回传更新操作(动态操作读入到内存的数据)
56、string、String;int、Int32;Boolean、bool的区别?
1. bool是基本值类型,Boolean 是对象.
2. bool是Boolean的别名.bool是C#中的,Boolean是.net Framework中的。
最后总结:bool就像你的乳名,你爹妈以及你们内部所属成员都认识,Boolean就像你的学名。大家都认识。
不过不管按照学名还是乳名称呼你,最终的目的是一样的,还是你这个人。对于String和string的关系也是如此。
57、Server.Transfer和Response.Redirect的区别是什么?(常考)
server.Transfer 仅是服务器中控制权的转向,在客户端浏览器地址栏中不会显示出转向 后的地址;
Response.Redirect 则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请 求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。
Server.Transfer 是服务器请求资源,服务器直接访问目标地址的 URL,把那个 URL 的响应 内容读取过来, 然后把这些内容再发给浏览器, 浏览器根本不知道服务器发送的内容是从哪 儿来的,所以它的地址栏中还是原来的地址。 这个过程中浏览器和 Web 服务器之间经过了 一次交互。
Response.Redirect 就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地 址,一般来说浏览器会用刚才请求的所有参数重新请求。这个过程中浏览器和 Web 服务器 之间经过了两次交互
58、您在什么情况下会用到虚方法?它与接口有什么不同?
子类重新定义父类的某一个方法时,必须把父类的方法定义为virtual,接口中的方法都是没有实现功能的方法体的。实现时,子类可以不重新定义虚方法,但如果一个类继承接口,那必须实现这个接口。
59、post、get的区别?
数据:
get请求参数是放在请求头中的,长度有限制,根据浏览器设置决定,超过不会发送,直接丢掉;
post请求参数是专门放在数据区,没有长度限制;
请求次数:
------->根据浏览器不同决定
get请求一次,直接将数据传递过去;
post:有可能直接是一次将数据传递过去;还有一种可能就是2次,第一次过去告诉服务器我将要带多大数据过来,第二次直接将数据传递过去;
显示与不显示
get请求参数会显示在你的浏览器的地址栏;
post请求参数不会显示在你的地址栏中;
60、.Net、ASP.Net、C#、VisualStudio之间的关系是什么?
asp.net是一种技术,要实现这种技术,
就得有底层的实现技术编程语言,这个语言就是C#,(只是绝大多数首选C#),
要想用C#实现asp.net技术,就得有编程的工具软件,
这个软件我一直用visual studio,
visual studio支持许多种语言,是个很强大的软件,!
VisualStudio是微软提供的用来进行.Net开发的集成开发环境