首页
学习
活动
专区
圈层
工具
发布

C# .NET面试系列三:集合、异常、泛型、LINQ、委托、EF!

Equals 比较的是引用Console.WriteLine(personSet.Count); // 输出 2== 运算符== 运算符在C#中是用于比较值类型和引用类型的。...什么是闭包?闭包(Closure)是一种特殊的函数对象,它包含了函数定义时创建的词法作用域中的变量。换句话说,闭包允许一个函数在其声明的词法作用域之外引用变量。...// 在理解闭包之前,首先需要了解一下词法作用域(Lexical Scope)和函数的作用域。 // 词法作用域:// 词法作用域是指在代码编写阶段确定变量作用域的规则。...它是由代码的结构和嵌套关系来定义的,而不是在运行时动态确定的。在词法作用域中,函数可以访问其声明时所处的作用域中的变量。// 闭包:// 当一个函数引用了其声明时的作用域外的变量时,就形成了闭包。...闭包允许函数在其声明的作用域之外记住和访问这些变量。

19810

解析“60k”大佬的19道C#面试题(下)

先略看题目: 简述 LINQ 的 lazy computation 机制 利用 SelectMany 实现两个数组中元素做笛卡尔集,然后一一相加 请为三元函数实现柯里化 请简述 refstruct 的作用...请简述 refstruct 的作用 refstruct 是 C# 7.2 发布的新功能,主要是为了配合 Span ,防止 Span 被误用。 为什么会被误用呢?...基于不被托管堆管理这一点,我们可以总结出以下结论: 不能对 refstruct 装箱(因为装箱就变成引用类型了)——包括不能转换为 object 、 dynamic 禁止实现任何接口(因为接口是引用类型...而引用类型、 struct 成员和自动属性都可能是在托管内存中) 禁止在迭代器( yield )中使用 refstruct (因为迭代器本质是状态机,状态机是一个引用类型) 在 Lambda 或 本地函数...中使用(因为 Lambda / 本地函数 都是闭包,而闭包会生成一个引用类型的类) 以前常有一个疑问,我们常常说值类型在栈中,引用类型在堆中,那放在引用类型中的值类型成员,内存在哪?

