关键词不能为空

当前您在: 主页 > 英语 >

你必须知道的Csharp的25个基础概念

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-03-03 12:39
tags:

-

2021年3月3日发(作者:reborn)


1.


静态变量和非静态变量的区别?







static readonly


区别?





是什么意思?




ct


是什么意思?




al


修饰符起什么作用?





修饰符是干什么的?




de




overload


的区别?




8.


什么是索引指示器?





修饰符是起什么作用?





关键字的含义?




11.


可以使用抽象函数重写基类中 的虚函数吗?




12.


密封类可以有虚函数吗?




13.


如果基类中的虚属性只有一个 属性访问器,那么继承类重写该属性后可以有几个属性访


问器?如果基类中有

< p>


get




set


两个呢?




ct


可以和



virtual


一起使用吗?可以和



override


一起使用吗?




15.


接口可以包含哪些成员?




16.


类和结构的区别?




17.


接口的多继承会带来哪些问题?




18.


抽象类和接口的区别?




19.


别名指示符是什么?




20.


如何释放非托管资源?




21.P/Invoke


是什么?




Builder




String


的区别?




it




implicit


的含义?





有什么用?




25.


什么是反射?





1.


静态变量和非静态变量的区别?



答:



静态变量:



静态变量使用



static


修饰符进行声明



在所属类被装载时创建



通过类进行访问



所属类的所有实例的同一静态变量都是同一个值



非静态变量:



不带有



static


修饰符声明的变量称做非静态变量



在类被实例化时创建



通过


对象进行访问



同一个类的不同实例的同一非静态变量可以是不同的值



示例:






using System;


using c;


using


namespace Example01


{






class Program






{










class Class1










{














public static String staticStr = &quot;Class&quot;;














public String notstaticStr = &quot;Obj&quot;;










}










static void Main(string[] args)










{














//


静态 变量通过类进行访问,该类所有实例的同一静态变量都是同一个值















ine(&quot;Class1's


Str);














Class1 tmpObj1 = new Class1();














ticStr = &quot;tmpObj1&quot;;














Class1 tmpObj2 = new Class1();














ticStr = &quot;tmpObj2&quot;;














//


非静态变量通过对象进行访问,不同对象的同一非静态变量可以 有不同的值















ine(&quot;tmpObj1's


ticStr);














ine(&quot;tmpObj2's


ticStr);














ne();










}






}


}


notstaticStr:


notstaticStr:


{0}&quot;,


{0}&quot;,


staticStr:


{0}&quot;,


复制代码



结果:



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







static readonly


区别




答:



const




const

修饰符声明的成员叫常量,是在编


译期初始化并嵌入到客户端程序

< br>


static


readonly




static


readonly


修饰符声明的成员依然

是变量,


只不过具有和常量类似的使用方法:


通过类进行访 问、


初始化后不可以修改。


但与


常量不 同的是这种变量是在运行期初始化



示例:



测试类:





using System;


using c;


using


namespace Example02Lib


{






public class Class1






{










public const String strConst = &quot;Const&quot;;










public


static


readonly


String


strStaticReadonly


&quot;StaticReadonly&quot;;










//public const String strConst = &quot;Const Changed&quot;;


Changed&quot;;






}//5-1-a-s-p-x


}


复制代码



客户端代码:





using System;


using c;


using


using Example02Lib;


namespace Example02


{






class Program






{










static void Main(string[] args)










{














//


修改


E xample02



Class1


的< /p>


strConst


初始值后,只编译


Ex ample02Lib


项目















//< /p>


然后到资源管理器里把新编译的



拷贝



所在的


目录,执行















//


切不可在


IDE


里直接调试运行因为这会重新编译整个解决方案!
















//


可以看到


strConst

< p>
的输出没有改变,而


strStaticReadonly


的输出已经改变















//


表明


Const


变量是在编译期初始化并嵌入到客户端程序,而


StaticReadonly


是在运行时初始化的















ine(&quot;strConst : {0}&quot;, st);


=










//public


static


readonly


String


strStaticReadonly


=


&quot;StaticReadonly














ine(&quot;strStaticReadonly


ticReadonly);














ne();










}






}


}


复制代码



:


{0}&quot;,


结果:



strConst : Const strStaticReadonly : StaticReadonly


修改后的示例:



测试类:





using System;


using c;


using


namespace Example02Lib


{






public class Class1






{










//public const String strConst = &quot;Const&quot;;










//public


static


readonly


String


strStaticReadonly


&quot;StaticReadonly&quot;;










public const String strConst = &quot;Const Changed&quot;;










public


static


readonly


String


strStaticReadonly


=


&quot;StaticReadonly


Changed&quot;;






}


}


复制代码



结果



strConst : Const strStaticReadonly : StaticReadonly Changed





是什么意思?



答:



extern


修饰符用于声明由程序集外部实现的成员函数



经常用


于系统


API


函数的调 用


