C#基础

C#基础---个人整理

.NET 体系结构

         C#.NET关系?

C#是一种基于面向对象的开发编程语言,它可以利用.Net Framework及其他开发环境中的所有新特性以及编程方法。

.Net Microsoft 面向XML Web 服务的平台,该平台支持多种开发语言,它的应用程序由.Net Framework来加以管理;它有一个非常直观形象的编程基类库,而且它是一个跨语言的编程平台,对动态网页支持非常好,数据访问效率高,代码可以实现共享,提高了代码的重用性,web服务支持好等诸多优点。

         什么是公共语言运行库?

.Net Framework由框架类库和公共语言运行时这两个组件构成的,公共语言运行库又包括了CLSCTS,其实,.NetFramework的主要目的之一是将各种运行时环境结合起来,使得开发人员使用单一的运行时服务,CLR为与.Net Framework配合使用的任何语言提供内存管理、安全性和错误处理等功能。.Net中的所有代码都由CLR管理,它为可执行代码提供操作系统服务。

         托管代码的优点和缺点?

所谓的代码托管是:.Net Framework的主要目的之一就是将各种运行时环境结合起来,使开发人员使用单一的运行时服务,而且它提供了公共语言运行时,CLR为与.Net Framework配合使用的任何语言提供了内存管理、安全性和错误处理等功能的代码,在.Net中所有的代码都由CLR管理。

优点:是一种跨语言的平台,无论何种编程语言,他们通过代码托管都是用统一的语言库;提高性能;语言的互操作性;

代码托管的缺点:速度慢,只能依赖于Framework或虚拟机执行,而不能直接在系统底层操作

         解释以下类型的含义:

类型

含义

Type

代表任何类型的基类

Value Type

代表任何值类型的基类

Enumerations

枚举值的集合

Interface Types

接口

Arrays

包含对象数组的类型

Class Types

可自我的类型,但不是数组

Delegates

用于把引用包含在方法中的类型

         命名空间是指什么?微软建议的命名空间是什么?

命名空间是用来将具有相关功能的相似类在逻辑上进行分组避免命名冲突,还可用来对相似数据类型进行分组。使用命名空间可以有助于改善数据的构成,从而使每个人可以轻松地获得想要的数据,在.Net Framework中所有的命名空间都是从System的公共命名空间形成的。System命名空间又称为根命名空间。

微软建议使用的命名空间为:在大多数情况下,都至少要提供两个嵌套的命名空间名,第一个公司名,第二个是技术名称或软件包的名称,而类是其中的一个成员,这样就可以避免与其他组织编写的命名发生冲突。

         .NET Framework类是指什么?

        .Net Framework 定义了.Net应用程序的开发和运行环境,以及在.Net应用程序中使用的类库,类似于Java的虚拟机,它不但使Internet上运行的应用程序更容易被开发,而且还可用于开发运行于Windows桌面上的传统业务应用程序。

    .Net Framework是一个创建、部署和运行应用程序的多语言多平台的编程环境,是一个可以为程序员提供程序编码的多平台应用程序。

    该平台有框架类库FCLFrame Class Lib)和公共语言运行时CLRCommon Language Runtime)这两个组建构成。

    .Net Framework 为开发人员提供了许多可重用的基础类、提高了程序代码的可重用性。

    它还包括一些编程语言以及ASP.Net,其中,asp.Net主要用于简化Web应用和服务的开发,不但使在传统意义上的应用和服务,而且还包括了移动设备上的应用和开发。

 

C#基础

         用文本编辑器写一个简单的控制台程序,然后使用csc.exe编译为exe程序,记录整个过程。

具体过程如下:

1、  编写源程序

2、  在命名窗口编译源程序

              

 

3、  执行可执行性文件

         以下程序会不会报错? 如果报错为什么?

class Program

    {

        static void Main(string[] args)

        {

            int d;

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

            {

                d++;

            }

        }

}

