c#的一些问题和我的参考答案

简答题目
1.  面向对象的思想主要包括什么?继承 多态 封装
封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部。
继承:子类拥有父类的所有数据和操作。
 多态:一个程序中同名的不同方法共存的情况。
  有两种形式的多态– 重载与重写。
2.  什么是装箱和拆箱?举例说明
装箱(boxing)和拆箱(unboxing)机制使得在C#类型系统中,任何值类型、引用类型和object(对象)类型之间进行转换,这种转换称为绑定连接。简单地说,有了装箱和拆箱的概念,对任何类型的值来说最终都可看作是object类型。   1、装箱转换
含义:将一个值类型隐式地转换成一个object类型,或把这个值类型转换成一个被该值类型应用的接口类型,把一个值类型的值装箱,就是创建一个object实例并将值复制给这个object
如:  int I=10;   object obj=I;   也可用显式的方法进行装箱操作: object obj=(object)I;
  2、拆箱转换
  和装箱相反,拆箱转换是指将一个对象类型显式地转换成一个值类型,或将一个接口类型显式地转换成一个执行该接口的值类型。
  过程分两步:
首先,检查这个对象实例,看它是否为给定的值类型的装箱值
然后,把这个实例的值拷贝给值类型的变量。如:
    int I=10;
   object obj=I;
Int j=(int)obj;
3. 什么是重载?override与重载的区别?
重载是指针对所继承下来到方法,重新设计其处理方式,为将来原本处理方式覆盖过去。
在派生类要覆盖的方法前加override修饰,而基类的同名方法前加virtual修饰。这样就能实现多态。多态指一个程序中同名的不同方法共存的情况。  有两种形式的多态– 重载与重写。
4. 值类型和引用类型的区别?写出C#的样例代码。
值类型的变量本身包含他们的数据,而引用类型的变量包含的是指向包含数据的内存块的引用或叫句柄。
值类型变量存储在堆栈。每个程序在执行时都有自己的堆栈,其他程序不能访问。
引用类型存储在堆。引用类型存贮实际数据的引用值的地址。
C#中的引用类型有4种(类、代表、数组、接口)
5. 如何理解委托?
代理是C#中的一种新的类型,要把方法作为参数传递给其他方法时,需要用到代理。
方法通过参数获得外界传递给他的数据,并对这些数据进行一定的操作。
C#通过代理机制来实现,通过参数把一个方法传递给另外一个方法。
代理四步曲:
a.生成自定义代理类:delegate int MyDelegate();
b.用New运算符实例化代理类:
        MyDelegate d = new MyDelegate(MyClass.MyMethod);