1.8K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JavaScript中,var、let和const使用

    var:遗留关键字从历史上看,var是JavaScript中声明变量的唯一方式。它具有函数作用域,这意味着用var声明的变量被限定在声明它们的函数内,而不是它们被定义的块内。...这创建了一个暂时性死区(TDZ),在这个区域中变量是不可访问的。let:现代开发的块级作用域let在2015年6月的ECMAScript 6(ES6)中引入。...这意味着用let声明的变量只有在它们定义的块内(通常用大括号{}包围)才可访问。这提供了一种清晰和可预测的方式来管理变量作用域,防止意外的副作用,使你的代码更易于维护。当使用循环时,let是首选。...(假设age >= 18)虽然let主要关注块级作用域,但它还在函数内部引入了比旧的var关键字更可预测的行为。在函数内部用let声明的变量在该函数外部不可访问,促进了更好的组织并防止了意外的修改。...,但它并不保证像对象和数组这样的复杂数据类型的不变性。

    63900

    掌握25个C#实战技巧:从代码优化到高效开发

    使用记录类型(Records) C# 9引入的record是不可变数据模型的理想选择: public record Person(string Name, int Age); // 自动生成相等性与不可变性...文件作用域命名空间 C# 10引入文件级命名空间,简化代码结构: namespace MyApp; class Program { static void Main() => Console.WriteLine...模式匹配简化类型检查 C# 7的模式匹配让条件逻辑更简洁: object data = ; if (data is int number) Console.WriteLine($"整数:{number...可空引用类型规避空指针 C# 8引入可空引用类型,编译时捕获潜在空值问题: string? name = GetName(); // 允许null Console.WriteLine(name?....条件断点智能调试 在IDE中设置条件断点: // 当x > 10且y == 5时触发 if (x > && y == ) Debugger.Break(); C#提供了丰富的工具集,助你编写简洁

    30510

    C#匿名类型、var、dynamic的进化史

    随着C#的发展,该语言内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑。C# 语言从诞生起就是强类型语言,这一性质到今天不曾改变,我想以后也不会变。...匿名对象(匿名类型) 因此C#在3.0版本中吸收了JavaScript脚本语言的这种语法优点,对C#做了相应升级使其也支持这种语法形式(C#依然是强类型语言)。...Var登场 现在要使用匿名对象,则需要使用变量引用它。虽然我们在创建时没有指定对象的类型,但编译器会在编译过程中帮我们创建一个具有相关属性和方法的类型。...示例如下: static void Main(string[] args) { //XXX为类型声明 //x为引用变量 XXX x = new {Name="张三",Age=...说明: var 和 dynamic 看似功能类似,但它们是不同的: var dynamic 声明字段 × √ 局部变量 √ √ 方法参数类型 × √ 方法返回值类型 × √

    31810

    C#2.0增功能04 可以为 null 的类型

    基础类型 T 可以是任何不可为 null 的值类型。 T 不能是引用类型。...需要表示基础类型的未定义的值时,请使用可以为 null 的类型。 布尔变量只能有两个值:true 和 false。 没有“未定义”的值。...在许多编程应用程序中,尤其是数据库交互中,变量值可能未定义或缺失。 例如,数据库中的字段可能包含值 true 或 false,但它也可能根本不包含任何值。...不能根据引用类型创建可以为 null 的类型 (引用类型已支持 null 值)。 语法 T? 是 Nullable 的简写。 这两种形式是可互换的。...从 C# 7.0 开始,可以使用模式匹配来检查和获取可以为 null 的类型的值:if (x is int valueOfX) y = valueOfX;。 T?

    67140

    C#秒杀Java的五个不可替代的特性,完美的编程语言并不存在

    1.LINQ LINQ (Language-Integrated Query,语言集成查询) 于 2007 年引入到 C#,以帮助开发人员从各种数据源查询数据。...例如,我们来看看这个代码,用于在 C# 中从列表中过滤 2 位数。 首先,在不使用 LINQ 的情况下: ? 如果使用 LINQ 查询语法形式: ? 或者是方法语法形式: ?...一个结构体和一个类之间最大的区别在于结构是值类型,而类是引用类型。 相比于创建类,编写结构体最重要的好处是在构造一个值类型时比在构造引用类型时更容易确保值语义。...如 Microsoft 的文档所述,“struct 类型的变量直接包含结构体的数据,而类类型的变量包含对数据的引用。”...因此,对比使用类时,使用结构体的好处之一是,从代码的其他部分更改其值的唯一方法是将其作为参考进行显式传递。

    3.4K100

    C++ 与 Go、Rust、C#:基于实践场景的语言特性对比

    一、语法特性对比 对比维度 C++ Go Rust C# 变量声明 int x; var x int let x: i32; int x; 函数定义 int add(int a, int b)...Rust 的内存管理基于所有权系统,在编译期就对内存进行严格检查,确保每个值在任一时刻都有且只有一个所有者,当所有者离开作用域时,值会被自动释放。...,确保多个线程操作的是同一个变量。...} fmt.Println(slice) // 当slice变量离开作用域,其占用的内存由垃圾回收器自动回收 } 在 Go 语言中,即使频繁创建和销毁大量对象,开发者也无需担心内存泄漏问题...,等待垃圾回收 GC.Collect(); // 手动触发垃圾回收(通常无需手动触发) } } C# 的垃圾回收器会自动监测对象的引用情况,当一个对象不再被任何变量引用时,它将被标记为可回收

    46310

    C# 方法与参数 常见命名空间汇总 using的使用 main方法参数

    本文主要讲 C# 常见命名空间 using static 指令 && 调用静态方法 嵌套命名空间&&作用域 别名 Main() 方法 ---- C# 常见命名空间 命名空间 作用 System...创建文件是默认引入,处理数学计算、、环境变量、输出控制台、垃圾回收器及一些常见的异常和特征。...using static 只针对静态类型有效! ---- 嵌套命名空间&&作用域 命名空间也有作用域,离开作用域的类型将无法使用。但命名空间的引入,不像变量的声明那么“任性”。...命名空间的引入是使用using指令,using指令可以在命名空间外、命名空间内的顶部并且在类的外面使用。 在命名空间外使用的using指令作用域是 该文件下的所有命名空间。...在命名空间内使用的using指令作用域是 该命名空间内。 下面是一个例子。

    1.7K40

    C#开发者必知的10个冷门特性:让你的代码更高效、更智能

    你可能已经听说过 C# 的强类型系统,或者它是微软对 Java 的回应。但今天,我们将深入探讨一些即使是经验丰富的开发者也可能不知道的 C# 奇妙特性。...这使得一些非常复杂的不可变性模式成为可能。 3. 字符串实际上是数组(某种程度上) 虽然字符串是不可变的引用类型,但 C# 允许你像数组一样索引它们。...局部函数是闭包忍者 局部函数可以从它们的包含作用域中捕获变量,但有一个转折: void ProcessData(int threshold) { int multiplier =; local...} 它们可以看到并修改来自父作用域的变量,即使是在它们定义之后。这就像它们对周围上下文有 X 光透视能力。 9....自 C# 8.0 以来,你可以使用简化的 using 声明,它会在作用域结束时自动释放。不再需要嵌套块!

    17210

    Java失业者转.NET开发路线目录

    在接下来的章节中,我们将深入探讨C#的各个方面,包括它独特的特性如属性、事件、委托等。这些概念可能对Java开发者来说比较新,但它们是C#强大功能的关键所在。...记住,学习一门新的语言不仅是学习语法,更是学习一种新的思维方式。让我们继续我们的C#学习之旅吧! 1.2 变量和数据类型 在C#中,变量和数据类型是编程的基础。...对于从Java转过来的开发者来说,你会发现很多熟悉的概念,但C#也有一些独特的特性。让我们深入探讨C#的变量和数据类型,并与Java进行比较。...值类型直接存储它们的数据。 引用类型(Reference Types): 类(class)、接口(interface)、委托(delegate)和数组(array)是引用类型。...引用类型存储对其数据(对象)的引用。 C#独特之处: C#允许使用struct关键字创建自定义值类型。 C#的string虽然是引用类型,但具有值类型的一些特性(如不可变性)。

    56110

    C# 发展历史及版本新功能介绍

    处理数据库和其他包含不可赋值的元素的数据类型时,能够将 null 赋值给数值类型和布尔类型会特别有用。 例如,数据库中的布尔字段可以存储值 true 或 false,也可以处于未定义状态。...到达迭代器方法的结尾时,循环便已完成。 协变和逆变 在 C# 中,协变和逆变能够实现数组类型、委托类型和泛型类型参数的隐式引用转换。 协变保留分配兼容性,逆变则与之相反。...括号内的两个或更多输入参数使用逗号加以分隔: C#复制 (x, y) => x == y 有时,编译器难以或无法推断输入类型。...回顾过去,这些功能中大多数似乎都是不可或缺,难以分割的。 它们的组合都是经过巧妙布局。 我们通常认为 C# 版本的杀手锏是查询表达式,也就是语言集成查询 (LINQ)。...重点是缩减了使用 out 关键字的变量声明,并通过元组实现了多个返回值。 但 C# 的用途更加广泛了。 .NET Core 现在面向所有操作系统,着眼于云和可移植性。

    4.8K20

    【前端】JavaScript 变量声明与函数声明的提升机制:深入探讨提升优先级与其行为

    JavaScript 提升(Hoisting)概述 提升(Hoisting) 是 JavaScript 编译阶段的行为,它涉及到将代码中的变量声明和函数声明提升到所在作用域或全局作用域的最顶端。...这意味着在作用域的最顶端,变量会被默认初始化为 undefined,直到代码执行到赋值语句时,变量的值才会被真正更新。因此,var 提升后的行为往往会导致一些令人困惑的未定义状态。...接下来,var foo 的声明也被提升,但它仅仅是声明变量,而不会覆盖函数声明,因此在编译结束时,foo 仍然是指向函数的引用。...紧接着,var x 的声明也被提升,但它不会覆盖已经存在的函数定义,只是做了一个声明。 执行阶段 第一次 console.log(x) 输出的是函数 x,因为此时 x 的值为函数。...因此,在赋值之前,变量的初始值是 undefined。 这种机制的设计使得函数在作用域内具有更高的优先级,从而确保开发者可以在代码的任何位置调用函数。

    16100

    C# dynamic

    1.概要 在C#编程中,dynamic是一种特殊的数据类型,引入于C# 4.0版本。...简化LINQ查询: 在LINQ查询中,有时查询的结构在编译时难以确定,dynamic类型可以用于处理这种不确定的查询结果,使得LINQ查询更加灵活。...当dynamic变量脱离作用域后GC如何处理它 dynamic变量脱离作用域后,其内存会由垃圾回收器(Garbage Collector,GC)处理。...与其他局部变量一样,当dynamic变量超出其作用域范围时,它所占用的内存空间将被标记为可回收。...垃圾回收器会在程序运行时的适当时机自动检测这些不再被引用的对象,并释放它们占用的内存,以便将内存重新分配给新的对象。 dynamic相比其他数据类型会有性能问题吗?

    36540

    C#3.0新增功能09 LINQ 基础04 基本 LINQ 查询操作

    本篇介绍 LINQ 查询表达式和一些在查询中执行的典型操作。 获取数据源 在 LINQ 查询中,第一步是指定数据源。 和大多数编程语言相同,在使用 C# 时也必须先声明变量,然后才能使用它。...当执行查询时,范围变量将充当对 customers 中每个连续的元素的引用。 由于编译器可以推断 cust的类型,因此无需显式指定它。 可通过 let 子句引入其他范围变量。...对于非泛型数据源(例如 ArrayList),必须显式键入范围变量。 有关详细信息,请参阅如何:使用 LINQ 查询 ArrayList (C#) 和 from 子句。...由于 Name是字符串,默认比较器将按字母顺序从 A 到 Z 进行排序。...例如,可通过执行联接来查找所有位置相同的客户和分销商。 在 LINQ 中,join 子句始终作用于对象集合,而非直接作用于数据库表。

    4.1K20

    c#中的可空类型和空合并操作符(Nullable Types 和 Null Coalescing Operator)

    在本文中,我们将讨论可空类型和空合并操作符以及如何在基于c#的代码中使用它们。 这是c#编程中的一个基本概念。在这里,我将解释可空类型,c#中的空合并操作符,以及如何在LINQ中使用该操作符。...c#中的数据类型分为两大类:值类型和引用类型。 值类型变量不能为空,但是我们可以在引用类型变量中指定一个空值。 让我们检查当我们给值类型赋空时将会发生什么。 ?...有两种方法可以解决这个问题: Nullable x = null; int ? x = null; 上面展示了在c#中将非空值类型转换为空值类型的两种方法。...是c#中的一个重要运算符。根据MSDN的定义:?操作符称为null-coalescing操作符,用于为可空值类型或引用类型定义一个默认值。它返回左操作数,如果操作数不为空;否则,它返回正确的操作数。...现在我向你们展示这个运算符是如何在LINQ中使用的。

    4.7K20

    .net面试题常见有答案(java中级开发面试题)

    事件和委托的关系。 委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。 事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。.../6.在C#中值类型和引用类型的区别 值类型: 基本: (1)直接包含数据 (2)离开作用域将被从内存中清除 存储: (1)值类型变量将直接存储数据,并存储在内存的堆栈中 (2)堆栈从内存地址高位存储数据...存储: (1)引用类型变量只存储数据内存地址的引用,数据存储在托管堆中 (2)托管堆从内存地址低位存储数据 操作: (1)操作引用类型的引用数据的内存地址 //8.跳转语句break,continue,...return各有什么作用,分别适用什么环境 Break: 直接跳出当前的循环,从当前循环外面开始执行,忽略循环体中任何其他语句和循环条件测试。...Queue 队列:队列是一种先进先出的数据类型,常用操作有两种,分别是入列出列,入列元素添加到队尾,出列的元素从队头取出 5.

    73930

    C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托

    .NET/C#面试手册:基础语法 .NET/C#面试手册:面向对象 .NET/C#面试手册:集合、异常、泛型、LINQ、委托、EF!...将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。...泛型集合和ArrayList的装箱拆箱### 装箱:是指从值类型转换成引用类型 拆箱:是指从引用类型转换成值类型 下面的例子是借鉴官方的一段代码: System.Collections.ArrayList...参数是一个object类型,也就是说ArrayList添加任何引用类型或值类型都会隐士转换成Object,这个时候便发生装箱操作,在遍历检索它们时必须从object 类型转换成指定的类型,这个时候便发生拆箱操作...: “类型Product必须是不可以为NUll值得类型”,引用类型的默认值就是NULL,所以该房型方法的类型参数不能是引用类型,这就是使用类型参数约束的好处。

    3.3K30

    Unity性能调优手册10C#优化:GC,对象池,forforeach,string,LINQ

    New引用类型 首先,这是一个非常简单的GC.Alloc发生。...,但它在内部缓存以避免第二次GC.Alloc 然而,从代码安全性和可读性的角度来看,将所有变量和方法都设置为静态是不太容易接受的。...此外,一些LINQ方法针对调用者的类型进行了优化,因此GC的大小。根据调用者的类型分配更改。...使用LINQ时分配,如何减少分配,以及延迟评估的关键点。在本节中,我们将解释使用LINQ的标准。前提是LINQ是一个有用的语言特性,但它的使用将会与不使用脚本相比,脚本(c#)使堆分配和执行速度变差。...int y) { return x * y; } 另一方面,内联的缺点是代码大小会随着方法内进程的扩展而增加。

    2.1K11
    领券