翼度科技»论坛 编程开发 .net 查看内容

1 .NET Core笔试题

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
1.说说显示实现接口和隐式实现接口的区别。
2.说说file访问修饰的作用。
3.说说什么是原始字符串。
4.C#10 中struct有什么改进?
5.说说C#10中Lambda表达式的新特点。
6.说说对于泛型特性的理解。
7.说说在ASP.NET Core7中,依赖注入中的方法注入需要注意什么?
8.说说ASP.NET Core7 限流中间件。
9.说说Record关键字的用法
10.说说 Minimal API的特点,和普通API有什么区别?
1.说说显示实现接口和隐式实现接口的区别。

隐式接口实现: 如果类或者结构要实现的是单个接口,可以使用隐式实现。
显式接口实现: 如果类或者结构继承了多个接口,那么接口中相同名称成员就要显式实现。显示实现是
通过使用接口的完全限定名来实现接口成员的。
使用显式接口成员执行体通常有两个目的:
1、显式接口成员执行体不能通过类的实例进行访问,这就 可以从公有接口中把接口的实现部分单
独分离开。如果一个类只在内部使用该接口,而类的使用者不会直接使用到该接口,这种显式接口成员
执行体就可以起到作用。
2、 显式接口成员执行体避免了接口成员之间因为同名而发生混淆。如果一个类希望对名称和返回类型
相同的接口成员采用不同的实现方式,这就必须要使用到显式接口成员执行体。 如果没有显式接口成员
执行体,那么对于名称和返回类型不同的接口成员,类也无法进行实现。
ex:
  1. //约定接口
  2. interface ISkill
  3. {
  4.   void Flying();
  5. }
  6. //隐式实现ISkill接口
  7. public class Bird: ISkill
  8. {
  9.   public void Flying()
  10.     {            
  11.     }
  12. }
  13. //第一种调用方式
  14. Bird bird = new Bird();
  15. bird.Flying();
  16. //第二种调用方式
  17. ISkill secondBrid = new Bird();
  18. secondBrid.Flying();
  19. //用类和接口都可以调用Flying方法
复制代码
  1. //约定两个接口
  2. interface InterfaceA
  3.     {
  4.         void Say();
  5.     }
  6. interface InterfaceB
  7.     {
  8.         void Say();
  9.     }
  10. //继承
  11. class Person:InterfaceA, InterfaceB
  12.     {
  13.         void InterfaceA.Say()
  14.         {
  15.             Console.WriteLine("helloA");
  16.         }
  17.    
  18.         void InterfaceB.Say()
  19.         {
  20.             Console.WriteLine("helloB");
  21.         }
  22.     }
  23. //访问形式
  24. class Program
  25. {
  26.         static void Main(string[] args)
  27.         {   
  28.             InterfaceA p = new Person();
  29.             p.Say();
  30.             InterfaceB p2 = new Person();
  31.             p2.Say();
  32.         }
  33. }
  34. // 显示实现只能通过对应的接口访问对应的接口内的方法。用实现类去访问时访问不到的。
复制代码
2.说说file访问修饰的作用。

.NET7到来时,C#11中添加了file访问修饰符。就是文件的意思,file是只能用来定义类型的访问修饰符,不能定义类型中的类成员,即使嵌套类也不可以。file是用来定义使用范围最小的类型访问修饰符,只限于在当前文件中,其他类型的成员内访问。
file基本的使用场景是,当需要一个类型时,但又不想这个类型的使用范围延伸到外部,所以就在当前.cs文件定义一个file访问修饰符的类型,仅限于当前文件中的类型成员内部封装并访问。
ex:
  1. public class Product {
  2.     public string ? Name {
  3.         get;
  4.         set;
  5.     }
  6.     public decimal PurchasePrice {
  7.         get;
  8.         set;
  9.     }
  10.     public void PrintSalesProduct() {
  11.         var salesPrice = new SalesPrice {
  12.             RetailPrice = PurchasePrice * 1.5 m, WholesalePrice = PurchasePrice * 1.2 m
  13.         };
  14.         Console.WriteLine($ "Name:{Name},{salesPrice}");
  15.     }
  16. }
  17. file record SalesPrice {
  18.     public decimal RetailPrice {
  19.         get;
  20.         set;
  21.     }
  22.     public decimal WholesalePrice {
  23.         get;
  24.         set;
  25.     }
  26. }