会报错:题目中的编码对变量d没有赋以初值,编译出现以下结果:

原因为:

C#中的变量在使用前不仅要对其声明,而且还要对其初始化,否则就会报错,之所以编译未通过,是因为初始化的时候才给变量分配内存空间!

         C#有两个方法可以确保变量在使用前进行了初始化,是什么?

1、  隐式初始化:变量是类或者结构中的字段,如果没有显示初始化,创建这些变量时,其值就默认是0

2、  通过编译时报错来提示:方法的局部变量必须在代码中显示初始化,之后才能在于语句中使用他们的值,初始化不是在声明该变量时就进行,编译器会检查所有的路径,若发现在使用该变量之前没有被初始化,程序将报错!

         以下程序会不会报错? 如果报错为什么?

class Program

    {

        static void Main(string[] args)

        {

           

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

            {

                int d = 0;//该方法的局部变量d的作用域在for循环内部,超出作用域范围将不能被使用

            }

 

            d++;

        }

}

变量d的引用超出了它的作用域:变量d是在for循环中声明的,而不能在for循环的外部再度调用,因为超出了它的作用范围,所以会报错!

         以下程序会输出多少?为什么?

using System;

class Program

    {

        static int d = 40;

 

        static void Main(string[] args)

        {

            int d = 10;         //局部变量将外部变量给屏覆盖

 

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

            {

                d++;           //变量d10开始不断加1

            }

 

            Console.WriteLine(d);

        }

}

程序执行结果为20:在程序中,定义了一个全局变量d,在主方法中又定义了一个局部变量d,局部变量会将外部的局部变量给覆盖,所以程序执行结果为20

         在程序中使用常量的特点和好处。

程序中,常量用const关键字来定义,常量一旦定义就不能再被修改,否则就会出错;

好处:用易于理解的名称或词用表示一个不明确的数字或字符串,使程序易于阅读;便于修改和维护,比如银行利率问题,如果银行需要调整利率,那么只需要修改该常量就可以;防止出现错误,如果不注意被再次修改重新赋值,造成数据错误!

         String类型是值类型还是引用类型?为什么?

String是引用类型:String本身是个类,继承与Object类,右边给他给予赋值的是字符串的首地址,而不是直接的值。

也可以说它是值类型,因为根据值类型的定义是存放值的副本,需要将其调用内存中,然后将其变量的值再传递出去;

示例:

运行结果:

根据运行结果可知其值没有发生变化!

         Foreachfor的区别?

Foreach循环一般用于遍历整个集合或数组,该循环不能用于改变集合或数组的内容;

     语法结构如下:

         Foreach(类型 元素 in 集合或数组){语句;}

For循环要求只有在特定条件进行判断后才允许执行循环,这种循环多用于将某个语句或语块重复执行特定的次数的情况;

     语法结构如下:

         For(初始值;条件;递增或递减){语句;}

         使用枚举的优点是什么?

枚举是一组已命名的数值常量,可以使代码更易于维护,有助于确保给变量指定合法的、期望的值;

枚举使代码更清晰,允许用描述性的名称表示整数值,而不是用含义模糊的数来表示;

包含于值相关联的数字,默认情况下,将0赋值给枚举对象的第一个元素,然后对每个后续的枚举元素按1递增,也可以自己制定。

         数组和集合的区别是什么?

数组中的元素类型都是一样的,而且都是要声明的,而集合中则可以是不同的元素类型,可以不必声明,集合都是以对象类型来存储;

数组的大小是固定的不可更改的,而集合的长度是可变的;

数组是一个可读可写结构的引用数据类型,而集合则拥有ReadOnly属性,这种属性可以以只读的方式来访问;

         命名空间别名怎么使用?

命名空间可以避免名称的冲突,还有助于组织代码,在代码中使用命名空间降低在应用程序中的重用此代码的复杂性;

如果命名空间比较长而且又要在程序中多次使用,那么可以给命名空间指定一个别名,这样可以简化使用操作,语法为:using  shortName = LongNameSpace