(通过



DllImport




注意,



DllImport


一起使用时要加上



static



饰符



也可以用于对于同一程序集不同版本组件的调用(用



extern


声明别名)



不能与



abstract


修饰符同时使用


51aspx


示例:





using System;


using c;


using


using pServices;


namespace Example03


{






class Program






{










//< /p>


注意


DllImport


是一个


Attribute


Property


,在< /p>


pServices


命名


空间中定义











//extern



DllImport


一起使用时必须再加上一个


sta tic


修饰符











[DllImport(&quot;&quot;)]


=










public


static


extern


int


MessageBox(int


Handle,


string


Message,


string


Caption,


int


Type);










static int Main()










{














string myString;














(&quot;Enter your message: &quot;);














myString = ne();














return MessageBox(0, myString, &quot;My Message Box&quot;, 0);










}






}


}


复制代码



结果:




ct


是什么意思?



答:



abstract

< p>
修饰符可以用于类、方法、属性、事件和索引指示




indexer




表示其为抽象成员



abstract


不可以和



static



virtual



override


一起使用




明为



abstract


成员可以不包括实现代码,但只有类中还有 未实现的抽象成员,该类就不可


以被实例化,通常用于强制继承类必须实现某一成员



示例:





using System;


using c;


using


namespace Example04


{






#region


基类,抽象类







public abstract class BaseClass






{










//


抽象属性,同时具有

< p>
get



set


访问器表 示继承类必须将该属性实现为可读写











public abstract String Attribute










{














get;














set;










}










//< /p>


抽象方法,传入一个字符串参数无返回值











public abstract void Function(String value);










//


抽象事件,类型为系统预定义的 代理


(delegate)



Even tHandler










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).; i++)














{


















ine(((DeriveClass)sender)[i]);














}










}










static void Main(string[] args)










{














DeriveClass tmpObj = new DeriveClass();














ute = &quot;1234567&quot;;














ine(ute);














//


将静 态函数


OnFunction



tmp Obj


对象的


Event


事件进行关联















+= new EventHandler(OnFunction);














on(&quot;7654321&quot;);














ne();










}






}


}


复制代码



结果:



1234567 7 6 5 4 3 2 1



al


修饰符起什么作用?



答:



internal

< p>
修饰符可以用于类型或成员,使用该修饰符


声明的类型或成员只能在同一程 集内访问



接口的成员不能使用



internal


修饰符



示例



Example05Lib


项目的



Class1




using System;


using c;


using


namespace Example05Lib


{






public class Class1






{










internal String strInternal = null;










public String strPublic;






}


}


复制代码



结果



Example05Lib


项目的



Class2


类可以访问到



Class1




strInternal


成员



Example05


项目的



Program


类无法访问到



Class1




strInternal


成员






修饰符是干什么的?



答:



sealed


修饰符表示密封



用于类时,表示该类 不能再被


继承,


不能和



abstract


同时使用,


因为这 两个修饰符在含义上互相排斥



用于方法和属性时,

< p>
表示该方法或属性不能再被继承,


必须和



override


关键字一起使用,


因为使用



sealed


修饰


符的方法或属性肯 定是基类中相应的虚成员



通常用于实现第三方类库时不想被客 户端继


承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱

< p>


恰当的利用



sealed


修饰符也可以提高一定的运行效率,因为不用考 虑继承类会重写该成员



示例:





using System;


using c;


using


namespace Example06


{






class Program






{










class A










{














public virtual void F()














{


















ine(&quot;A.F&quot;);














}














public virtual void G()














{


















ine(&quot;A.G&quot;);














}










}










class B : A










{














public sealed override void F()














{


















ine(&quot;B.F&quot;);














}














public override void G()














{


















ine(&quot;B.G&quot;);














}










}










class C : B










{














public override void G()














{


















ine(&quot;C.G&quot;);














}










}










static void Main(string[] args)










{














new A().F();














new A().G();














new B().F();














new B().G();














new C().F();














new C().G();














ne();










}






}


}


复制代码



结果:





B


在继承类



A



时可以重写两个虚函数,如图所示:



由于类



B


中对



F


方法进


行了密封,





C


在继承类



B


时只能重写一个函数,


如图所示:



控制台输出结果,




C



方法



F


只能是输出




B


中对该方法的实现:



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



de




overload


的区别?



答:



override

< p>
表示重写,用于继承类对基类中虚成员的


实现



overload


表示重载,用于同一个类中同名方法不同参 数(包括类型不同或个数不同)


的实现



示例:





using System;


using c;


using


namespace Example07


{






class Program






{










class BaseClass










{














public virtual void F()














{


















ine(&quot;BaseClass.F&quot;);














}










}










class DeriveClass : BaseClass










{














public override void F()














{


















base.F();


















ine(&quot;DeriveClass.F&quot;);














}














public void Add(int Left, int Right)















{


















ine(&quot;Add for Int: {0}&quot;, Left + Right);














}














public void Add(double Left, double Right)














{


















ine(&quot;Add for int: {0}&quot;, Left + Right);














}










}










static void Main(string[] args)










{














DeriveClass tmpObj = new DeriveClass();














tmpObj.F();














(1, 2);














(1.1, 2.2);














ne();










}






}


}


复制代码



结果:



BaseClass.F DeriveClass.F Add for Int: 3 Add for int: 3.3 8.


什么是索引指示器?



答:




