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有什么区别?


.bold { font-weight: bold }

1.说说显示实现接口和隐式实现接口的区别。

隐式接口实现: 如果类或者结构要实现的是单个接口,可以使用隐式实现。

显式接口实现: 如果类或者结构继承了多个接口,那么接口中相同名称成员就要显式实现。显示实现是

通过使用接口的完全限定名来实现接口成员的。

使用显式接口成员执行体通常有两个目的:

1、显式接口成员执行体不能通过类的实例进行访问,这就 可以从公有接口中把接口的实现部分单

独分离开。如果一个类只在内部使用该接口,而类的使用者不会直接使用到该接口,这种显式接口成员

执行体就可以起到作用。

2、 显式接口成员执行体避免了接口成员之间因为同名而发生混淆。如果一个类希望对名称和返回类型

相同的接口成员采用不同的实现方式,这就必须要使用到显式接口成员执行体。 如果没有显式接口成员

执行体,那么对于名称和返回类型不同的接口成员,类也无法进行实现。

ex:

//约定接口
interface ISkill
{
  void Flying();
} //隐式实现ISkill接口
public class Bird: ISkill
{
  public void Flying()
{
}
} //第一种调用方式
Bird bird = new Bird();
bird.Flying(); //第二种调用方式
ISkill secondBrid = new Bird();
secondBrid.Flying(); //用类和接口都可以调用Flying方法
//约定两个接口
interface InterfaceA
{
void Say();
}
interface InterfaceB
{
void Say();
}
//继承
class Person:InterfaceA, InterfaceB
{
void InterfaceA.Say()
{
Console.WriteLine("helloA");
} void InterfaceB.Say()
{
Console.WriteLine("helloB");
}
} //访问形式
class Program
{
static void Main(string[] args)
{
InterfaceA p = new Person();
p.Say(); InterfaceB p2 = new Person();
p2.Say();
}
} // 显示实现只能通过对应的接口访问对应的接口内的方法。用实现类去访问时访问不到的。

2.说说file访问修饰的作用。

.NET7到来时,C#11中添加了file访问修饰符。就是文件的意思,file是只能用来定义类型的访问修饰
符,不能定义类型中的类成员,即使嵌套类也不可以。file是用来定义使用范围最小的类型访问修饰符,
只限于在当前文件中,其他类型的成员内访问。

file基本的使用场景是,当需要一个类型时,但又不想这个类型的使用范围延伸到外部,所以就在当
前.cs文件定义一个file访问修饰符的类型,仅限于当前文件中的类型成员内部封装并访问。

ex:

public class Product {
public string ? Name {
get;
set;
}
public decimal PurchasePrice {
get;
set;
}
public void PrintSalesProduct() {
var salesPrice = new SalesPrice {
RetailPrice = PurchasePrice * 1.5 m, WholesalePrice = PurchasePrice * 1.2 m
};
Console.WriteLine($ "Name:{Name},{salesPrice}");
}
}
file record SalesPrice {
public decimal RetailPrice {
get;
set;
}
public decimal WholesalePrice {
get;
set;
}
}

3.说说什么是原始字符串。

C# 11 引入了原始字符串特性,允许用户利用原始字符串在代码中插入大量的无需转移的文本,方便开发者在代码中以字符串的方式塞入代码文本等。