举个例子:

com.gyyx.wl命名空间指定NewNameSpace别名,并使用这个别名实例化一个NameSpaceExample对象,命名空间的别名的修饰符是::。将先从别名NewNameSpace开始搜索,如果在相同的作用域中引入了一个NewNameSpace类会发生冲突,      NameSpaceExample类有一个方法GetNameSpace(),该方法调用每个类都由GetType()方法:

Using System

Using NewNameSpace = com.gyyx.wl

Class Test{

Public static int MainString [] args

{

NewNameSpace::NameSpaceExample objNameSpaceExample = new    NewNameSpace::NameSpaceExample();

Console.WriteLine(objNameSpaceExample.GetNameSpace());

Return 0;

}

}

 

Namespace com.gyyx.wl

{

Class NameSpaceExample

{

Public string GetNamespace()

{

Return this.GetType().NameSpace

}

}

}

 

         如何给Main()函数传递参数?(写个例子)

通过Main方法中的args数组接收控制台的数据,然后紧接着将接收到的数据打印给用户:

        编写的程序代码如下:

        

         编译执行以上代码结果为:

        

         如何在C#代码中写注释?

注释可以增加程序的可读性和可维护性,以便有利于程序的进一步扩展,就如同我们开发的群里的公告所说的一样:唯有写出人类容易理解的代码才是优秀的程序员。注释可以有助于程序员成为优秀的程序员!注释的规范化可以让读程序的人非常清晰地了解到程序员的思路,降低逻辑错误。

1、  文件级注释:它是重在说明整个代码文件的功能,它包括文件的基本信息(文件的作者、日期、描述、修改情况等),目的是为了增加可维护性:

/***文档注释***********************************************

   *   者:王雷

*    期:2011/2/16

*    述:此文件用来实现对天骄III的充值操作的实现

**********************************************************/

2、  函数级注释:函数级注释主要是针对于函数的功能、参数、返回值类型进行描述以增加程序的可读性:

///<summary>

///功能描述

///</summary>

///<param name=”id”>对个别字段的解释</param>

///<returns>返回值类型</returns>

3、  代码块级注释:往往一个特定的代码块完成一个特定的子功能,有时候也被称为功能块,有助于理清整个函数的功能:

Public int exampleMethod

{

第一行块代码

//l链接数据库,失败后返回并记录日志

第二行块代码的编写

。。。。。

}

 

一般情况下块级注释之间间隔一行,而且往往在代码块的第一行后面添加块级注释。

4、  代码行级注释:在程序设计中,有的代码语句也是非常难以理解的,在适当的代码行中也需要添加相应的注释以增强程序的可读性:

dbConn.Open(); //连接数据库

               行注释直接写在该行的后面。

         #regin#endregion是干什么的?

#regin#endregion是用于将一段代码标记为有给定名称的一个块,往往在编码过程中,为了实现某个功能可能代码段较长,可读性较差,这个时候需要将该段代码给定一个特定的标记符,不影响编译,能够很好地在屏幕上进行布局,增加程序的可读性。

         C#语言中推荐的编程规则是什么?(结合代码规范学习)

应该好好看看咱们开发部vss的编程规范,最终还是为了程序的可读性、可维护性、扩展性;

1、  标识名命名规则:

标识符只能有字母、数字下划线组成;

标识符只能以字母或下划线开头;

不能使用C#中的关键字;

2、  用法规范:

为了增强程序的可读性、可维护性以及可扩展性,一般约定一种命名规范,以便在团队中合作!

对象和类型

         什么是类,什么是实例?

类是对一组具有相同属性和行为的对象的描述,内容(也称为类的成员)包括属性和方法;类名通常用帕斯卡命名法,大都确保类名为一个名词,其定义结构为:

                    Public class ClassExample

                    {

         //类的主体---包含属性和方法

}

        实例又称为对象,它通常是用来定义具有属性和行为的任何一个概念或者事物,在OOP编程中,一切物体皆是对象即实例,实例的声明语法为:

                            ClassName  objClass = new ClassName();

         什么是类的数据成员?什么是类的函数成员?

