• .NET基础面试题


    1、是否可以继承String类,为什么?
    (1)不可以,密封类不能被继承(关键字:sealed)

    2、C#中NEW关键字有哪些用法?
    (1)用于创建对象和调用构造函数。
    (2)用于向基类成员隐藏继承成员。
    (3)用于在泛型声明中约束可能用作类型参数的参数的类型。

    3、请列举出C#中的集合类型
    (1)集合类型一
    (2)集合类型二

    4、匿名对象是可变对象还是不可变对象
    (1)不可变对象,匿名类型的实例时不可变的,一旦创建了一个匿名类型的实例,那么该实例的各个属性值就将永远被确定下来了,所有的属性只能get,不能set

    5、嵌套类型可以访问外部包含类型的所有private成员,这句话正确吗?
    (1)正确,嵌套类型可以访问其包含类型可以访问的所有成员。 它可以访问包含类型的私有成员和受保护成员(包括所有继承的受保护成员)。

    6、线程池中的线程是前台线程还是后台线程,前台线程和后台线程的区别是什么?
    答:托管线程池中的线程都是后台线程,使用new Thread方式创建的线程默认都是前台线程。
    应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。
    (1)后台线程不会阻止进程的终止。属于某个进程的所有前台线程都终止后,该进程就会被终止。所有剩余的后台线程都会停止且不会完成。
    (2)以在任何时候将前台线程修改为后台线程,方式是设置Thread.IsBackground 属性。
    (3)不管是前台线程还是后台线程,如果线程内出现了异常,都会导致进程的终止。
    (4)托管线程池中的线程都是后台线程,使用new Thread方式创建的线程默认都是前台线程。

    7、event的本质是特殊类型的 委托__。

    8、C#中对象要实现复制功能,则必须实现 __ ICloneable___ 接口

    9、以下代码片段会导致什么样的错误?

    class JiLei{};
    public class PaiSheng:JiLei{};
    
    • 1
    • 2

    (1)可访问性不一致:基类”JiLei"的可访问性低于“PaiSheng"
    拓展延伸:C#的默认可访问性级别
    1.在namespace中的类、接口默认是internal类型的,也可以显示的定义为public类型,不允许是其他访问类型。
    2.在一个类里面,属性和方法默认是private的,可以显示的定义为public、private、protected、internal或protected internal等访问类型。
    3.接口中不能定义成员变量,接口中的方法默认为public的访问权限,但是不能显示的定义任何访问类型。
    4.抽象类中必须有一个以上的抽象方法,抽象方法可以是public、internal、protected,不能是private的访问类型。

    10、根据线程安全的相关知识,分析代码,当调用Test方法时i>0时是否会引起死锁

            public void Test(int i)
            {
                lock (this)
                {
                    if (i > 0)
                    {
                        Test(--i);
                    }
                }
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    (1)不会

    11、C#代码 int a=1;Console.WriteLine(a is dynamic);输出什么?
    (1)true,dynamic:动态类型

    12、C#代码 int? a=1;Console.WriteLine(a is int);输出什么?
    (1)true

    13、C#代码 int? a=1;Console.WriteLine(a.GetType()==typeof(int?));输出什么?
    (1)false

    拓展延伸:int?、??
    (1)int?:可以为null
    (2)(a??b):如果a为null则等于b

    14、以下语句输出什么?

                var longName = "Franklin.Bai";
                longName.Replace("Bai", "Luo");
                longName.Insert(7, "-");
                Console.WriteLine(longName);
    输出:Franklin.Bai
    
    • 1
    • 2
    • 3
    • 4
    • 5
                var longName = "Franklin.Bai";
                longName=longName.Replace("Bai", "Luo");
                longName=longName.Insert(7, "-");
                Console.WriteLine(longName);
    输出:Frankli-n.Luo
    
    • 1
    • 2
    • 3
    • 4
    • 5

    15、输出什么?

                Action doit = async () =>
                  {
                      Console.WriteLine(1);
                      var task = Task.Run(() =>
                      {
                          Thread.Sleep(3000);
                          Console.WriteLine(2);
                      });
                      Console.WriteLine(4);
                      await task;
                      Console.WriteLine(3);
                  };
                doit();
                Console.ReadLine();
    输出:
    1
    4
    2
    3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    16、输出什么?

    class A
        {
            public A()
            {
                PrintField();
            }
            public virtual void PrintField() { }
        }
        class B : A
        {
            int x = 1; int y;
            public B()
            {
                y = -1;
            }
            public override void PrintField()
            {
                Console.WriteLine("x={0},y={1}", x, y);
            }
        }
        输出:x=1,y=0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    拓展延伸
    c# 的继承,继承类实例化的时候,会先调用基类的构造函数,然后再调用自己的构造函数

    17、输出什么?

        class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public override int GetHashCode()
            {
                return Name.GetHashCode() ^ Age;
            }
            public override bool Equals(object obj)
            {
                Person target = obj as Person;
                if (target == null) return false;
                return target.Name == this.Name && target.Age == this.Age;
            }
        }
        
             static void Main(string[] args)
            {
                //(1)
                Person p1 = new Person { Name = "Franklin", Age = 18 };
                Person p2 = new Person { Name = "Franklin", Age = 18 };
                Console.WriteLine(p1.Equals(p2));
                Console.WriteLine(p1 == p2);
    
                //(2)
                var dict = new Dictionary();
                dict.Add(p1, p1.Name);
                dict.Add(p2, p2.Name);//此处报错
                Console.WriteLine(dict[p2]);
                Console.ReadLine();
            }
        }
    (1)输出:
             true    
             false
    (2)输出:
             报错:已添加具有相同键的项
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    拓展延伸
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    详细内容

    18、方法声明中的params关键字之后不允许任何其他参数,这一说法正确吗?
    (1)正确
    拓展延伸
    一、params 是C#开发语言中关键字, params主要的用处是在给函数传参数的时候用,就是当函数的参数不固定的时候。 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。 关于参数数组,需掌握以下几点。
    1、若形参表中含一个参数数组,则该参数数组必须位于形参列表的最后。
    2、不允许将params修饰符与ref和out修饰符组合起来使用。
    3、参数数组必须是一维数组。
    4、与参数数组对应的实参可以是同一类型的数组名,也可以是任意多个与该数组的元素属于同一类型的变量。
    5、若实参是数组则按引用传递,若实参是变量或表达式则按值传递。

    19、以下关于class和interface的描述哪些是正确的(多选)__________???
    a、interface可以被class实现 √
    b、interface可以被struct实现
    c、interface可以被enum实现
    d、interface不可以实现interface
    e、interface不支持泛型
    f、interface可以包含事件、索引器、方法和属性 √
    g、interface不可以包含实现 √

    20、以下关于class于struct的异同表述中哪些是正确的(多选)_________???
    a、class属于引用类型,分配在内存的堆上;struct属于值类型,分配在栈上
    b、struct不支持继承,但class可以
    c、struct不能定义默认构造函数,但class可以
    d、struct不能定义析构函数,但class可以
    e、struct不能使用初始化设置filed的值,但class可以

    21、为什么不提倡catch(Exception)?
    (1)因为catch(Exception)是拿到执行代码中产生的异常,异常你虽然拿到了,但是之前执行的那段代码就没用了,等于没用到、没执行。对于程序员来说,catch(Exception)是有用的,可以方便调试。但是对于实际应用中,要多考虑用户输入的异常情况,使用正常的代码处理这些情况。而不是使用catch(Exception)逃避这些错误。
    (2)try…catch在出现异常的时候影响性能,应该捕获更具体的异常,比如IOExeception,OutofMemoryException等
    为什么不建议用try catch处理异常

    22、序列化是指什么过程?列出几种需要序列化的场景
    (1)序列化是通过将对象转换为字节流,从而存储对象或将对象传输到内存,数据库或文件的过程。主要用途是保存对象的状态,包括对象的数据,以便能够在需要是重建对象
    (2)通过序列化,可以执行如下操作:通过 Web 服务将对象发送到远程应用程序、在域之间传递对象、以 XML 字符串的形式传递对象通过防火墙、跨应用程序维护安全性或用户专属信息
    (3)需要具有对象、包含已序列化对象的一个流,以及一个 Fromatter。
    System.Runtime.Serialization 包含序列化和反序列化对象所必须的类。
    将 SerializableAttribute 特性应用于某个类型,以表示此类型的实例可以被序列化,如果对没有 SerializableAttribute 特性的类型进行序列化,则会引发异常。
    如果想让类中的某个字段不可序列化,可以使用 NonSerializedAttribute 特性。
    (4)序列化的三种类型–二进制、XML、JSON
    可以使用二进制 binary 或 XML 进行序列化,在 二进制序列化中,所有内容都会被序列化,且性能也很好,使用二进制编码来生成精简的序列化,可以用于基于存储或socket的网络流。
    XML 序列化可提高可读性,以及对象共享和使用的灵活性,XML 序列化将对象的公共字段和属性或方法的参数和返回值序列化成符合特定 XML 格式的流,
    System.Xml.Serialization 包含序列化和反序列化 XML 所需要的类

    23、MVC中的controller传值到view的方式有哪些?
    (1)通过ViewData传值
    a、直接传递字符串:ViewData[“Name”] = “通过ViewData传递字符串”;=》取值:@ViewData[“Name”]
    b、传递键值对:ViewData.Add(“Name”, “tom”);=》取值:@ViewData[“Name”]
    c、传递集合:

    ViewData["Student"] = new List(){
                  new Student
                   {
                     ID = 1,
                     Name = "唐僧",
                     Age = 34,
                     Sex = "男"
                   }
                 };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    ViewData["Student"] = new Dictionary()
                {
                   ["name"]="唐僧",
                    ["age"] = "18",
                    ["sex"] = "男"
                };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    取值:

    @using MVCPassValue.Models;
    @{
        ViewBag.Title = "Index";
    }
    @{
        var stuViewData = ViewData["Student"] as List;//ViewData的value值是object类型的,这里需要进行类型转换
    }
                    @foreach (var item in stuViewData)
                    {
                        
    ID:@item.ID Name:@item.Name Age:@item.Age Sex:@item.Sex
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (2)通过ViewBag传值
    a、ViewBag是动态(dynamic)类型的
    b、直接传递字符串:ViewBag.name = “ViewBag”;
    c、传递集合:

    ViewBag.Stu = new List(){
                  new Student
                   {
                     ID = 1,
                     Name = "唐僧",
                     Age = 34,
                     Sex = "男"
                   }
                 };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    ViewBag.Stu= new Dictionary()
                {
                   ["name"]="唐僧",
                    ["age"] = "18",
                    ["sex"] = "男"
                };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    取值:

    @{
        var name = ViewBag.name;//!!!!
        var stu = ViewBag.Stu;//ViewBag是dynamic类型的,使用的时候不需要进行类型转换//!!!!
        var stuList = ViewBag.Student;//!!!!
    }
    
    ViewBag.name:@name
    ID:@stu.ID  Name:@stu.Name  Age:@stu.Age  Sex:@stu.Sex
                    @foreach (var item in stuList)
                    {
                        
    ID:@item.ID Name:@item.Name Age:@item.Age Sex:@item.Sex
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    (3)通过TempData传值
    (4)通过Model传值

    24、数据库中union和union all的作用和区别?
    (1)union all和union的区别就在于成效,union是在针对数据进行合并整理的同时不会整理重复行,并且还会采取默认排序。而union all在整理数据的时候,会将重复行也一起整理,但是不会重新排序。

    25、说下httpmodule和httphandler的作用和区别
    (1)HttpModule:对于HTTP请求而言,HttpModule是HTTP请求的“必经之路”,它可以在改HTTP请求传递到最终的“请求处理中心(HttpHandler)”处理前做一些额外的工作,或者在某些情况下终止满足一些条件的HTTP请求,从而起到一个过滤器的作用。HttpModule可以有多个,每次HTTP请求都将逐一通过每个HttpModule。HttpModule和HttpHandler对象是直接交互的。
    (2)HttpHandler:是页面请求的最终处理中心,如果说HttpModule是负责所有请求的初始化和请求收尾等工作,那么HttpHandler则负责具体工作,它是每一个请求的处理中心。一个HTTP请求最终是交给HttpHandler对象的ProcessRequest()方法进行处理的。与创建HttpModule不同的是VS中提供了创建HttpHandler类的模板,即一般处理程序。

  • 相关阅读:
    [论文阅读] CLRerNet: Improving Confidence of Lane Detection with LaneIoU
    从CNN到Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类
    IB数学EE主题选择及研究方法规定
    实用的 “edge://flags“
    Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性
    Mybaits 常用问题详解
    计算机毕业设计JavaH5醉美南湾湖网站设计(源码+系统+mysql数据库+lw文档)
    赋安消防主机FS5050,波特率20k,单模单芯SC接头,9-36V直流供电的光纤联网方式之一
    Bert:语言模型
    笔记本电脑wifi怎么连接
  • 原文地址:https://blog.csdn.net/qq_43173759/article/details/127751476