c.最后通过实例对象调用方法:int ret = d();
d. 在程序中像调用方法一样应用代理的实例对象调用它指向的方法。      delegate int d(int I);
6. C#中的接口和类有什么异同。
什么是类?类可以这么理解.类就是功能的集合.类也可以看做是实现一种功能的集合或者方法..接口的概念:什么是接口?接口可以理解为,对类的规定,对类的约束,甚至对整个项目的约束. 种模版,定义了对象必须实现的方法,其目的就是让这些方法可以作为接口实例被引用。接口不能被实例化。接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。但接口是一个行为的规范,里面的所有东西都是抽象的!一个类只可以继承一个基类也就是父类,但可以实现多个接口
7. net中读写数据库需要用到哪些类?
Connection DataAdapter DataSet Command DataReader
8. 如何理解.net中的垃圾回收机制。
如果发现内存不够,则垃圾回收器,将全部对象作为无效对象(被回收对象),然后先将全局变量,static,处于活动中的局部变量,以及当前CG指针指向的对象放入一个表中.然后
会搜索新列表中的对象所引用的对象.加入列表中,其他没有被加入列表的对象都会被回收.
非托管对象要记得释放资源就行了吧.
9. .net的错误处理机制是什么
错误的处理顺序:finally先,catch次之,最后退会try代码..取消此次操作.返回catch中的异常信息.当然,你也可以定制自己的错误处理机制...如果你的异常处理中包含finally块.则此finally无论是否发生异常始终会被执行...
10. c#中using和new这两个关键字有什么意义?
using 的用途是为某个namespace建立别名,或者引用存在系统中的其它namespace.
New 用来创建实例,或者覆写方法。
11. 谈谈类和结构的区别?
1. 值类型与引用类型
? 结构是值类型:值类型在堆栈上分配地址
? 类是引用类型:引用类型在堆上分配地址
2.继承性
? 结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然没有明确sealed声明,可结构是隐式的sealed .
? 类:完全可扩展的,除非显式声明sealed, 否则类可以继承其他类和接口,自身也能被继承 。
注:虽然结构不能被继承 ,可结构能够继承接口,方法和类继承接口一样 。
3.内部结构的区别:
结构:
? 没有默认的构造函数,可以添加构造函数
? 没有析构函数
? 没有 abstract 和 sealed(因为不能继承)
? 不能有protected 修饰符
? 可以不用new 初始化
? 在结构中初始化实例字段是错误的
类:
? 有默认的构造函数
? 有析构函数
? 可以使用 abstract 和 sealed
? 有protected 修饰符
? 必须使用new 初始化
12. 什么是CLR?
公共语言运行时(Common Language Runtime,CLR),提供了一个可靠而完善的多语言运行环境。CLR是一个软件引擎,用于加载应用程序、检查错误、进行安全许可认证、执行和清空内存。它属于纯动态运行时的一种,它的主要组成部分是虚拟执行引擎VEE(Virtual Execution Enging),它可以打破语言和平台的限制。
13. C#的优点是什么?至少列出4点
1. C#中指针已经消失. 允许对原始指针的有限制的使用.
2. 基于.NET平台的,继承了自动内存管理和垃圾回收的特点.
3. C#拥有内建的支持来将任何组件转换成一个web service,运行在任何平台上的任何应用程序都可以通过互联网来使用这个服务.
4. 面向对象的
14. 面向对象编程的三大原则是什么?分别加以说明
? 继承:都支持类的单一继承,但类可以实现多个接口。所有类都从一个公共的基类继承。
? 封装与可见性:都可决定类成员是否可见。除了C#的internal访问修饰符外,两者可见性机制非常相似
? 多态性:Java和C#都支持某些形式的多态性机制,且两者实现方法非常类似。
15. C#有哪5种类型的可访问性?
? public:成员可以从任何代码访问。
? protected:成员只能从派生类访问。
? internal:成员只能从同一程序集的内部访问。
? protected internal:成员只能从同一程序集内的派生类访问。
? private:成员只能在当前类的内部访问。
16. C#代码在执行前要编译为中间语言 ,中间语言的主要特征有?
● 面向对象和使用接口
● 值类型和引用类型之间的巨大差别
● 强数据类型
● 使用异常来处理错误
● 使用属性(attribute)
17. C#中引用类型有哪几种?
(类、代表、数组、接口)
18. 对象间可能存在的三种关系?
聚合,一个(较复杂的)对象由其他若干(较简单的)对象作为其构成部分,称作聚合。
关联,对象之间的静态联系(即通过对象属性体现的联系)称作关联。
继承

编程题目
1.一个长度为10000的字符串,通过随机从a-z中抽取10000个字符组成。请用c#语言编写主要程序来实现。
2.写一个实现对一段字符串翻转的方法 。
class StringReversal
    {
        public String StrReversal(String oldString)
        {
            //Convert string to char arry
            Char[] oldCharArray = oldString.ToCharArray();
            //Reversal from zero
            int index = 0;
            int cLength = oldCharArray.Length - 1;
            while(index<cLength)
            {
                //use char CTemp  to  swap
                char cTemp = oldCharArray[index];
                oldCharArray[index] = oldCharArray[cLength];
                oldCharArray[cLength] = cTemp;
                index ++;
                cLength --;
            }
            //Convert char array to string only have the constructor method
            string newString = new string(oldCharArray);
            return newString;
        }
    }