类的数据成员包含了类的数据,分别是字段、常量和事件;

类的函数成员包括方法、属性、构造方法、终结器(这里指的是析构函数,当CLR检测到某个对象不再需要被调用时,类似于构造方法,CLR进行自动垃圾回收机制)、运算符、索引器(允许对象以数组或集合的方式进行索引);

         Ref参数 out参数在什么时候使用?

都是按引用方式传递参数,但是有ref标识的参数在调用前必需先赋初值,out标识的参数则不用,但是在调用过程中,必需赋值

Ref可以实现将值参数通过引用传递给方法,在方法的调用和声明方法的参数时都需要加上Ref关键字,这样可以将改变的数据带回引用;但是在传递给方法之前,无论是值传递还是引用传递都需要对变量进行初始化。

         什么是方法重载?

方法的重载是多个方法共用一个方法名,但是对不同数据执行相似的功能,根据方法的签名来识别选用执行哪一个方法;重载的方法不能仅仅在返回值类型上有区别,而且不能利用参数类型是Ref还是Out来区别;

         什么是属性?什么是只读属性?

属性它是一个方法或者一对方法,从客户机代码上来看是一个字段,例如在Windows的窗体上的Height属性,可以通过设置其Height属性来设置其高,这样在语法上想当于调用了属性访问器,来设置了窗体的高度;在C#中属性的定义语法为:

                             Public string PropertyName

{

Get            //get属性

         {

Return  the value of the Property;

}

                                     Set

                                               {

                                               Set the new value as the property value;

}

}

                   在这里get/set访问器都不带参数;

         只读属性就是指在属性的定义中省略了set属性访问器;

         讲述一下构造函数重载。

首先看一下构造函数的语法结构(构造访问没有返回值类型):

             [修饰符]  ClassName(参数列表)

             {

             //方法体

}

    构造方法的调用是在实例化对象时被自动调用的,默认的是无参类型的构造方法,根据实际需要还可以重载为不同参数或者不同类型的参数的构造方法,调用原理和无参类型的一致,一般情况下,构造方法多用于初始化对象属性,有时也用于其它用途。

         讲述一下静态的构造函数。

这种构造方法只能被执行一次,这样可以确保在类的成员对象调用之前调用,它没有访问修饰符,只能访问静态成员而不能访问实例成员,它是在加载类的时候进行执行。

         静态类的特点是什么?

静态类只包含静态的属性和方法,在静态类的方法被调用时,不需要使用对象来调用,只需要使用静态类名来调用就可以,在功能上和该类被声明为private是一样的,不能实例化对象,也不能被继承。

         Object类的方法都有哪些?

所有的类都继承于Object类,方法:

1、  ToString()获取字符串对象的一种方式

2、  GetHashTable()方法:当对象放于映射的数据结构中,就可以通过该方法来获取该对象放在数据结构的什么地方;

3、  Equals()ReferenceEquals()方法:主要是用来比较两个对象的值是不是相等;

4、  Finalize()方法:用于清理资源的调用;

5、  GetType()方法:这个方法返回从System.Type派生的类的一个实例;

6、  MemberviseClone()方法:复制对象,返回对象副本的一个引用;

继承(该部分内容都要写一个示例)

         什么是实现继承?什么是接口继承?

实现继承是指在编码过程中,根据代码重用原则,允许利用现有类去创建一个新类,并且使其新类具有现有类的所有公共属性和方法,这样无需重新从头开始创建类,只需要添加该类所具有新添方法就可以,这样大大提高了代码的重用率,那么现有类就被称为父类,生成的新类就被称为派生类或子类,子类可以说是基类的具体化;进而这样构造新类的一个过程就称为实现继承,当基类是抽象类时,必须实现该抽象类中的抽象方法,继承用“:”来实现;