复制代码
3.说说什么是原始字符串。

C# 11 引入了原始字符串特性,允许用户利用原始字符串在代码中插入大量的无需转移的文本,方便开发者在代码中以字符串的方式塞入代码文本等。
原始字符串需要被至少三个 " 包裹,例如 """ 和 """"" 等等,前后的引号数量要相等。
另外,原始字符串的缩进由后面引号的位置来确定
例如:
此时 str 是:带有换行符的字符串
  1. {
  2.      string str = """
  3.                hello
  4.                world
  5.                """;
  6.      Console.WriteLine(str);
  7. }
复制代码
此时 str 是:带有换行符,且第二行有空格的字符串
  1. {
  2.    var str = """"
  3.            hello
  4.                world
  5.            """";
  6.    Console.WriteLine(str);
  7. }
复制代码
可以直接定义JSON格式
  1. {
  2.    //可以直接定义JSON格式
  3.    var json = """"
  4.                {
  5.                    "a": 1,
  6.                    "b": {
  7.                            "c": "hello",
  8.                            "d": "world"
  9.                          },
  10.                    "c": [1, 2, 3, 4, 5]
  11.                }
  12.                """";
  13.    Console.WriteLine(json);
  14.    object obj= Newtonsoft.Json.JsonConvert.DeserializeObject<object>(json);
  15.    Hashtable tb = Newtonsoft.Json.JsonConvert.DeserializeObject<Hashtable>
  16. (json);
  17. }
复制代码
可以直接定义JSON格式
  1. {
  2.    int age= 37;
  3.    string? jsonResult= $$"""
  4.                  {
  5.                    "Id":123,
  6.                    "Name":"Richard",
  7.                    "Age":"{{age}}"
  8.                  }
  9.                  """;               
  10. }
复制代码
4. C#10 中struct有什么改进?

主要在于支持了无参数构造函数的改进,在C# 10之前,约束了不能有无参数的构造函数,现在在C#10 方法了这一约束;
  1. public struct Teaach
  2. {
  3.    public Teaach(string firstName, string lastName)
  4.    {
  5.        this.FirstName = firstName;
  6.        this.LastName = lastName;
  7.    }
  8.    public string FirstName { get; set; }
  9.    public string LastName { get; set; }
  10. }
复制代码
5.说说C#10中Lambda表达式的新特点

在之前的版本中我们是需要显式声明委托类型,如上述被注释的代码,在 C# 10 就可以直接使用 var来声明由编译器去推断委托的类型
  1. // Func<int> func = () => 1;
  2. var func = () => 1;
  3. // Func<string> func2 = ()=>"Hello";
  4. var func2 = () => "Hello";
复制代码
我们可以在指定输入参数类型的时候,可以设置 ref / out / int 来表示一个值类型的引用传递,示例如
  1. var refFunc = (ref int x) => { x++; };
  2. var outFunc = (out int x) => { x = -1; };
  3. var inFunc = (in int x) => { };
  4. var num = 1;
  5. refFunc(ref num);
  6. Console.WriteLine(num);
  7. outFunc(out num);
  8. Console.WriteLine(num);
复制代码
C# 10 的委托可以指定返回类型,如下:
  1. // return type
  2. var lambdaWithReturnValue0 = int? () => null;
  3. // return type and input type
  4. var lambdaWithReturnValue1 = int? (string s)
  5.    => string.IsNullOrEmpty(s) ? 1 : null;
  6. // Func<bool, object>
  7. var choose = object (bool b) => b ? 1 : "two";
复制代码
对于能够推断出类型的方法,我们也可以使用 var 来声明委托,示例如下
  1. // Action<string> func3 = LocalMethod;
  2. var func3 = LocalMethod;
  3. void LocalMethod(string a)
  4. {
  5.    Console.WriteLine(a);
  6. }
  7. var checkFunc = string.IsNullOrEmpty;
  8. var read = Console.Read;
  9. Action<string> write = Console.Write;
复制代码
现在我们可以在 Lambda 表达式中指定 Attribute
  1. var parse3 =[Description("Lambda attribute")](string s) => int.Parse(s);
  2. var choose3 =[Description("Lambda attribute1")]object (bool b) => b ? 1 : "two";
复制代码
6.说说对于泛型特性的理解。

泛型:不确定的类型,声明时不确定类型,调用时确定类型。可以支持一个类、方法、委托、接口等 类支持不同类型的需求;那么对于泛型的支持;
C# 10 推广了特性,使得特性可以用泛型,如下例:
  1. public sealed class SomeAttribute<T> : Attribute
  2. {
  3. }
复制代码
在使用的时候:
  1. [SomeAttribute<int>]
  2. class A { }  
  3. [SomeAttribute<string>]
  4. class B { }
复制代码
7.说说在ASP.NET Core7中,依赖注入中的方法注入需要注意什么?

在MinimalAPI 或者是控制器中的方法中,如果需要支持注入,因为注入的对象和方法的参数是写在一起的。会出现系统无法识别这里写的参数究竟是要注入,还是调用方传入的参数。那么如果明确那个参数是要通过注入(也就是说通过IOC容器来创建),就需要给这个参数标记一个特性【FromServices】,指定当前这个参数是来自于IOC容器,也就是注入进来的。8.说说ASP.NET Core7 限流中间件。

实操如下:
安装.NET 7.0 SDK
通过nuget包安装Microsoft.AspNetCore.RateLimiting
创建.NET7网站应用,注册中间件
可以根据不同资源不同限制并发数,/api前缀的资源租约数2,等待队列长度为2,其他默认租约数1,队列长度1。
  1. app.UseRateLimiter(new RateLimiterOptions()
  2. {
  3.    // 触发限流的响应码
  4.    DefaultRejectionStatusCode = 500,
  5.    OnRejected = async (ctx, rateLimitLease) =>
  6.    {
  7.        // 触发限流回调处理
  8.    },
  9.    Limiter = PartitionedRateLimiter.Create<HttpContext, string>(resource =>
  10.    {
  11.        if (resource.Request.Path.StartsWithSegments("/api"))
  12.        {
  13.            return RateLimitPartition.CreateConcurrencyLimiter("WebApiLimiter", _ => new ConcurrencyLimiterOptions(2,QueueProcessingOrder.NewestFirst, 2));
  14.        }
  15.        else
  16.        {
  17.            return RateLimitPartition.CreateConcurrencyLimiter("DefaultLimiter",
  18.                _ => new ConcurrencyLimiterOptions(1, QueueProcessingOrder.NewestFirst, 1));
  19.        }
  20.    })
  21. });
复制代码
9. 说说Record关键字的用法

可以用来简单声明一个类:
  1. record People
  2. {
  3.    public string Name { get; init; }
  4.    public int Age { get; init; }
  5. }
  6. 上面是声明一个类
  7. 下面的声明也是声明一个类,和上面的一样;不需要使用大括号来执行属性;
  8. record People2(string Name, int Age);
复制代码
这里的示例,用 record 声明了两个 实体,第二个 实体 声明的时候使用了简化的写法,record
People2(string Name, int Age); 这样的声明意味着,构造方法有两个参数,分别是 string Name 和 int
Age,并对应着两个属性,属性的声明方式和 People 一样 public string Name { get; init; } 都是一个
get 一个 init,对于 record 支持一个 with 表达式,来修改某几个属性的值,这对于有很多属性都相同的
场景来说是及其方便的;
10.说说 Minimal API的特点,和普通API有什么区别?

Minimal API翻译过来:极简Api或者最小Api,从名字上就可以理解。 Minimal API意在去掉过多的流程。相比于普通的Webapi,在HttpContext的处理流程中,减少了处理的步骤,没有MVC的流程,在中间件的位置处理了请求;减少了处理的步骤,减少了计算机的资源消耗,提高性能。当然在功能的支持上也有部分是少于普通 的.NET Core WebApi的。
来源:https://www.cnblogs.com/zhendayong/archive/2023/02/17/17129895.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具