3.实现一个冒泡排序算法?
public void BubbleSort(int[] R)
  {
   int i,j,temp; //交换标志
   bool exchange;
   for(i=0; i<R.Length; i++) //最多做R.Length-1趟排序
   {
   exchange=false; //本趟排序开始前,交换标志应为假
   for(j=R.Length-2; j>=i; j--)
   {
   if(R[j+1]<R[j]) //交换条件
   {
    temp=R[j+1];
    R[j+1]=R[j];
    R[j]=temp;
    exchange=true; //发生了交换,故将交换标志置为真
   }
   }
   if(!exchange) //本趟排序未发生交换,提前终止算法
   {
   break;
   }
   }
  }
4. 用拷贝的方法来创建数组
using System;
class Test
{  public static void Main(String []args)
 { int [] Array1=new int [5]{4,3,2,1,0};
    int [] Array2=(int[])Array1.Clone();
          //创建新数组但内容为Array1
     for(int i=0; i<Array2.Length;i++)
    {  //获得Array2[i]数组中的某个元素的值并显示出其值 
          Console.WriteLine("Array2[{0}]:{1}",i,Array2[i]);
       }//显示的结果为 4、3、2、1、0
 }
}
5.找最大数游戏:有一批数,请你快速地找出最大数及其位置。
6. 九九乘法表
static void Main(string[] args)
 {      for(int i=1; i<10; i++)
        {       for(int j=1; j<= i; j++)
          { int s = i * j;
 Console.Write(j.ToString() + "×" + i.ToString() + "=" + s.ToString() + " ");
          }
       Console.WriteLine("");
   }  
  Console.ReadLine();
  }
7. 最大公约数
max_gongyue(int m,int n)
{
int i=min(m,n)-1;
for(;i>1;i--)
if((!(m%i))&&(!(n%i)))
break;
return i;
}
8. 求数的阶乘
static void Main(string[] args)
  {  while(true)
       {Console.Write("请输入一个正整数(输入0退出):");
    int x = int.Parse(Console.ReadLine());
    if (x == 0)
    {break;}
    int y = x;
    checked
    {   for(int i=x-1; i>0; i--)
     {y = y * i; }
    }
    Console.WriteLine("{0}的阶乘是:{1}", x, y);
   }
   Console.WriteLine("按回车键退出...");
   Console.ReadLine();
  }
9. 折半查找并显示进度
    int BinarySearch(Type a[],const Type& x,int n)
    {
       int left=0;
      int right=n-1;
       while(left<=right){
       int middle=(left+right)/2;
       if (x==a[middle]) return middle;
          if (x>a[middle]) left=middle+1;
           else right=middle-1;
      }
       return -1;
    }
   