举例为:

运行结果为:

接口继承是指只继承了函数的签名,没有继承函数的实现代码,用“:”来实现接口继承;

接口应该必须考虑以下几点:

1、  接口主体只限于对方法、索引器以及属性的声明;

2、  接口中不能包括字段、构造函数以及常量;

3、  接口成员是隐式公开的,如果对其显示指定访问级别,就会出现编译器错误;

4、  接口中不能实现任何方法、属性或索引器;

5、  在指定方法时,只需给出返回类型、名称和参数列表,然后以分号结束;

代码为:

运行结果为:

         讲述C#中的多重继承。

C#中不支持多重继承,但是它支持多接口继承;而且如果一个类继承于类和接口的时候

举例为:

代码编写为:

运行结果:

         什么是虚方法?

C#中,virtual关键字,用于将方法定义为支持多态,该关键字用于对一个类中可修改的方法的声明,这种方法称为虚方法,并且子类在重写父类方法时,要使用override关键字来修饰;

举例代码如下:

运行结果为:

         什么是隐藏方法?

如果签名相同的方法在基类和派生类中都进行了声明,但是该方法没有声明为virtualoverride类型,那么派生类中的该方法就会隐藏基类的方法,使用该隐藏方法可以避免调用时的潜在错误,而且便于程序扩展;使用new关键字来定义。

代码示例:

运行结果为:

         如何调用函数的基类版本?

C#中调用父类的基类版本时,采用base.<基类的方法>;

示例:

代码运行结果如下:

         什么是抽象类和抽象函数?

不能被实例化的类称为抽象类;抽象类是派生类的基础,通过不实现或部分实现,这些抽象类是用于创建程序的蓝本或者模板。

只有方法的声明而没有方法实现的方法称为抽象函数;抽象方法只在派生类中真正的实现,不涉及函数体。

抽象类不能被实例化,抽象方法没有方法的实现,含有抽象方法的类必为抽象类,而且该抽象方法必须在非派生类中实现。

代码示例:

运行结果:

         什么是密封类和密封方法?

密封类是指该类被声明为sealed类型;表示该类不能被继承;

密封方法是指该方法被声明为sealed类型;该方法不能被重写;

Sealed关键字和Java中的final关键字的作用是一样的;

代码示例(这里是用来示例类的密封,用反例演示):

以上代码运行结果:

示例二:(这里是对密封方法的演示)

代码如下:

运行结果为:

注:这样SonClass类中的派生类再次重写了,否则就只能将该方法声明为virtual类型的。

         讲述派生类的构造函数,提示:在层次结构中添加无参数的构造函数、在层次结构中添加有参数的构造函数、在层次结构中构造函数的执行顺序、basethis的作用等。

1、  在层次结构中添加无参数的构造函数:此种情况下,添加无参数的构造函数时,使用base关键字,并且在base关键字后面的括号里没有参数,没有给基类的构造方法传递参数,这时正好编译器会调用System.Object的默认的无参的构造方法,编译层次是至上而下的;

代码如下:

运行结果如下:

注:程序在执行时,先创建了一个子类的对象,根据编译的层级是从上往下执行,因为都是无参数的构造方法,所以派生类的构造方法去调用父类的,然后父类的再去调用子类的,最后去调用Object,恰恰执行的时候是相反的,故打印结果如上,;但是如果将父类的构造方法改为private类型的话,base就会出错;在子类与父类之间,私有的成员和方法以及构造方法都是不能被继承的;

2、  在层次结构中添加有参数的构造方法:

代码如下:

代码运行结果如下:

3、 在层次结构中构造函数的执行顺序:

在层次结构中构造函数是从派生类开始逐级向上调用,一直调用到Object类的构造方法,但是执行过程恰恰与调用过程相反,执行时,是从上往下逐级执行;

4、  basethis的作用:

base是用于在派生类中去执行父类的构造方法,语法结构为:

public SonClass(参数列表):base(参数列表)