原始字符串需要被至少三个 " 包裹,例如 """ 和 """"" 等等,前后的引号数量要相等。

另外,原始字符串的缩进由后面引号的位置来确定

例如:

此时 str 是:带有换行符的字符串

{
string str = """
hello
world
""";
Console.WriteLine(str);
}

此时 str 是:带有换行符,且第二行有空格的字符串

{
var str = """"
hello
world
"""";
Console.WriteLine(str);
}

可以直接定义JSON格式

{
//可以直接定义JSON格式
var json = """"
{
"a": 1,
"b": {
"c": "hello",
"d": "world"
},
"c": [1, 2, 3, 4, 5]
}
"""";
Console.WriteLine(json);
object obj= Newtonsoft.Json.JsonConvert.DeserializeObject<object>(json);
Hashtable tb = Newtonsoft.Json.JsonConvert.DeserializeObject<Hashtable>
(json);
}

可以直接定义JSON格式

{
int age= 37;
string? jsonResult= $$"""
{
"Id":123,
"Name":"Richard",
"Age":"{{age}}"
}
""";
}

4. C#10 中struct有什么改进?

主要在于支持了无参数构造函数的改进,在C# 10之前,约束了不能有无参数的构造函数,现在在C#10
方法了这一约束;

public struct Teaach
{
public Teaach(string firstName, string lastName)
{
this.FirstName = firstName;
this.LastName = lastName;
}
public string FirstName { get; set; }
public string LastName { get; set; }
}

5.说说C#10中Lambda表达式的新特点

在之前的版本中我们是需要显式声明委托类型,如上述被注释的代码,在 C# 10 就可以直接使用 var
来声明由编译器去推断委托的类型

// Func<int> func = () => 1;
var func = () => 1;
// Func<string> func2 = ()=>"Hello";
var func2 = () => "Hello";

我们可以在指定输入参数类型的时候,可以设置 ref / out / int 来表示一个值类型的引用传递,示例如

var refFunc = (ref int x) => { x++; };
var outFunc = (out int x) => { x = -1; };
var inFunc = (in int x) => { };
var num = 1;
refFunc(ref num);
Console.WriteLine(num);
outFunc(out num);
Console.WriteLine(num);

C# 10 的委托可以指定返回类型,如下:

// return type
var lambdaWithReturnValue0 = int? () => null;
// return type and input type
var lambdaWithReturnValue1 = int? (string s)
=> string.IsNullOrEmpty(s) ? 1 : null;
// Func<bool, object>
var choose = object (bool b) => b ? 1 : "two";

对于能够推断出类型的方法,我们也可以使用 var 来声明委托,示例如下

// Action<string> func3 = LocalMethod;
var func3 = LocalMethod;
void LocalMethod(string a)
{
Console.WriteLine(a);
}
var checkFunc = string.IsNullOrEmpty;
var read = Console.Read;
Action<string> write = Console.Write;

现在我们可以在 Lambda 表达式中指定 Attribute

var parse3 =[Description("Lambda attribute")](string s) => int.Parse(s);
var choose3 =[Description("Lambda attribute1")]object (bool b) => b ? 1 : "two";

6.说说对于泛型特性的理解。

泛型:不确定的类型,声明时不确定类型,调用时确定类型。可以支持一个类、方法、委托、接口等 类
支持不同类型的需求;那么对于泛型的支持;

C# 10 推广了特性,使得特性可以用泛型,如下例:

public sealed class SomeAttribute<T> : Attribute
{
}

在使用的时候:

[SomeAttribute<int>]
class A { }
[SomeAttribute<string>]
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。

app.UseRateLimiter(new RateLimiterOptions()
{
// 触发限流的响应码
DefaultRejectionStatusCode = 500,
OnRejected = async (ctx, rateLimitLease) =>
{
// 触发限流回调处理
},
Limiter = PartitionedRateLimiter.Create<HttpContext, string>(resource =>
{
if (resource.Request.Path.StartsWithSegments("/api"))
{
return RateLimitPartition.CreateConcurrencyLimiter("WebApiLimiter", _ => new ConcurrencyLimiterOptions(2,QueueProcessingOrder.NewestFirst, 2));
}
else
{
return RateLimitPartition.CreateConcurrencyLimiter("DefaultLimiter",
_ => new ConcurrencyLimiterOptions(1, QueueProcessingOrder.NewestFirst, 1));
}
})
});

9. 说说Record关键字的用法

可以用来简单声明一个类:

record People
{
public string Name { get; init; }
public int Age { get; init; }
}
上面是声明一个类
下面的声明也是声明一个类,和上面的一样;不需要使用大括号来执行属性;
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的。

1 .NET Core笔试题的更多相关文章

  1. ASPNET Core笔试题

    1.如何在ASP.NET Core中激活Session功能? 首先要添加session包. 其次要在configservice方法里面添加session.然后又在configure方法里面调用 use ...

  2. 【笔试题】Spring笔试题

    spring笔试题 1.Spring支持的事务管理类型 Spring支持两种类型的事务管理: 编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护. 声明式事务管理:这意味 ...

  3. 【笔试题】Java笔试题知识点

    Java高概率笔试题知识点 Java语法基础部分 [解析]java命令程序执行字节码文件是,不能跟文件的后缀名! 1.包的名字都应该是由小写单词组成,它们全都是小写字母,即便中间的单词亦是如此 2.类 ...

  4. 对Thoughtworks的有趣笔试题实践

    记得2014年在网上看到Thoughtworks的一道笔试题,当时觉得挺有意思,但是没动手去写.这几天又在网上看到了,于是我抽了一点时间写了下,我把程序运行的结果跟网上的答案对了一下,应该是对的,但是 ...

  5. 从阿里巴巴笔试题看Java加载顺序

    一.阿里巴巴笔试题: public class T implements Cloneable { public static int k = 0; public static T t1 = new T ...

  6. 我设计的ASP.NET笔试题,你会多少呢

    本笔试题考查范围包括面向对象基础.HTML.CSS.JS.EF.jQuery.SQL.编码思想.算法等范围. 第1题:接口和抽象类有何区别? 第2题:静态方法和实例方法有何区别? 第3题:什么是多态? ...

  7. C#经典笔试题-获取字符串中相同的字符以及其个数

    public Dictionary<char,int> GetStrSameAs(string str){ //将字符串转换成一个字符数组. char[] charArray=str.To ...

  8. flhs笔试题-回家上机实践

    这是最近参加的一个公司的笔试题,回家上机写了下代码,希望对有需要的小伙伴有用,简单实现字符串和数组在指定位置的插入: package org.flhs; import com.google.commo ...

  9. 也许你需要点实用的-Web前端笔试题

    之前发的一篇博客里没有附上答案,现在有空整理了下发出来,希望能帮助到正在找工作的你,还是那句话:技术只有自己真正理解了才是自己的东西,共勉. Web前端笔试题 Html+css 1.对WEB标准以及w ...

  10. [c#基础]关于try...catch最常见的笔试题

    引言 在翻看之前总结的常见面试题中,关于try...catch异常处理的还是蛮多了,今天看到这个面试题,也就重新学习一下. try..catch语法 try-catch语句由一个try块后跟一个或多个 ...

随机推荐

  1. Go语言核心36讲06

    我已经为你打开了Go语言编程之门,并向你展示了"程序从初建到拆分,再到模块化"的基本演化路径. 一个编程老手让程序完成基本演化,可能也就需要几十分钟甚至十几分钟,因为他们一开始就会 ...

  2. 9 STL-queue

    ​ 重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦!  生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦! 写在前面,本篇章主要介绍S ...

  3. Java Web中requset,session,application 的作用域及区别

    三者概述 requset概述: request是表示一个请求,只要发出一个请求就会创建一个request 用处:常用于服务器间同一请求不同页面之间的参数传递,常应用于表单的控件值传递. session ...

  4. 关于linux上steamplay无法启动windows游戏

    前言 很多游戏,deepin-wine做的兼容性不如steamplay linux上steamplay加载windows游戏 点击添加游戏---------添加非steam游戏 点击浏览 改为all ...

  5. On Java 8读书笔记

    第一章 什么是对象 1.1 抽象的历程 "对象":问题空间中的元素及其解决方案空间中的具体呈现. 理念即是通过添加各种新的对象,可以将程序改编为一种描述问题的语言. 对象是具有状态 ...

  6. Blazor和Vue对比学习(进阶.路由导航一):基本使用

    Blazor和Vue都是单文件组件SPA,路由的实现逻辑非常相似,页面路径的改变都是组件的切换,但因为各自语言的特性,在实现方式上有较大差异. 一.安装 1.Vue:Router是Vue的一个插件.如 ...

  7. 【SQL进阶】【分步写、联合各自排序、TIMESTAMPDIFF时间比较】Day04:多表查询

    〇.内容 时间比较2-2 联合结果各自排序 查询列和GROUP BY 一.嵌套子查询 1.月均完成试卷数不小于3的用户爱作答的类别 自己的答案[错误]: SELECT tag, COUNT(A.sta ...

  8. 【大数据课程】高途课程实践-Day03:Scala实现商品实时销售统计

    〇.概述 1.实现内容 使用Scala编写代码,通过Flink的Source.Sink以及时间语义实现实时销量展示 2.过程 (1)导包并下载依赖 (2)创建数据源数据表并写⼊数据 (3)在Mysql ...

  9. 【JUC】循环屏障CyclicBarrier详解

    欢迎关注专栏[JAVA并发] 前言 jdk中提供了许多的并发工具类,大家可能比较熟悉的有CountDownLatch,主要用来阻塞一个线程运行,直到其他线程运行完毕.而jdk还有一个功能类似并发工具类 ...

  10. rpm和yum仓库

    一.rpm rpm从官网下,或者自研 外来的硬件设备连接到Linux上,必须挂载 rpm -qa(all) 显示当前系统中以 RPM 方式安装的所有软件列表 rpm -q 软件名 查询指定软件是否已安 ...