首页
学习
活动
专区
圈层
工具
发布
清单首页.net文章详情

金三银四面试:C#.NET面试题中高级篇3

目录

1. IList 接口与List的区别是什么?

2.泛型的主要约束和次要约束是什么?

3. 如何把一个array复制到arraylist里?

4.数组和 list 和 arraylist 的区别?

5. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

6.有50万个int类型的数字,现在需要判断一下里面是否存在重复的数字,请你简要说一下思路。

7.数组有没有length()这个方法? String有没有length()这个方法?

8.一个整数List中取出最大数(找最大值)。不能用Max方法。

9. C#异常类返回哪些信息?

10. 如何创建一个自定义异常?

  1. IList 接口与List的区别是什么?

IList 泛型接口是 Icollection 接口的子代,并且是所有非泛型列表的基接口。Ilist 实现有三种类别:只读、固定大小、可变大小。无法修改只读 Ilist。固定大小的 Ilist 不允许添加或移除元素,但允许修改现有元素。可变大小的 Ilist 允许添加、移除和修改元素。

IList 是个接口,定义了一些操作方法这些方法要你自己去实现,当你只想使用接口的方法时,这种方式比较好.他不获取实现这个接口的类的其他方法和字段,有效的节省空间.

List 是个类型 已经实现了IList 定义的那些方法。

代码语言:javascript
复制
List List11 =new List ();

是想创建一个List,而且需要使用到List的功能,进行相关操作。 而

代码语言:javascript
复制
IList IList11 =new List ();

只是想创建一个基于接口IList的对象的实例,只是这个接口是由List实现的。所以它只是希望使用到IList接口规定的功能而已。

2.泛型的主要约束和次要约束是什么?

当一个泛型参数没有任何约束时,它可以进行的操作和运算是非常有限的,因为不能对实参进行任何类型上的保证,这时候就需要用到泛型约束。泛型的约束分为:主要约束和次要约束,它们都使实参必须满足一定的规范,C#编译器在编译的过程中可以根据约束来检查所有泛型类型的实参并确保其满足约束条件。 (1)主要约束

一个泛型参数至多拥有一个主要约束,主要约束可以是一个引用类型、class或者struct。如果指定一个引用类型(class),那么实参必须是该类型或者该类型的派生类型。相反,struct则规定了实参必须是一个值类型。下面的代码展示了泛型参数主要约束:

代码语言:javascript
复制
public class ClassT1<T> where T : Exception
{
    private T myException;
    public ClassT1(T t)
{
        myException = t;
    }
    public override string ToString()
{
        // 主要约束保证了myException拥有source成员
        return myException.Source;
    }
}

public class ClassT2<T> where T : class
{
    private T myT;
    public void Clear()
{
        // T是引用类型,可以置null
        myT = null;
    }
}

public class ClassT3<T> where T : struct
{
    private T myT;
    public override string ToString()
{
        // T是值类型,不会发生NullReferenceException异常
        return myT.ToString();
    }

(2)次要约束 次要约束主要是指实参实现的接口的限定。对于一个泛型,可以有0到无限的次要约束,次要约束规定了实参必须实现所有的次要约束中规定的接口。次要约束与主要约束的语法基本一致,区别仅在于提供的不是一个引用类型而是一个或多个接口。例如我们为上面代码中的ClassT3增加一个次要约束:

代码语言:javascript
复制
public class ClassT3<T> where T : struct, IComparable
{
    ......      
}

3. 如何把一个array复制到arraylist里?

代码语言:javascript
复制
foreach( object arr in array)
{
  arrayist.Add(arr);
}

4.数组和 list 和 arraylist 的区别?

数组:是存储同类型数据列表,数组在内存中是连续存储的。优点:存储、修改、读取速度快。缺点:初始化需要指定长度,无法扩展,插入数据麻烦

ArrayList:ArrayList是.Net Framework提供的用于数据存储和检索的专用类,它是命名空间System.Collections下的一部分。它的大小是按照其中存储的数据来动态扩充与收缩的。优点:可扩展,无指定长度,可插入删除

缺点:因存储不同类型,执行装箱拆箱操作,读取、存储速度慢。

List:在数组和ArrayList基础上优化,存储通用类型数据列表。优点:可扩展示,初始化无需指定长度,可插入指定位置数据

5. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。

equals()和==方法决定引用值是否指向同一对像,equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

6.有50万个int类型的数字,现在需要判断一下里面是否存在重复的数字,请你简要说一下思路。

  • .使用C#的List集合自带的去重方法,例如 Distinct(),GroupBy()等
  • .利用 Dictionary 的Key值唯一的特性,HashSet 元素值唯一的特性 进行判断

7.数组有没有length()这个方法? String有没有length()这个方法?

数组没有length()这个方法,有length的属性。String有有length()这个方法。

8.一个整数List中取出最大数(找最大值)。不能用Max方法。

代码语言:javascript
复制
          private static int GetMax(List<int> list)
{
            int max = list[0];
            for (int i = 0; i < list.Count; i++)
            {
                if (list[i]>max)
                {
                    max = list[i];
                }
            }
            return max;
        }

9. C#异常类返回哪些信息?

C#中,所有异常都继承自System.Exception类,Exception类定义了C#异常应该具有的信息和方法。值得注意的属性有:

代码语言:javascript
复制
public virtual string Message { get; }// 错误的信息,文字描述
public virtual string StackTrace { get; }// 发生异常的调用堆栈信息
public System.Reflection.MethodBase TargetSite { get; }//引发这个错误的方法
public Exception InnerException { get; }// 子异常

10. 如何创建一个自定义异常?

根据类继承原则和异常处理原则,我们可以使用以下方式来自定义一个类:

代码语言:javascript
复制
public class CustomException : Exception
{
}

--->详解

下一篇
举报
领券