{

//函数体

}

除此之外,base关键字还用于在子类中,去调用父类的普通方法,语法结构为:

     base.CommonMethodName(参数列表);

this关键字用于在同一个类中,调用构造方法,其语法结构为:

     this(参数列表);

除此之外,this关键字代指当前对象,可以执行该类中的非静态成员变量的访问,其语法结构为:

     this.<当前对象的变量名>;

         讲述可见性修饰符(publicprotectedinternalprivateprotected internal)

Public:所有的代码都可以访问;

Protected:只有派生类才可以访问;

Internal:当前程序集可以访问;

Private:只有该类可以访问;

Protected internal:只有包含该程序集和派生类可以访问;

         关于接口(什么时候使用接口、如何定义接口、如何实现接口)。

C#中的接口其实是定义了一种约定,实现接口的类都应该遵守该契约,一个接口就相当于一个抽象类,它不包含任何实现方法,一个类对接口的实现跟派生类实现基类方法的重写是一样的,只是接口的每种方法都必须在派生类中实现,接口的作用是指明实现此特定的类必须实现该接口所列出的所有的成员,有时候称接口为“类的模具”;

1、  在设计程序过程中,对象的实现和对象的行为相分离,只需考虑实现的功能,而暂时无需考虑具体实现时,使用接口,而且便于扩展;行为模型是通过接口来实现的;

2、  定义接口:

public interface InterfaceName

{

<returnValueType> methodName(参数列表);

}

3、  实现接口的方式为:

public class SomeClass : InterfaceName

{

<returnValueType> methodName(参数列表)

{

//方法实现的代码

}

}

运算符和类型强制转换

         用例子说明is运算符是怎么使用的?

Is运算符是用来检查对象是否与特定的对象兼容,也就是对象是否是该类型或是否派生于该类型。

示例:

        

运行结果:

注:a is b ab同为值类型,或者a能被拆箱到b,那么结果也为真;

         用例子说明as运算符怎么使用的?

As是用来引用类型的显示类型的转化,否则as运算符就会返回null.

示例:

        

         运行结果为:

         用例子说明typeof运算符怎么使用的?

Typeof返回一个特定类型的System.Type对象;

示例:

代码运行结果为:

         可空类型怎么使用?可空类型与比较运算符一起使用时注意什么?

可空类型可以表示基础类型的所有的值,另外还可以表示空值,可以通过以下方法来加以声明:<基本的数据类型>? <变量名称> = 值或null;

示例:

Int a = null ;             //a的值为null

Int ?   sum = a + 100; //sum的值为null

在可空类型与比较运算符一起使用时,在比较时,只要有一个操作数是空的,那么比较所得的结果就是false

         什么是隐式转换?请举例。

隐式类型转换又叫自动类型转换,是指从字节数少的向字节数多的类型进行自动转换,这种情况不会发生数据部分丢失的现象;

示例:

运行结果为:

         什么是显示转换?请举例。

显示类型转换又叫强制类型转化,是指从字节数多的向字节数少的类型进行强制转化,这种情况下往往使数据发生部分丢失;

示例:

运行结果为:

         请举一个拆箱与装箱的例子。

拆箱是指引用数据类型转化为值类型的过程;

运行结果为:

装箱是指值类型转化为引用数据类型的过程;

示例:

运行结果为:

         对象的相等比较是如何实现的?(object.ReferenceEquals()

1、  ReferenceEquals(obj1obj2)是静态方法,是用来测试两个引用是否是指向了同一个实例;

示例:

运行结果:

2、  Equals()方法(包括了虚拟的和静态的):看是不是引用都指向了相同的实例;

代码运行结果为:

3、  ==:看是否是同一个对象

示例:

运行结果:

         讲述一下C#语言中的多态性。(可以写几个例子或画图说明)

C#语言中的多态性体现在方法的重写和方法的重载

示例:

运行结果为:

示例二:

代码运行结果如下:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值