现索 引指示器



indexer



的类可以象数组那样使用其实例后的对象,


但与数组不同的是索引


指示器的参数类型不仅限于


int


简单来说,其本质就是一个含参数属性



示例:





using System;


using c;


using


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 (&quot;X: {0} , Y


: {1}&quot;, x, y);










}






}






public class Points






{










Point[] points;










public Points(Point[] Points)










{














points = Points;










}










public int PointNumber










{














get















{



















return















}










}














//


实现索引访问器











public Point this[int Index]










{














get














{


















return points[Index];














}










}






}







//


感谢


watson hua(/)


的指点







//< /p>


索引指示器的实质是含参属性,参数并不只限于


int






class WeatherOfWeek






{










public string this[int Index]










{














get














{


















//< /p>


注意


case


段使用

return


直接返回所以不需要


break


















switch (Index)


















{






















case 0:


























{






























return &quot;Today is cloudy!&quot;;


























}






















case 5:


























{






























return &quot;Today is thundershower!&quot;;


























}






















default:


























{






























return &quot;Today is fine!&quot;;


























}


















}














}










}










public string this[string Day]










{














get














{


















string TodayWeather = null;


















//switch


的标准写法



















switch (Day)


















{






















case &quot;Sunday&quot;:


























{






























TodayWeather = &quot;Today is cloudy!&quot;;






























break;


























}






















case &quot;Friday&quot;:


























{






























TodayWeather


thundershower!&quot;;






























break;


























}






















default:


























{






























TodayWeather = &quot;Today is fine!&quot;;






























break;


























}


















}


















return TodayWeather;














}










}






}






class Program






{










static void Main(string[] args)










{














Point[] tmpPoints = new Point[10];














for (int i = 0; i < i++)














{


















tmpPoints[i] = new Point(i, (i));














}














Points tmpObj = new Points(tmpPoints);














for (int i = 0; i < umber; i++)














{


















ine(tmpObj[i]);














}
















string[]


Week


=


new


string[]


{


&quot;Sunday&quot;,


&quot;Tuesday&quot;,


&quot;Thursday&quot;,


=


&quot;Today


is


&quot;Monday&quot;,


&quot;Wednesday&quot;,


&quot;Friday&quot;, &quot;Staurday&quot;};














WeatherOfWeek tmpWeatherOfWeek = new WeatherOfWeek();














for (int i = 0; i < 6; i++)














{


















ine(tmpWeatherOfWeek[i]);














}














foreach (string tmpDay in Week)














{


















ine(tmpWeatherOfWeek[tmpDay]);














}














ne();










}






}


}


复制代码



结果:



X:


0


,


Y


:


0


X:


1


,


Y


:


0.84147


X:


2


,


Y


:


0.982


X:


3


,


Y


:


0.14112


X:


4


,


Y


:


-0.7568


X:


5


,


Y


:


-0.958924274663138


X:


6


,


Y


:


-0.2794


X:


7


,


Y


:


0.656986598718789


X:


8


,


Y


:


0.989358246623382


X:


9


,


Y


:


0.4757 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!




修饰符是起什么作用?



答:



new


修饰符与



new


操作符是两个概念



new


修饰符用


于声明类或类的成员,表示隐藏了基类中同名的成员。而


new


操作符用于实例化一个类型



new


修饰符只能用于继承类,一般用于弥补基类设计的不足



new


修饰符和



override


修饰


符不可同时用 在一个成员上,因为这两个修饰符在含义上互相排斥



示例:





using System;


using c;


using


namespace Example09


{






class BaseClass






{










//


基类设计者声明了一个


PI

< p>
的公共变量,方便进行运算











public static double PI = 3.1415;






}






class DervieClass : BaseClass






{










//


继承 类发现该变量的值不能满足运算精度,


于是可以通过


new


修饰符显示隐藏基


类中的声明











public new static double PI = 3.1415926;






}






class Program






{










static void Main(string[] args)










{














ine();














ine();














ne();










}






}


}


复制代码



结果:



3.1415 3.1415926




关键字的含义?



答:



this

是一个保留字,


仅限于构造函数和方法成员中使用



在类


的构造函数中出现表示对正在构造的对象本身的引用,

< p>
在类的方法中出现表示对调用该方法


的对象的引用,


在结构的构造上函数中出现表示对正在构造的结构的引用,


在结构的方法中

< p>
出现表示对调用该方法的结果的引用



this


保留字不能用于静态成员的实现里,因为这时对


象或结构并未实 例化





C#


系统中,


this


实际上是一个常量,所以不能使用



this++


这样


的运算



this


保留字一般用于限定同名的隐藏成员、


将对象本身做为参数、


声明索引访问器、


判断传入参 数的对象是否为本身



示例:





using System;


using c;


using


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


(&quot;{0}


Celsius


=


{1}


Fahrenheit&quot;,


c,


UnitTransClass.C2F(this));










}










//


由于好奇,在这做了一个效率测试,想看看到底哪种方式访问成 员变量更快,结

-


-


-


-


-


-


-


-



本文更新与2021-03-03 12:39,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/699963.html

你必须知道的Csharp的25个基础概念的相关文章