10. 四则运算题目
 static void Main(string[] args)
  {
   Console.WriteLine("输入运算式");
   for(int i=0;i<args.Length;i++)
   {
    Console.WriteLine("输入的参数{0}:{1}",i,args[i]);
   }
   double a,b;
   double y=0;
   a=double.Parse(args[0]);
   b=double.Parse(args[2]);
   switch(args[1])
   {
    case"+":
    {
     y=a+b;
     break;
    }
    case"-":
    {
     y=a-b;
     break;
    }
    case"*":
    {
     y=a*b;
     break;
    }
    case"/":
    {
     if(b==0)
     {
      Console.WriteLine("除数不能为0");break;
     }
     else{y=a/b;break;}
    }
     
   }
   
   Console.WriteLine("结果为:{0}",y);
11.判断彩票是否中奖
输入一组数字(7位),判断这组数字中几等奖,判断规则如下
一等奖:中7个数;二等奖:中6个数
三等奖:中5个数;四等奖:中4个数;五等奖:中3个数
其它的没有中奖
最终打印出中几等奖,如中一等奖打印“一等奖”,没有中奖打印“没有中奖”
注:中奖号码为已知,可以自定义一组整型数组,如:
int [] luck = new int[7];
luck[0] = 0;luck[1] = 1;luck[2] = 2;luck[3] = 3;luck[4] = 4;luck[5] = 5;luck[6] = 6;

 

简答题目
1.  面向对象的思想主要包括什么?继承 多态 封装
封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部。
继承:子类拥有父类的所有数据和操作。
 多态:一个程序中同名的不同方法共存的情况。
  有两种形式的多态– 重载与重写。
2.  什么是装箱和拆箱?举例说明
装箱(boxing)和拆箱(unboxing)机制使得在C#类型系统中,任何值类型、引用类型和object(对象)类型之间进行转换,这种转换称为绑定连接。简单地说,有了装箱和拆箱的概念,对任何类型的值来说最终都可看作是object类型。   1、装箱转换
含义:将一个值类型隐式地转换成一个object类型,或把这个值类型转换成一个被该值类型应用的接口类型,把一个值类型的值装箱,就是创建一个object实例并将值复制给这个object
如:  int I=10;   object obj=I;   也可用显式的方法进行装箱操作: object obj=(object)I;
  2、拆箱转换
  和装箱相反,拆箱转换是指将一个对象类型显式地转换成一个值类型,或将一个接口类型显式地转换成一个执行该接口的值类型。
  过程分两步:
首先,检查这个对象实例,看它是否为给定的值类型的装箱值
然后,把这个实例的值拷贝给值类型的变量。如:
    int I=10;
   object obj=I;
Int j=(int)obj;
3. 什么是重载?override与重载的区别?
重载是指针对所继承下来到方法,重新设计其处理方式,为将来原本处理方式覆盖过去。
在派生类要覆盖的方法前加override修饰,而基类的同名方法前加virtual修饰。这样就能实现多态。多态指一个程序中同名的不同方法共存的情况。  有两种形式的多态– 重载与重写。
4. 值类型和引用类型的区别?写出C#的样例代码。
值类型的变量本身包含他们的数据,而引用类型的变量包含的是指向包含数据的内存块的引用或叫句柄。
值类型变量存储在堆栈。每个程序在执行时都有自己的堆栈,其他程序不能访问。
引用类型存储在堆。引用类型存贮实际数据的引用值的地址。
C#中的引用类型有4种(类、代表、数组、接口)
5. 如何理解委托?
代理是C#中的一种新的类型,要把方法作为参数传递给其他方法时,需要用到代理。
方法通过参数获得外界传递给他的数据,并对这些数据进行一定的操作。
C#通过代理机制来实现,通过参数把一个方法传递给另外一个方法。
代理四步曲:
a.生成自定义代理类:delegate int MyDelegate();
b.用New运算符实例化代理类:
        MyDelegate d = new MyDelegate(MyClass.MyMethod);
c.最后通过实例对象调用方法:int ret = d();
d. 在程序中像调用方法一样应用代理的实例对象调用它指向的方法。      delegate int d(int I);
6. C#中的接口和类有什么异同。
什么是类?类可以这么理解.类就是功能的集合.类也可以看做是实现一种功能的集合或者方法..接口的概念:什么是接口?接口可以理解为,对类的规定,对类的约束,甚至对整个项目的约束. 种模版,定义了对象必须实现的方法,其目的就是让这些方法可以作为接口实例被引用。接口不能被实例化。接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。但接口是一个行为的规范,里面的所有东西都是抽象的!一个类只可以继承一个基类也就是父类,但可以实现多个接口
7. net中读写数据库需要用到哪些类?
Connection DataAdapter DataSet Command DataReader
8. 如何理解.net中的垃圾回收机制。
如果发现内存不够,则垃圾回收器,将全部对象作为无效对象(被回收对象),然后先将全局变量,static,处于活动中的局部变量,以及当前CG指针指向的对象放入一个表中.然后
会搜索新列表中的对象所引用的对象.加入列表中,其他没有被加入列表的对象都会被回收.
非托管对象要记得释放资源就行了吧.
9. .net的错误处理机制是什么
错误的处理顺序:finally先,catch次之,最后退会try代码..取消此次操作.返回catch中的异常信息.当然,你也可以定制自己的错误处理机制...如果你的异常处理中包含finally块.则此finally无论是否发生异常始终会被执行...
10. c#中using和new这两个关键字有什么意义?
using 的用途是为某个namespace建立别名,或者引用存在系统中的其它namespace.
New 用来创建实例,或者覆写方法。
11. 谈谈类和结构的区别?
1. 值类型与引用类型
? 结构是值类型:值类型在堆栈上分配地址
? 类是引用类型:引用类型在堆上分配地址
2.继承性
? 结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然没有明确sealed声明,可结构是隐式的sealed .
? 类:完全可扩展的,除非显式声明sealed, 否则类可以继承其他类和接口,自身也能被继承 。
注:虽然结构不能被继承 ,可结构能够继承接口,方法和类继承接口一样 。
3.内部结构的区别:
结构:
? 没有默认的构造函数,可以添加构造函数
? 没有析构函数
? 没有 abstract 和 sealed(因为不能继承)
? 不能有protected 修饰符
? 可以不用new 初始化
? 在结构中初始化实例字段是错误的
类:
? 有默认的构造函数
? 有析构函数
? 可以使用 abstract 和 sealed
? 有protected 修饰符
? 必须使用new 初始化
12. 什么是CLR?
公共语言运行时(Common Language Runtime,CLR),提供了一个可靠而完善的多语言运行环境。CLR是一个软件引擎,用于加载应用程序、检查错误、进行安全许可认证、执行和清空内存。它属于纯动态运行时的一种,它的主要组成部分是虚拟执行引擎VEE(Virtual Execution Enging),它可以打破语言和平台的限制。
13. C#的优点是什么?至少列出4点
1. C#中指针已经消失. 允许对原始指针的有限制的使用.
2. 基于.NET平台的,继承了自动内存管理和垃圾回收的特点.
3. C#拥有内建的支持来将任何组件转换成一个web service,运行在任何平台上的任何应用程序都可以通过互联网来使用这个服务.
4. 面向对象的
14. 面向对象编程的三大原则是什么?分别加以说明
? 继承:都支持类的单一继承,但类可以实现多个接口。所有类都从一个公共的基类继承。
? 封装与可见性:都可决定类成员是否可见。除了C#的internal访问修饰符外,两者可见性机制非常相似
? 多态性:Java和C#都支持某些形式的多态性机制,且两者实现方法非常类似。
15. C#有哪5种类型的可访问性?
? public:成员可以从任何代码访问。
? protected:成员只能从派生类访问。
? internal:成员只能从同一程序集的内部访问。
? protected internal:成员只能从同一程序集内的派生类访问。
? private:成员只能在当前类的内部访问。
16. C#代码在执行前要编译为中间语言 ,中间语言的主要特征有?
● 面向对象和使用接口
● 值类型和引用类型之间的巨大差别
● 强数据类型
● 使用异常来处理错误
● 使用属性(attribute)
17. C#中引用类型有哪几种?
(类、代表、数组、接口)
18. 对象间可能存在的三种关系?
聚合,一个(较复杂的)对象由其他若干(较简单的)对象作为其构成部分,称作聚合。
关联,对象之间的静态联系(即通过对象属性体现的联系)称作关联。
继承

编程题目
1.一个长度为10000的字符串,通过随机从a-z中抽取10000个字符组成。请用c#语言编写主要程序来实现。
2.写一个实现对一段字符串翻转的方法 。
class StringReversal
    {
        public String StrReversal(String oldString)
        {
            //Convert string to char arry
            Char[] oldCharArray = oldString.ToCharArray();
            //Reversal from zero
            int index = 0;
            int cLength = oldCharArray.Length - 1;
            while(index<cLength)
            {
                //use char CTemp  to  swap
                char cTemp = oldCharArray[index];
                oldCharArray[index] = oldCharArray[cLength];
                oldCharArray[cLength] = cTemp;
                index ++;
                cLength --;
            }
            //Convert char array to string only have the constructor method
            string newString = new string(oldCharArray);
            return newString;
        }
    }
3.实现一个冒泡排序算法?
public void BubbleSort(int[] R)
  {
   int i,j,temp; //交换标志
   bool exchange;
   for(i=0; i<R.Length; i++) //最多做R.Length-1趟排序
   {
   exchange=false; //本趟排序开始前,交换标志应为假
   for(j=R.Length-2; j>=i; j--)
   {
   if(R[j+1]<R[j]) //交换条件
   {
    temp=R[j+1];
    R[j+1]=R[j];
    R[j]=temp;
    exchange=true; //发生了交换,故将交换标志置为真
   }
   }
   if(!exchange) //本趟排序未发生交换,提前终止算法
   {
   break;
   }
   }
  }
4. 用拷贝的方法来创建数组
using System;
class Test
{  public static void Main(String []args)
 { int [] Array1=new int [5]{4,3,2,1,0};
    int [] Array2=(int[])Array1.Clone();
          //创建新数组但内容为Array1
     for(int i=0; i<Array2.Length;i++)
    {  //获得Array2[i]数组中的某个元素的值并显示出其值 
          Console.WriteLine("Array2[{0}]:{1}",i,Array2[i]);
       }//显示的结果为 4、3、2、1、0
 }
}
5.找最大数游戏:有一批数,请你快速地找出最大数及其位置。
6. 九九乘法表
static void Main(string[] args)
 {      for(int i=1; i<10; i++)
        {       for(int j=1; j<= i; j++)
          { int s = i * j;
 Console.Write(j.ToString() + "×" + i.ToString() + "=" + s.ToString() + " ");
          }
       Console.WriteLine("");
   }  
  Console.ReadLine();
  }
7. 最大公约数
max_gongyue(int m,int n)
{
int i=min(m,n)-1;
for(;i>1;i--)
if((!(m%i))&&(!(n%i)))
break;
return i;
}
8. 求数的阶乘
static void Main(string[] args)
  {  while(true)
       {Console.Write("请输入一个正整数(输入0退出):");
    int x = int.Parse(Console.ReadLine());
    if (x == 0)
    {break;}
    int y = x;
    checked
    {   for(int i=x-1; i>0; i--)
     {y = y * i; }
    }
    Console.WriteLine("{0}的阶乘是:{1}", x, y);
   }
   Console.WriteLine("按回车键退出...");
   Console.ReadLine();
  }
9. 折半查找并显示进度
    int BinarySearch(Type a[],const Type& x,int n)
    {
       int left=0;
      int right=n-1;
       while(left<=right){
       int middle=(left+right)/2;
       if (x==a[middle]) return middle;
          if (x>a[middle]) left=middle+1;
           else right=middle-1;
      }
       return -1;
    }
   
10. 四则运算题目
 static void Main(string[] args)
  {
   Console.WriteLine("输入运算式");
   for(int i=0;i<args.Length;i++)
   {
    Console.WriteLine("输入的参数{0}:{1}",i,args[i]);
   }
   double a,b;
   double y=0;
   a=double.Parse(args[0]);
   b=double.Parse(args[2]);
   switch(args[1])
   {
    case"+":
    {
     y=a+b;
     break;
    }
    case"-":
    {
     y=a-b;
     break;
    }
    case"*":
    {
     y=a*b;
     break;
    }
    case"/":
    {
     if(b==0)
     {
      Console.WriteLine("除数不能为0");break;
     }
     else{y=a/b;break;}
    }
     
   }
   
   Console.WriteLine("结果为:{0}",y);
11.判断彩票是否中奖
输入一组数字(7位),判断这组数字中几等奖,判断规则如下
一等奖:中7个数;二等奖:中6个数
三等奖:中5个数;四等奖:中4个数;五等奖:中3个数
其它的没有中奖
最终打印出中几等奖,如中一等奖打印“一等奖”,没有中奖打印“没有中奖”
注:中奖号码为已知,可以自定义一组整型数组,如:
int [] luck = new int[7];
luck[0] = 0;luck[1] = 1;luck[2] = 2;luck[3] = 3;luck[4] = 4;luck[5] = 5;luck[6] = 6;

如果你的简历上面写“熟悉/了解C#”,那么你就应该能够回答下面的这些基础问题。我将给出自己的简要答案以供参考。欢迎讨论。

 

  1. 传入某个属性的set方法的隐含参数的名称是什么?
    value,它的类型和属性所声名的类型相同。

  2. 如何在C#中实现继承?
    在类名后加上一个冒号,再加上基类的名称。

  3. C#支持多重继承么?
    类之间不支持,接口之间支持。类对接口叫做实现,不叫继承。

  4. 被protected修饰的属性/方法在何处可以访问?
    在继承或间接继承与这个类的子类中可以访问。

  5. 私有成员会被继承么?
    会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了。

  6. 请描述一下修饰符protected internal
    在同一个Assembly中,他的访问级别和public一样,而跨Assembly访问时,他的访问级别同protected一样。即protected的范围 + internal的范围。 

  7. C#提供一个默认的无参数构造函数,当我实现了另外一个有一个参数的构造函数时候,还想保留这个无参数的构造函数。这样我应该写几个构造函数?
    两个,一旦你实现了一个构造函数,C#就不会再提供默认的构造函数了,所以需要手动实现那个无参数构造函数。

  8. C#中所有对象共同的基类是什么?
    System.Object.

  9. 重载和覆写有什么区别?
    重载提供了对一个方法签名的不同参数调用的实现。覆写提供了子类中改变父类方法行为的实现。

  10. 在方法定义中,virtual有什么含意?
    被virtual修饰的方法可以被子类覆写。

  11. 能够将非静态的方法覆写成静态方法么?
    不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将virtual改为override。

  12. 可以覆写私有的虚方法么?
    不可以,甚至子类中无法访问父类中的私有方法。

  13. 能够阻止某一个类被其他类继承么?
    可以,使用关键字sealed。

  14. 能够实现允许某个类被继承,但不允许其中的某个方法被覆写么?
    可以,标记这个类为public,并标记这个方法为sealed。

  15. 什么是抽象类(abstract class)?
    一种不可以被实例化的类。抽象类中一般含有抽象方法,当然也可有具体实现。继承类只有实现过所有抽象类的抽象方法后才能被实例化。

  16. 何时必须声明一个类为抽象类?
    当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。

  17. 接口(interface)是什么?
    只含有共有抽象方法(public abstract method)的类。这些方法必须在子类中被实现。

  18. 为什么不能指定接口中方法的修饰符?
    接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。他们默认为公有方法。

  19. 可以继承多个接口么?
    当然。

  20. 那么如果这些接口中有重复的方法名称呢?
    这种情况中你可以决定如何实现。当然需要特别得小心。但是在编译环节是没有问题的。

  21. 接口和抽象类的区别是什么?
    接口中所有方法必须是抽象的,并且不能指定方法的访问修饰符。抽象类中可以有方法的实现,也可以指定方法的访问修饰符。

  22. 如何区别重载方法?
    不同的参数类型,不同的参数个数,不同的参数顺序。

  23. const和readonly有什么区别?
    const可以用于局部常量,而readonly,实际是类的initonly字段,显然不能是局部的。

  24. System.String 和System.StringBuilder有什么区别?
    System.String是不可变的字符串。System.StringBuilder存放了一个可变的字符串,并提供一些对这个字符串修改的方法。
 

你可能感兴趣的:(c#的一些问题和我的参考答案)